@@ -92,32 +92,48 @@ type Match struct {
9292}
9393
9494func (v * VerificationRequest ) compareBytecodes (ctx context.Context , chainBytecode string , compiledOutput * SolcOutput ) (* Match , error ) {
95- recompileDeployCodeWithLibraries := addLibraryAddresses (compiledOutput .PickDeployedBytesCode (compiledOutput .CompileTarget , compiledOutput .ContractName ), chainBytecode ).Replaced
96- if util .TrimHex (recompileDeployCodeWithLibraries ) == util .TrimHex (chainBytecode ) {
97- return & Match {Status : perfect }, nil
98- }
99-
10095 trimmedChainBytecode := util .TrimHex (BytecodeWithoutMetadata (chainBytecode ))
101- trimmedWithLibraries := util .TrimHex (BytecodeWithoutMetadata (recompileDeployCodeWithLibraries ))
102- if trimmedChainBytecode == util .TrimHex (trimmedWithLibraries ) {
103- return & Match {Status : partial }, nil
104- }
96+ trimmedRawChainBytecode := util .TrimHex (chainBytecode )
97+ createData := ""
98+ fetchedCreateData := false
99+
100+ for compileTarget , contracts := range compiledOutput .Contracts {
101+ for contractName , contract := range contracts {
102+ recompileDeployCodeWithLibraries := addLibraryAddresses (contract .Evm .DeployedBytecode .Object , chainBytecode ).Replaced
103+ if util .TrimHex (recompileDeployCodeWithLibraries ) == trimmedRawChainBytecode {
104+ compiledOutput .CompileTarget = compileTarget
105+ compiledOutput .ContractName = contractName
106+ return & Match {Status : perfect }, nil
107+ }
105108
106- if len (trimmedChainBytecode ) == len (trimmedWithLibraries ) {
107- createData , err := fetchCreateBytecode (ctx , v .Address , v .Chain )
108- if err != nil {
109- return & Match {Status : mismatch }, fmt .Errorf ("fetch create bytecode failed: please retry later" )
110- }
109+ trimmedWithLibraries := util .TrimHex (BytecodeWithoutMetadata (recompileDeployCodeWithLibraries ))
110+ if trimmedChainBytecode == trimmedWithLibraries {
111+ compiledOutput .CompileTarget = compileTarget
112+ compiledOutput .ContractName = contractName
113+ return & Match {Status : partial }, nil
114+ }
111115
112- createData = util .TrimHex (createData )
113- if len (createData ) > 0 {
114- recompileBytesCodeWithLibraries := addLibraryAddresses (compiledOutput .PickBytesCode (compiledOutput .CompileTarget , compiledOutput .ContractName ), createData ).Replaced
115- encodedConstructorArgs := extractEncodedConstructorArgs (createData , recompileBytesCodeWithLibraries )
116- if strings .HasPrefix (createData , BytecodeWithoutMetadata (recompileBytesCodeWithLibraries )) {
117- return & Match {Status : perfect , ConstructorArgs : encodedConstructorArgs }, nil
116+ if len (trimmedChainBytecode ) == len (trimmedWithLibraries ) {
117+ if ! fetchedCreateData {
118+ var err error
119+ createData , err = fetchCreateBytecode (ctx , v .Address , v .Chain )
120+ if err != nil {
121+ return & Match {Status : mismatch }, fmt .Errorf ("fetch create bytecode failed: please retry later" )
122+ }
123+ createData = util .TrimHex (createData )
124+ fetchedCreateData = true
125+ }
126+ if len (createData ) > 0 {
127+ recompileBytesCodeWithLibraries := addLibraryAddresses (contract .Evm .Bytecode .Object , createData ).Replaced
128+ encodedConstructorArgs := extractEncodedConstructorArgs (createData , recompileBytesCodeWithLibraries )
129+ if strings .HasPrefix (createData , BytecodeWithoutMetadata (recompileBytesCodeWithLibraries )) {
130+ compiledOutput .CompileTarget = compileTarget
131+ compiledOutput .ContractName = contractName
132+ return & Match {Status : perfect , ConstructorArgs : encodedConstructorArgs }, nil
133+ }
134+ }
118135 }
119136 }
120-
121137 }
122138 return & Match {Status : mismatch }, nil
123139}
0 commit comments