github.com/ava-labs/subnet-evm@v0.6.4/accounts/abi/bind/bind_test.go (about) 1 // (c) 2019-2020, Ava Labs, Inc. 2 // 3 // This file is a derived work, based on the go-ethereum library whose original 4 // notices appear below. 5 // 6 // It is distributed under a license compatible with the licensing terms of the 7 // original code from which it is derived. 8 // 9 // Much love to the original authors for their work. 10 // ********** 11 // Copyright 2016 The go-ethereum Authors 12 // This file is part of the go-ethereum library. 13 // 14 // The go-ethereum library is free software: you can redistribute it and/or modify 15 // it under the terms of the GNU Lesser General Public License as published by 16 // the Free Software Foundation, either version 3 of the License, or 17 // (at your option) any later version. 18 // 19 // The go-ethereum library is distributed in the hope that it will be useful, 20 // but WITHOUT ANY WARRANTY; without even the implied warranty of 21 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 // GNU Lesser General Public License for more details. 23 // 24 // You should have received a copy of the GNU Lesser General Public License 25 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 26 27 package bind 28 29 import ( 30 "fmt" 31 "os" 32 "os/exec" 33 "path/filepath" 34 "runtime" 35 "strings" 36 "testing" 37 38 "github.com/ethereum/go-ethereum/common" 39 ) 40 41 var bindTests = []struct { 42 name string 43 contract string 44 bytecode []string 45 abi []string 46 imports string 47 tester string 48 fsigs []map[string]string 49 libs map[string]string 50 aliases map[string]string 51 types []string 52 }{ 53 // Test that the binding is available in combined and separate forms too 54 { 55 `Empty`, 56 `contract NilContract {}`, 57 []string{`606060405260068060106000396000f3606060405200`}, 58 []string{`[]`}, 59 `"github.com/ethereum/go-ethereum/common"`, 60 ` 61 if b, err := NewEmpty(common.Address{}, nil); b == nil || err != nil { 62 t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil) 63 } 64 if b, err := NewEmptyCaller(common.Address{}, nil); b == nil || err != nil { 65 t.Fatalf("caller binding (%v) nil or error (%v) not nil", b, nil) 66 } 67 if b, err := NewEmptyTransactor(common.Address{}, nil); b == nil || err != nil { 68 t.Fatalf("transactor binding (%v) nil or error (%v) not nil", b, nil) 69 } 70 `, 71 nil, 72 nil, 73 nil, 74 nil, 75 }, 76 // Test that all the official sample contracts bind correctly 77 { 78 `Token`, 79 `https://ethereum.org/token`, 80 []string{`60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`}, 81 []string{`[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"spentAllowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"decimalUnits","type":"uint8"},{"name":"tokenSymbol","type":"string"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]`}, 82 `"github.com/ethereum/go-ethereum/common"`, 83 ` 84 if b, err := NewToken(common.Address{}, nil); b == nil || err != nil { 85 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) 86 } 87 `, 88 nil, 89 nil, 90 nil, 91 nil, 92 }, 93 { 94 `Crowdsale`, 95 `https://ethereum.org/crowdsale`, 96 []string{`606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`}, 97 []string{`[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"deadline","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"fundingGoal","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funders","outputs":[{"name":"addr","type":"address"},{"name":"amount","type":"uint256"}],"type":"function"},{"inputs":[{"name":"ifSuccessfulSendTo","type":"address"},{"name":"fundingGoalInEthers","type":"uint256"},{"name":"durationInMinutes","type":"uint256"},{"name":"etherCostOfEachToken","type":"uint256"},{"name":"addressOfTokenUsedAsReward","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"backer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"isContribution","type":"bool"}],"name":"FundTransfer","type":"event"}]`}, 98 `"github.com/ethereum/go-ethereum/common"`, 99 ` 100 if b, err := NewCrowdsale(common.Address{}, nil); b == nil || err != nil { 101 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) 102 } 103 `, 104 nil, 105 nil, 106 nil, 107 nil, 108 }, 109 { 110 `DAO`, 111 `https://ethereum.org/dao`, 112 []string{`606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`}, 113 []string{`[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposals","outputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"description","type":"string"},{"name":"votingDeadline","type":"uint256"},{"name":"executed","type":"bool"},{"name":"proposalPassed","type":"bool"},{"name":"numberOfVotes","type":"uint256"},{"name":"currentResult","type":"int256"},{"name":"proposalHash","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"executeProposal","outputs":[{"name":"result","type":"int256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"memberId","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"numProposals","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"members","outputs":[{"name":"member","type":"address"},{"name":"canVote","type":"bool"},{"name":"name","type":"string"},{"name":"memberSince","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"debatingPeriodInMinutes","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"minimumQuorum","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"targetMember","type":"address"},{"name":"canVote","type":"bool"},{"name":"memberName","type":"string"}],"name":"changeMembership","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"majorityMargin","outputs":[{"name":"","type":"int256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"JobDescription","type":"string"},{"name":"transactionBytecode","type":"bytes"}],"name":"newProposal","outputs":[{"name":"proposalID","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"}],"name":"changeVotingRules","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"supportsProposal","type":"bool"},{"name":"justificationText","type":"string"}],"name":"vote","outputs":[{"name":"voteID","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"checkProposalCode","outputs":[{"name":"codeChecksOut","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"},{"name":"congressLeader","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"description","type":"string"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"position","type":"bool"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"justification","type":"string"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"result","type":"int256"},{"indexed":false,"name":"quorum","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"ProposalTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"member","type":"address"},{"indexed":false,"name":"isMember","type":"bool"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minimumQuorum","type":"uint256"},{"indexed":false,"name":"debatingPeriodInMinutes","type":"uint256"},{"indexed":false,"name":"majorityMargin","type":"int256"}],"name":"ChangeOfRules","type":"event"}]`}, 114 `"github.com/ethereum/go-ethereum/common"`, 115 ` 116 if b, err := NewDAO(common.Address{}, nil); b == nil || err != nil { 117 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) 118 } 119 `, 120 nil, 121 nil, 122 nil, 123 nil, 124 }, 125 // Test that named and anonymous inputs are handled correctly 126 { 127 `InputChecker`, ``, []string{``}, 128 []string{` 129 [ 130 {"type":"function","name":"noInput","constant":true,"inputs":[],"outputs":[]}, 131 {"type":"function","name":"namedInput","constant":true,"inputs":[{"name":"str","type":"string"}],"outputs":[]}, 132 {"type":"function","name":"anonInput","constant":true,"inputs":[{"name":"","type":"string"}],"outputs":[]}, 133 {"type":"function","name":"namedInputs","constant":true,"inputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}],"outputs":[]}, 134 {"type":"function","name":"anonInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"outputs":[]}, 135 {"type":"function","name":"mixedInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"str","type":"string"}],"outputs":[]} 136 ] 137 `}, 138 ` 139 "fmt" 140 141 "github.com/ethereum/go-ethereum/common" 142 `, 143 `if b, err := NewInputChecker(common.Address{}, nil); b == nil || err != nil { 144 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) 145 } else if false { // Don't run, just compile and test types 146 var err error 147 148 err = b.NoInput(nil) 149 err = b.NamedInput(nil, "") 150 err = b.AnonInput(nil, "") 151 err = b.NamedInputs(nil, "", "") 152 err = b.AnonInputs(nil, "", "") 153 err = b.MixedInputs(nil, "", "") 154 155 fmt.Println(err) 156 }`, 157 nil, 158 nil, 159 nil, 160 nil, 161 }, 162 // Test that named and anonymous outputs are handled correctly 163 { 164 `OutputChecker`, ``, []string{``}, 165 []string{` 166 [ 167 {"type":"function","name":"noOutput","constant":true,"inputs":[],"outputs":[]}, 168 {"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]}, 169 {"type":"function","name":"anonOutput","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"}]}, 170 {"type":"function","name":"namedOutputs","constant":true,"inputs":[],"outputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}]}, 171 {"type":"function","name":"collidingOutputs","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"},{"name":"Str","type":"string"}]}, 172 {"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]}, 173 {"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]} 174 ] 175 `}, 176 ` 177 "fmt" 178 179 "github.com/ethereum/go-ethereum/common" 180 `, 181 `if b, err := NewOutputChecker(common.Address{}, nil); b == nil || err != nil { 182 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) 183 } else if false { // Don't run, just compile and test types 184 var str1, str2 string 185 var err error 186 187 err = b.NoOutput(nil) 188 str1, err = b.NamedOutput(nil) 189 str1, err = b.AnonOutput(nil) 190 res, _ := b.NamedOutputs(nil) 191 str1, str2, err = b.CollidingOutputs(nil) 192 str1, str2, err = b.AnonOutputs(nil) 193 str1, str2, err = b.MixedOutputs(nil) 194 195 fmt.Println(str1, str2, res.Str1, res.Str2, err) 196 }`, 197 nil, 198 nil, 199 nil, 200 nil, 201 }, 202 // Tests that named, anonymous and indexed events are handled correctly 203 { 204 `EventChecker`, ``, []string{``}, 205 []string{` 206 [ 207 {"type":"event","name":"empty","inputs":[]}, 208 {"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]}, 209 {"type":"event","name":"mixed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256"}]}, 210 {"type":"event","name":"anonymous","anonymous":true,"inputs":[]}, 211 {"type":"event","name":"dynamic","inputs":[{"name":"idxStr","type":"string","indexed":true},{"name":"idxDat","type":"bytes","indexed":true},{"name":"str","type":"string"},{"name":"dat","type":"bytes"}]}, 212 {"type":"event","name":"unnamed","inputs":[{"name":"","type":"uint256","indexed": true},{"name":"","type":"uint256","indexed":true}]} 213 ] 214 `}, 215 ` 216 "fmt" 217 "math/big" 218 "reflect" 219 220 "github.com/ethereum/go-ethereum/common" 221 `, 222 `if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil { 223 t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil) 224 } else if false { // Don't run, just compile and test types 225 var ( 226 err error 227 res bool 228 str string 229 dat []byte 230 hash common.Hash 231 ) 232 _, err = e.FilterEmpty(nil) 233 _, err = e.FilterIndexed(nil, []common.Address{}, []*big.Int{}) 234 235 mit, err := e.FilterMixed(nil, []common.Address{}) 236 237 res = mit.Next() // Make sure the iterator has a Next method 238 err = mit.Error() // Make sure the iterator has an Error method 239 err = mit.Close() // Make sure the iterator has a Close method 240 241 fmt.Println(mit.Event.Raw.BlockHash) // Make sure the raw log is contained within the results 242 fmt.Println(mit.Event.Num) // Make sure the unpacked non-indexed fields are present 243 fmt.Println(mit.Event.Addr) // Make sure the reconstructed indexed fields are present 244 245 dit, err := e.FilterDynamic(nil, []string{}, [][]byte{}) 246 247 str = dit.Event.Str // Make sure non-indexed strings retain their type 248 dat = dit.Event.Dat // Make sure non-indexed bytes retain their type 249 hash = dit.Event.IdxStr // Make sure indexed strings turn into hashes 250 hash = dit.Event.IdxDat // Make sure indexed bytes turn into hashes 251 252 sink := make(chan *EventCheckerMixed) 253 sub, err := e.WatchMixed(nil, sink, []common.Address{}) 254 defer sub.Unsubscribe() 255 256 event := <-sink 257 fmt.Println(event.Raw.BlockHash) // Make sure the raw log is contained within the results 258 fmt.Println(event.Num) // Make sure the unpacked non-indexed fields are present 259 fmt.Println(event.Addr) // Make sure the reconstructed indexed fields are present 260 261 fmt.Println(res, str, dat, hash, err) 262 263 oit, err := e.FilterUnnamed(nil, []*big.Int{}, []*big.Int{}) 264 265 arg0 := oit.Event.Arg0 // Make sure unnamed arguments are handled correctly 266 arg1 := oit.Event.Arg1 // Make sure unnamed arguments are handled correctly 267 fmt.Println(arg0, arg1) 268 } 269 // Run a tiny reflection test to ensure disallowed methods don't appear 270 if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok { 271 t.Errorf("binding has disallowed method (FilterAnonymous)") 272 }`, 273 nil, 274 nil, 275 nil, 276 nil, 277 }, 278 // Test that contract interactions (deploy, transact and call) generate working code 279 { 280 `Interactor`, 281 ` 282 contract Interactor { 283 string public deployString; 284 string public transactString; 285 286 function Interactor(string str) { 287 deployString = str; 288 } 289 290 function transact(string str) { 291 transactString = str; 292 } 293 } 294 `, 295 []string{`6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`}, 296 []string{`[{"constant":true,"inputs":[],"name":"transactString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[],"name":"deployString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"transact","outputs":[],"type":"function"},{"inputs":[{"name":"str","type":"string"}],"type":"constructor"}]`}, 297 ` 298 "math/big" 299 300 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 301 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 302 "github.com/ava-labs/subnet-evm/core" 303 "github.com/ethereum/go-ethereum/crypto" 304 `, 305 ` 306 // Generate a new random account and a funded simulator 307 key, _ := crypto.GenerateKey() 308 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 309 310 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 311 defer sim.Close() 312 313 // Deploy an interaction tester contract and call a transaction on it 314 _, _, interactor, err := DeployInteractor(auth, sim, "Deploy string") 315 if err != nil { 316 t.Fatalf("Failed to deploy interactor contract: %v", err) 317 } 318 if _, err := interactor.Transact(auth, "Transact string"); err != nil { 319 t.Fatalf("Failed to transact with interactor contract: %v", err) 320 } 321 // Commit all pending transactions in the simulator and check the contract state 322 sim.Commit(false) 323 324 if str, err := interactor.DeployString(nil); err != nil { 325 t.Fatalf("Failed to retrieve deploy string: %v", err) 326 } else if str != "Deploy string" { 327 t.Fatalf("Deploy string mismatch: have '%s', want 'Deploy string'", str) 328 } 329 if str, err := interactor.TransactString(nil); err != nil { 330 t.Fatalf("Failed to retrieve transact string: %v", err) 331 } else if str != "Transact string" { 332 t.Fatalf("Transact string mismatch: have '%s', want 'Transact string'", str) 333 } 334 `, 335 nil, 336 nil, 337 nil, 338 nil, 339 }, 340 // Tests that plain values can be properly returned and deserialized 341 { 342 `Getter`, 343 ` 344 contract Getter { 345 function getter() constant returns (string, int, bytes32) { 346 return ("Hi", 1, sha3("")); 347 } 348 } 349 `, 350 []string{`606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`}, 351 []string{`[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`}, 352 ` 353 "math/big" 354 355 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 356 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 357 "github.com/ava-labs/subnet-evm/core" 358 "github.com/ethereum/go-ethereum/crypto" 359 `, 360 ` 361 // Generate a new random account and a funded simulator 362 key, _ := crypto.GenerateKey() 363 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 364 365 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 366 defer sim.Close() 367 368 // Deploy a tuple tester contract and execute a structured call on it 369 _, _, getter, err := DeployGetter(auth, sim) 370 if err != nil { 371 t.Fatalf("Failed to deploy getter contract: %v", err) 372 } 373 sim.Commit(false) 374 375 if str, num, _, err := getter.Getter(nil); err != nil { 376 t.Fatalf("Failed to call anonymous field retriever: %v", err) 377 } else if str != "Hi" || num.Cmp(big.NewInt(1)) != 0 { 378 t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", str, num, "Hi", 1) 379 } 380 `, 381 nil, 382 nil, 383 nil, 384 nil, 385 }, 386 // Tests that tuples can be properly returned and deserialized 387 { 388 `Tupler`, 389 ` 390 contract Tupler { 391 function tuple() constant returns (string a, int b, bytes32 c) { 392 return ("Hi", 1, sha3("")); 393 } 394 } 395 `, 396 []string{`606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`}, 397 []string{`[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`}, 398 ` 399 "math/big" 400 401 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 402 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 403 "github.com/ava-labs/subnet-evm/core" 404 "github.com/ethereum/go-ethereum/crypto" 405 `, 406 ` 407 // Generate a new random account and a funded simulator 408 key, _ := crypto.GenerateKey() 409 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 410 411 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 412 defer sim.Close() 413 414 // Deploy a tuple tester contract and execute a structured call on it 415 _, _, tupler, err := DeployTupler(auth, sim) 416 if err != nil { 417 t.Fatalf("Failed to deploy tupler contract: %v", err) 418 } 419 sim.Commit(false) 420 421 if res, err := tupler.Tuple(nil); err != nil { 422 t.Fatalf("Failed to call structure retriever: %v", err) 423 } else if res.A != "Hi" || res.B.Cmp(big.NewInt(1)) != 0 { 424 t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", res.A, res.B, "Hi", 1) 425 } 426 `, 427 nil, 428 nil, 429 nil, 430 nil, 431 }, 432 // Tests that arrays/slices can be properly returned and deserialized. 433 // Only addresses are tested, remainder just compiled to keep the test small. 434 { 435 `Slicer`, 436 ` 437 contract Slicer { 438 function echoAddresses(address[] input) constant returns (address[] output) { 439 return input; 440 } 441 function echoInts(int[] input) constant returns (int[] output) { 442 return input; 443 } 444 function echoFancyInts(uint24[23] input) constant returns (uint24[23] output) { 445 return input; 446 } 447 function echoBools(bool[] input) constant returns (bool[] output) { 448 return input; 449 } 450 } 451 `, 452 []string{`606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`}, 453 []string{`[{"constant":true,"inputs":[{"name":"input","type":"address[]"}],"name":"echoAddresses","outputs":[{"name":"output","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"uint24[23]"}],"name":"echoFancyInts","outputs":[{"name":"output","type":"uint24[23]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"int256[]"}],"name":"echoInts","outputs":[{"name":"output","type":"int256[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"bool[]"}],"name":"echoBools","outputs":[{"name":"output","type":"bool[]"}],"type":"function"}]`}, 454 ` 455 "math/big" 456 "reflect" 457 458 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 459 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 460 "github.com/ethereum/go-ethereum/common" 461 "github.com/ava-labs/subnet-evm/core" 462 "github.com/ethereum/go-ethereum/crypto" 463 `, 464 ` 465 // Generate a new random account and a funded simulator 466 key, _ := crypto.GenerateKey() 467 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 468 469 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 470 defer sim.Close() 471 472 // Deploy a slice tester contract and execute a n array call on it 473 _, _, slicer, err := DeploySlicer(auth, sim) 474 if err != nil { 475 t.Fatalf("Failed to deploy slicer contract: %v", err) 476 } 477 sim.Commit(false) 478 479 if out, err := slicer.EchoAddresses(nil, []common.Address{auth.From, common.Address{}}); err != nil { 480 t.Fatalf("Failed to call slice echoer: %v", err) 481 } else if !reflect.DeepEqual(out, []common.Address{auth.From, common.Address{}}) { 482 t.Fatalf("Slice return mismatch: have %v, want %v", out, []common.Address{auth.From, common.Address{}}) 483 } 484 `, 485 nil, 486 nil, 487 nil, 488 nil, 489 }, 490 // Tests that anonymous default methods can be correctly invoked 491 { 492 `Defaulter`, 493 ` 494 contract Defaulter { 495 address public caller; 496 497 function() { 498 caller = msg.sender; 499 } 500 } 501 `, 502 []string{`6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`}, 503 []string{`[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`}, 504 ` 505 "math/big" 506 507 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 508 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 509 "github.com/ava-labs/subnet-evm/core" 510 "github.com/ethereum/go-ethereum/crypto" 511 `, 512 ` 513 // Generate a new random account and a funded simulator 514 key, _ := crypto.GenerateKey() 515 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 516 517 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 518 defer sim.Close() 519 520 // Deploy a default method invoker contract and execute its default method 521 _, _, defaulter, err := DeployDefaulter(auth, sim) 522 if err != nil { 523 t.Fatalf("Failed to deploy defaulter contract: %v", err) 524 } 525 if _, err := (&DefaulterRaw{defaulter}).Transfer(auth); err != nil { 526 t.Fatalf("Failed to invoke default method: %v", err) 527 } 528 sim.Commit(false) 529 530 if caller, err := defaulter.Caller(nil); err != nil { 531 t.Fatalf("Failed to call address retriever: %v", err) 532 } else if (caller != auth.From) { 533 t.Fatalf("Address mismatch: have %v, want %v", caller, auth.From) 534 } 535 `, 536 nil, 537 nil, 538 nil, 539 nil, 540 }, 541 // Tests that structs are correctly unpacked 542 { 543 544 `Structs`, 545 ` 546 pragma solidity ^0.6.5; 547 pragma experimental ABIEncoderV2; 548 contract Structs { 549 struct A { 550 bytes32 B; 551 } 552 553 function F() public view returns (A[] memory a, uint256[] memory c, bool[] memory d) { 554 A[] memory a = new A[](2); 555 a[0].B = bytes32(uint256(1234) << 96); 556 uint256[] memory c; 557 bool[] memory d; 558 return (a, c, d); 559 } 560 561 function G() public view returns (A[] memory a) { 562 A[] memory a = new A[](2); 563 a[0].B = bytes32(uint256(1234) << 96); 564 return a; 565 } 566 } 567 `, 568 []string{`608060405234801561001057600080fd5b50610278806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806328811f591461003b5780636fecb6231461005b575b600080fd5b610043610070565b604051610052939291906101a0565b60405180910390f35b6100636100d6565b6040516100529190610186565b604080516002808252606082810190935282918291829190816020015b610095610131565b81526020019060019003908161008d575050805190915061026960611b9082906000906100be57fe5b60209081029190910101515293606093508392509050565b6040805160028082526060828101909352829190816020015b6100f7610131565b8152602001906001900390816100ef575050805190915061026960611b90829060009061012057fe5b602090810291909101015152905090565b60408051602081019091526000815290565b815260200190565b6000815180845260208085019450808401835b8381101561017b578151518752958201959082019060010161015e565b509495945050505050565b600060208252610199602083018461014b565b9392505050565b6000606082526101b3606083018661014b565b6020838203818501528186516101c98185610239565b91508288019350845b818110156101f3576101e5838651610143565b9484019492506001016101d2565b505084810360408601528551808252908201925081860190845b8181101561022b57825115158552938301939183019160010161020d565b509298975050505050505050565b9081526020019056fea2646970667358221220eb85327e285def14230424c52893aebecec1e387a50bb6b75fc4fdbed647f45f64736f6c63430006050033`}, 569 []string{`[{"inputs":[],"name":"F","outputs":[{"components":[{"internalType":"bytes32","name":"B","type":"bytes32"}],"internalType":"structStructs.A[]","name":"a","type":"tuple[]"},{"internalType":"uint256[]","name":"c","type":"uint256[]"},{"internalType":"bool[]","name":"d","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"G","outputs":[{"components":[{"internalType":"bytes32","name":"B","type":"bytes32"}],"internalType":"structStructs.A[]","name":"a","type":"tuple[]"}],"stateMutability":"view","type":"function"}]`}, 570 ` 571 "math/big" 572 573 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 574 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 575 "github.com/ava-labs/subnet-evm/core" 576 "github.com/ethereum/go-ethereum/crypto" 577 `, 578 ` 579 // Generate a new random account and a funded simulator 580 key, _ := crypto.GenerateKey() 581 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 582 583 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 584 defer sim.Close() 585 586 // Deploy a structs method invoker contract and execute its default method 587 _, _, structs, err := DeployStructs(auth, sim) 588 if err != nil { 589 t.Fatalf("Failed to deploy defaulter contract: %v", err) 590 } 591 sim.Commit(false) 592 opts := bind.CallOpts{} 593 if _, err := structs.F(&opts); err != nil { 594 t.Fatalf("Failed to invoke F method: %v", err) 595 } 596 if _, err := structs.G(&opts); err != nil { 597 t.Fatalf("Failed to invoke G method: %v", err) 598 } 599 `, 600 nil, 601 nil, 602 nil, 603 nil, 604 }, 605 // Tests that non-existent contracts are reported as such (though only simulator test) 606 { 607 `NonExistent`, 608 ` 609 contract NonExistent { 610 function String() constant returns(string) { 611 return "I don't exist"; 612 } 613 } 614 `, 615 []string{`6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`}, 616 []string{`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`}, 617 ` 618 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 619 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 620 "github.com/ethereum/go-ethereum/common" 621 "github.com/ava-labs/subnet-evm/core" 622 `, 623 ` 624 // Create a simulator and wrap a non-deployed contract 625 626 sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000)) 627 defer sim.Close() 628 629 nonexistent, err := NewNonExistent(common.Address{}, sim) 630 if err != nil { 631 t.Fatalf("Failed to access non-existent contract: %v", err) 632 } 633 // Ensure that contract calls fail with the appropriate error 634 if res, err := nonexistent.String(nil); err == nil { 635 t.Fatalf("Call succeeded on non-existent contract: %v", res) 636 } else if (err != bind.ErrNoCode) { 637 t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode) 638 } 639 `, 640 nil, 641 nil, 642 nil, 643 nil, 644 }, 645 { 646 `NonExistentStruct`, 647 ` 648 contract NonExistentStruct { 649 function Struct() public view returns(uint256 a, uint256 b) { 650 return (10, 10); 651 } 652 } 653 `, 654 []string{`6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d5f6622514602d575b600080fd5b6033604c565b6040805192835260208301919091528051918290030190f35b600a809156fea264697066735822beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef64736f6c6343decafe0033`}, 655 []string{`[{"inputs":[],"name":"Struct","outputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"stateMutability":"pure","type":"function"}]`}, 656 ` 657 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 658 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 659 "github.com/ethereum/go-ethereum/common" 660 "github.com/ava-labs/subnet-evm/core" 661 `, 662 ` 663 // Create a simulator and wrap a non-deployed contract 664 665 sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000)) 666 defer sim.Close() 667 668 nonexistent, err := NewNonExistentStruct(common.Address{}, sim) 669 if err != nil { 670 t.Fatalf("Failed to access non-existent contract: %v", err) 671 } 672 // Ensure that contract calls fail with the appropriate error 673 if res, err := nonexistent.Struct(nil); err == nil { 674 t.Fatalf("Call succeeded on non-existent contract: %v", res) 675 } else if (err != bind.ErrNoCode) { 676 t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode) 677 } 678 `, 679 nil, 680 nil, 681 nil, 682 nil, 683 }, 684 // Tests that gas estimation works for contracts with weird gas mechanics too. 685 { 686 `FunkyGasPattern`, 687 ` 688 contract FunkyGasPattern { 689 string public field; 690 691 function SetField(string value) { 692 // This check will screw gas estimation! Good, good! 693 if (msg.gas < 100000) { 694 throw; 695 } 696 field = value; 697 } 698 } 699 `, 700 []string{`606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`}, 701 []string{`[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`}, 702 ` 703 "math/big" 704 705 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 706 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 707 "github.com/ava-labs/subnet-evm/core" 708 "github.com/ethereum/go-ethereum/crypto" 709 `, 710 ` 711 // Generate a new random account and a funded simulator 712 key, _ := crypto.GenerateKey() 713 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 714 715 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 716 defer sim.Close() 717 718 // Deploy a funky gas pattern contract 719 _, _, limiter, err := DeployFunkyGasPattern(auth, sim) 720 if err != nil { 721 t.Fatalf("Failed to deploy funky contract: %v", err) 722 } 723 sim.Commit(false) 724 725 // Set the field with automatic estimation and check that it succeeds 726 if _, err := limiter.SetField(auth, "automatic"); err != nil { 727 t.Fatalf("Failed to call automatically gased transaction: %v", err) 728 } 729 sim.Commit(false) 730 731 if field, _ := limiter.Field(nil); field != "automatic" { 732 t.Fatalf("Field mismatch: have %v, want %v", field, "automatic") 733 } 734 `, 735 nil, 736 nil, 737 nil, 738 nil, 739 }, 740 // Test that constant functions can be called from an (optional) specified address 741 { 742 `CallFrom`, 743 ` 744 contract CallFrom { 745 function callFrom() constant returns(address) { 746 return msg.sender; 747 } 748 } 749 `, []string{`6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`}, 750 []string{`[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`}, 751 ` 752 "math/big" 753 754 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 755 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 756 "github.com/ethereum/go-ethereum/common" 757 "github.com/ava-labs/subnet-evm/core" 758 "github.com/ethereum/go-ethereum/crypto" 759 `, 760 ` 761 // Generate a new random account and a funded simulator 762 key, _ := crypto.GenerateKey() 763 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 764 765 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 766 defer sim.Close() 767 768 // Deploy a sender tester contract and execute a structured call on it 769 _, _, callfrom, err := DeployCallFrom(auth, sim) 770 if err != nil { 771 t.Fatalf("Failed to deploy sender contract: %v", err) 772 } 773 sim.Commit(false) 774 775 if res, err := callfrom.CallFrom(nil); err != nil { 776 t.Errorf("Failed to call constant function: %v", err) 777 } else if res != (common.Address{}) { 778 t.Errorf("Invalid address returned, want: %x, got: %x", (common.Address{}), res) 779 } 780 781 for _, addr := range []common.Address{common.Address{}, common.Address{1}, common.Address{2}} { 782 if res, err := callfrom.CallFrom(&bind.CallOpts{From: addr}); err != nil { 783 t.Fatalf("Failed to call constant function: %v", err) 784 } else if res != addr { 785 t.Fatalf("Invalid address returned, want: %x, got: %x", addr, res) 786 } 787 } 788 `, 789 nil, 790 nil, 791 nil, 792 nil, 793 }, 794 // Tests that methods and returns with underscores inside work correctly. 795 { 796 `Underscorer`, 797 ` 798 contract Underscorer { 799 function UnderscoredOutput() constant returns (int _int, string _string) { 800 return (314, "pi"); 801 } 802 function LowerLowerCollision() constant returns (int _res, int res) { 803 return (1, 2); 804 } 805 function LowerUpperCollision() constant returns (int _res, int Res) { 806 return (1, 2); 807 } 808 function UpperLowerCollision() constant returns (int _Res, int res) { 809 return (1, 2); 810 } 811 function UpperUpperCollision() constant returns (int _Res, int Res) { 812 return (1, 2); 813 } 814 function PurelyUnderscoredOutput() constant returns (int _, int res) { 815 return (1, 2); 816 } 817 function AllPurelyUnderscoredOutput() constant returns (int _, int __) { 818 return (1, 2); 819 } 820 function _under_scored_func() constant returns (int _int) { 821 return 0; 822 } 823 } 824 `, []string{`6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`}, 825 []string{`[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_under_scored_func","outputs":[{"name":"_int","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`}, 826 ` 827 "fmt" 828 "math/big" 829 830 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 831 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 832 "github.com/ava-labs/subnet-evm/core" 833 "github.com/ethereum/go-ethereum/crypto" 834 `, 835 ` 836 // Generate a new random account and a funded simulator 837 key, _ := crypto.GenerateKey() 838 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 839 840 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 841 defer sim.Close() 842 843 // Deploy a underscorer tester contract and execute a structured call on it 844 _, _, underscorer, err := DeployUnderscorer(auth, sim) 845 if err != nil { 846 t.Fatalf("Failed to deploy underscorer contract: %v", err) 847 } 848 sim.Commit(false) 849 850 // Verify that underscored return values correctly parse into structs 851 if res, err := underscorer.UnderscoredOutput(nil); err != nil { 852 t.Errorf("Failed to call constant function: %v", err) 853 } else if res.Int.Cmp(big.NewInt(314)) != 0 || res.String != "pi" { 854 t.Errorf("Invalid result, want: {314, \"pi\"}, got: %+v", res) 855 } 856 // Verify that underscored and non-underscored name collisions force tuple outputs 857 var a, b *big.Int 858 859 a, b, _ = underscorer.LowerLowerCollision(nil) 860 a, b, _ = underscorer.LowerUpperCollision(nil) 861 a, b, _ = underscorer.UpperLowerCollision(nil) 862 a, b, _ = underscorer.UpperUpperCollision(nil) 863 a, b, _ = underscorer.PurelyUnderscoredOutput(nil) 864 a, b, _ = underscorer.AllPurelyUnderscoredOutput(nil) 865 a, _ = underscorer.UnderScoredFunc(nil) 866 867 fmt.Println(a, b, err) 868 `, 869 nil, 870 nil, 871 nil, 872 nil, 873 }, 874 // Tests that logs can be successfully filtered and decoded. 875 { 876 `Eventer`, 877 ` 878 contract Eventer { 879 event SimpleEvent ( 880 address indexed Addr, 881 bytes32 indexed Id, 882 bool indexed Flag, 883 uint Value 884 ); 885 function raiseSimpleEvent(address addr, bytes32 id, bool flag, uint value) { 886 SimpleEvent(addr, id, flag, value); 887 } 888 889 event NodataEvent ( 890 uint indexed Number, 891 int16 indexed Short, 892 uint32 indexed Long 893 ); 894 function raiseNodataEvent(uint number, int16 short, uint32 long) { 895 NodataEvent(number, short, long); 896 } 897 898 event DynamicEvent ( 899 string indexed IndexedString, 900 bytes indexed IndexedBytes, 901 string NonIndexedString, 902 bytes NonIndexedBytes 903 ); 904 function raiseDynamicEvent(string str, bytes blob) { 905 DynamicEvent(str, blob, str, blob); 906 } 907 908 event FixedBytesEvent ( 909 bytes24 indexed IndexedBytes, 910 bytes24 NonIndexedBytes 911 ); 912 function raiseFixedBytesEvent(bytes24 blob) { 913 FixedBytesEvent(blob, blob); 914 } 915 } 916 `, 917 []string{`608060405234801561001057600080fd5b5061043f806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663528300ff8114610066578063630c31e2146100ff5780636cc6b94014610138578063c7d116dd1461015b575b600080fd5b34801561007257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100fd94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506101829650505050505050565b005b34801561010b57600080fd5b506100fd73ffffffffffffffffffffffffffffffffffffffff60043516602435604435151560643561033c565b34801561014457600080fd5b506100fd67ffffffffffffffff1960043516610394565b34801561016757600080fd5b506100fd60043560243560010b63ffffffff604435166103d6565b806040518082805190602001908083835b602083106101b25780518252601f199092019160209182019101610193565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955087945090928392508401908083835b6020831061020b5780518252601f1990920191602091820191016101ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561029c578181015183820152602001610284565b50505050905090810190601f1680156102c95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102fc5781810151838201526020016102e4565b50505050905090810190601f1680156103295780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b60408051828152905183151591859173ffffffffffffffffffffffffffffffffffffffff8816917f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8919081900360200190a450505050565b6040805167ffffffffffffffff19831680825291517fcdc4c1b1aed5524ffb4198d7a5839a34712baef5fa06884fac7559f4a5854e0a9181900360200190a250565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820468b5843bf653145bd924b323c64ef035d3dd922c170644b44d61aa666ea6eee0029`}, 918 []string{`[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"blob","type":"bytes24"}],"name":"raiseFixedBytesEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedBytes","type":"bytes24"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes24"}],"name":"FixedBytesEvent","type":"event"}]`}, 919 ` 920 "math/big" 921 "time" 922 923 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 924 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 925 "github.com/ethereum/go-ethereum/common" 926 "github.com/ava-labs/subnet-evm/core" 927 "github.com/ethereum/go-ethereum/crypto" 928 `, 929 ` 930 // Generate a new random account and a funded simulator 931 key, _ := crypto.GenerateKey() 932 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 933 934 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 935 defer sim.Close() 936 937 // Deploy an eventer contract 938 _, _, eventer, err := DeployEventer(auth, sim) 939 if err != nil { 940 t.Fatalf("Failed to deploy eventer contract: %v", err) 941 } 942 sim.Commit(false) 943 944 // Inject a few events into the contract, gradually more in each block 945 for i := 1; i <= 3; i++ { 946 for j := 1; j <= i; j++ { 947 if _, err := eventer.RaiseSimpleEvent(auth, common.Address{byte(j)}, [32]byte{byte(j)}, true, big.NewInt(int64(10*i+j))); err != nil { 948 t.Fatalf("block %d, event %d: raise failed: %v", i, j, err) 949 } 950 } 951 sim.Commit(false) 952 } 953 // Test filtering for certain events and ensure they can be found 954 sit, err := eventer.FilterSimpleEvent(nil, []common.Address{common.Address{1}, common.Address{3}}, [][32]byte{{byte(1)}, {byte(2)}, {byte(3)}}, []bool{true}) 955 if err != nil { 956 t.Fatalf("failed to filter for simple events: %v", err) 957 } 958 defer sit.Close() 959 960 sit.Next() 961 if sit.Event.Value.Uint64() != 11 || !sit.Event.Flag { 962 t.Errorf("simple log content mismatch: have %v, want {11, true}", sit.Event) 963 } 964 sit.Next() 965 if sit.Event.Value.Uint64() != 21 || !sit.Event.Flag { 966 t.Errorf("simple log content mismatch: have %v, want {21, true}", sit.Event) 967 } 968 sit.Next() 969 if sit.Event.Value.Uint64() != 31 || !sit.Event.Flag { 970 t.Errorf("simple log content mismatch: have %v, want {31, true}", sit.Event) 971 } 972 sit.Next() 973 if sit.Event.Value.Uint64() != 33 || !sit.Event.Flag { 974 t.Errorf("simple log content mismatch: have %v, want {33, true}", sit.Event) 975 } 976 977 if sit.Next() { 978 t.Errorf("unexpected simple event found: %+v", sit.Event) 979 } 980 if err = sit.Error(); err != nil { 981 t.Fatalf("simple event iteration failed: %v", err) 982 } 983 // Test raising and filtering for an event with no data component 984 if _, err := eventer.RaiseNodataEvent(auth, big.NewInt(314), 141, 271); err != nil { 985 t.Fatalf("failed to raise nodata event: %v", err) 986 } 987 sim.Commit(false) 988 989 nit, err := eventer.FilterNodataEvent(nil, []*big.Int{big.NewInt(314)}, []int16{140, 141, 142}, []uint32{271}) 990 if err != nil { 991 t.Fatalf("failed to filter for nodata events: %v", err) 992 } 993 defer nit.Close() 994 995 if !nit.Next() { 996 t.Fatalf("nodata log not found: %v", nit.Error()) 997 } 998 if nit.Event.Number.Uint64() != 314 { 999 t.Errorf("nodata log content mismatch: have %v, want 314", nit.Event.Number) 1000 } 1001 if nit.Next() { 1002 t.Errorf("unexpected nodata event found: %+v", nit.Event) 1003 } 1004 if err = nit.Error(); err != nil { 1005 t.Fatalf("nodata event iteration failed: %v", err) 1006 } 1007 // Test raising and filtering for events with dynamic indexed components 1008 if _, err := eventer.RaiseDynamicEvent(auth, "Hello", []byte("World")); err != nil { 1009 t.Fatalf("failed to raise dynamic event: %v", err) 1010 } 1011 sim.Commit(false) 1012 1013 dit, err := eventer.FilterDynamicEvent(nil, []string{"Hi", "Hello", "Bye"}, [][]byte{[]byte("World")}) 1014 if err != nil { 1015 t.Fatalf("failed to filter for dynamic events: %v", err) 1016 } 1017 defer dit.Close() 1018 1019 if !dit.Next() { 1020 t.Fatalf("dynamic log not found: %v", dit.Error()) 1021 } 1022 if dit.Event.NonIndexedString != "Hello" || string(dit.Event.NonIndexedBytes) != "World" || dit.Event.IndexedString != common.HexToHash("0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2") || dit.Event.IndexedBytes != common.HexToHash("0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18") { 1023 t.Errorf("dynamic log content mismatch: have %v, want {'0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2, '0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18', 'Hello', 'World'}", dit.Event) 1024 } 1025 if dit.Next() { 1026 t.Errorf("unexpected dynamic event found: %+v", dit.Event) 1027 } 1028 if err = dit.Error(); err != nil { 1029 t.Fatalf("dynamic event iteration failed: %v", err) 1030 } 1031 // Test raising and filtering for events with fixed bytes components 1032 var fblob [24]byte 1033 copy(fblob[:], []byte("Fixed Bytes")) 1034 1035 if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil { 1036 t.Fatalf("failed to raise fixed bytes event: %v", err) 1037 } 1038 sim.Commit(false) 1039 1040 fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob}) 1041 if err != nil { 1042 t.Fatalf("failed to filter for fixed bytes events: %v", err) 1043 } 1044 defer fit.Close() 1045 1046 if !fit.Next() { 1047 t.Fatalf("fixed bytes log not found: %v", fit.Error()) 1048 } 1049 if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob { 1050 t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob) 1051 } 1052 if fit.Next() { 1053 t.Errorf("unexpected fixed bytes event found: %+v", fit.Event) 1054 } 1055 if err = fit.Error(); err != nil { 1056 t.Fatalf("fixed bytes event iteration failed: %v", err) 1057 } 1058 // Test subscribing to an event and raising it afterwards 1059 ch := make(chan *EventerSimpleEvent, 16) 1060 sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil) 1061 if err != nil { 1062 t.Fatalf("failed to subscribe to simple events: %v", err) 1063 } 1064 if _, err := eventer.RaiseSimpleEvent(auth, common.Address{255}, [32]byte{255}, true, big.NewInt(255)); err != nil { 1065 t.Fatalf("failed to raise subscribed simple event: %v", err) 1066 } 1067 sim.Commit(false) 1068 1069 select { 1070 case event := <-ch: 1071 if event.Value.Uint64() != 255 { 1072 t.Errorf("simple log content mismatch: have %v, want 255", event) 1073 } 1074 case <-time.After(250 * time.Millisecond): 1075 t.Fatalf("subscribed simple event didn't arrive") 1076 } 1077 // Unsubscribe from the event and make sure we're not delivered more 1078 sub.Unsubscribe() 1079 1080 if _, err := eventer.RaiseSimpleEvent(auth, common.Address{254}, [32]byte{254}, true, big.NewInt(254)); err != nil { 1081 t.Fatalf("failed to raise subscribed simple event: %v", err) 1082 } 1083 sim.Commit(false) 1084 1085 select { 1086 case event := <-ch: 1087 t.Fatalf("unsubscribed simple event arrived: %v", event) 1088 case <-time.After(250 * time.Millisecond): 1089 } 1090 `, 1091 nil, 1092 nil, 1093 nil, 1094 nil, 1095 }, 1096 { 1097 `DeeplyNestedArray`, 1098 ` 1099 contract DeeplyNestedArray { 1100 uint64[3][4][5] public deepUint64Array; 1101 function storeDeepUintArray(uint64[3][4][5] arr) public { 1102 deepUint64Array = arr; 1103 } 1104 function retrieveDeepArray() public view returns (uint64[3][4][5]) { 1105 return deepUint64Array; 1106 } 1107 } 1108 `, 1109 []string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`}, 1110 []string{`[{"constant":false,"inputs":[{"name":"arr","type":"uint64[3][4][5]"}],"name":"storeDeepUintArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"retrieveDeepArray","outputs":[{"name":"","type":"uint64[3][4][5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"deepUint64Array","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]`}, 1111 ` 1112 "math/big" 1113 1114 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1115 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1116 "github.com/ava-labs/subnet-evm/core" 1117 "github.com/ethereum/go-ethereum/crypto" 1118 `, 1119 ` 1120 // Generate a new random account and a funded simulator 1121 key, _ := crypto.GenerateKey() 1122 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1123 1124 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1125 defer sim.Close() 1126 1127 //deploy the test contract 1128 _, _, testContract, err := DeployDeeplyNestedArray(auth, sim) 1129 if err != nil { 1130 t.Fatalf("Failed to deploy test contract: %v", err) 1131 } 1132 1133 // Finish deploy. 1134 sim.Commit(false) 1135 1136 //Create coordinate-filled array, for testing purposes. 1137 testArr := [5][4][3]uint64{} 1138 for i := 0; i < 5; i++ { 1139 testArr[i] = [4][3]uint64{} 1140 for j := 0; j < 4; j++ { 1141 testArr[i][j] = [3]uint64{} 1142 for k := 0; k < 3; k++ { 1143 //pack the coordinates, each array value will be unique, and can be validated easily. 1144 testArr[i][j][k] = uint64(i) << 16 | uint64(j) << 8 | uint64(k) 1145 } 1146 } 1147 } 1148 1149 if _, err := testContract.StoreDeepUintArray(&bind.TransactOpts{ 1150 From: auth.From, 1151 Signer: auth.Signer, 1152 }, testArr); err != nil { 1153 t.Fatalf("Failed to store nested array in test contract: %v", err) 1154 } 1155 1156 sim.Commit(false) 1157 1158 retrievedArr, err := testContract.RetrieveDeepArray(&bind.CallOpts{ 1159 From: auth.From, 1160 Accepted: false, 1161 }) 1162 if err != nil { 1163 t.Fatalf("Failed to retrieve nested array from test contract: %v", err) 1164 } 1165 1166 //quick check to see if contents were copied 1167 // (See accounts/abi/unpack_test.go for more extensive testing) 1168 if retrievedArr[4][3][2] != testArr[4][3][2] { 1169 t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err) 1170 } 1171 `, 1172 nil, 1173 nil, 1174 nil, 1175 nil, 1176 }, 1177 { 1178 `CallbackParam`, 1179 ` 1180 contract FunctionPointerTest { 1181 function test(function(uint256) external callback) external { 1182 callback(1); 1183 } 1184 } 1185 `, 1186 []string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`}, 1187 []string{`[ 1188 { 1189 "constant": false, 1190 "inputs": [ 1191 { 1192 "name": "callback", 1193 "type": "function" 1194 } 1195 ], 1196 "name": "test", 1197 "outputs": [], 1198 "payable": false, 1199 "stateMutability": "nonpayable", 1200 "type": "function" 1201 } 1202 ]`}, ` 1203 "strings" 1204 `, 1205 ` 1206 if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 { 1207 t.Fatalf("") 1208 } 1209 `, 1210 []map[string]string{ 1211 { 1212 "test(function)": "d7a5aba2", 1213 }, 1214 }, 1215 nil, 1216 nil, 1217 nil, 1218 }, { 1219 `Tuple`, 1220 ` 1221 pragma solidity >=0.4.19 <0.6.0; 1222 pragma experimental ABIEncoderV2; 1223 1224 contract Tuple { 1225 struct S { uint a; uint[] b; T[] c; } 1226 struct T { uint x; uint y; } 1227 struct P { uint8 x; uint8 y; } 1228 struct Q { uint16 x; uint16 y; } 1229 event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e); 1230 event TupleEvent2(P[]); 1231 1232 function func1(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public pure returns (S memory, T[2][] memory, T[][2] memory, S[] memory, uint[] memory) { 1233 return (a, b, c, d, e); 1234 } 1235 function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public { 1236 emit TupleEvent(a, b, c, d, e); 1237 } 1238 function func3(Q[] memory) public pure {} // call function, nothing to return 1239 } 1240 `, 1241 []string{`60806040523480156100115760006000fd5b50610017565b6110b2806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100465760003560e01c8063443c79b41461004c578063d0062cdd14610080578063e4d9a43b1461009c57610046565b60006000fd5b610066600480360361006191908101906107b8565b6100b8565b604051610077959493929190610ccb565b60405180910390f35b61009a600480360361009591908101906107b8565b6100ef565b005b6100b660048036036100b19190810190610775565b610136565b005b6100c061013a565b60606100ca61015e565b606060608989898989945094509450945094506100e2565b9550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd008585858585604051610126959493929190610ccb565b60405180910390a15b5050505050565b5b50565b60405180606001604052806000815260200160608152602001606081526020015090565b60405180604001604052806002905b606081526020019060019003908161016d57905050905661106e565b600082601f830112151561019d5760006000fd5b81356101b06101ab82610d6f565b610d41565b915081818352602084019350602081019050838560808402820111156101d65760006000fd5b60005b8381101561020757816101ec888261037a565b8452602084019350608083019250505b6001810190506101d9565b5050505092915050565b600082601f83011215156102255760006000fd5b600261023861023382610d98565b610d41565b9150818360005b83811015610270578135860161025588826103f3565b8452602084019350602083019250505b60018101905061023f565b5050505092915050565b600082601f830112151561028e5760006000fd5b81356102a161029c82610dbb565b610d41565b915081818352602084019350602081019050838560408402820111156102c75760006000fd5b60005b838110156102f857816102dd888261058b565b8452602084019350604083019250505b6001810190506102ca565b5050505092915050565b600082601f83011215156103165760006000fd5b813561032961032482610de4565b610d41565b9150818183526020840193506020810190508360005b83811015610370578135860161035588826105d8565b8452602084019350602083019250505b60018101905061033f565b5050505092915050565b600082601f830112151561038e5760006000fd5b60026103a161039c82610e0d565b610d41565b915081838560408402820111156103b85760006000fd5b60005b838110156103e957816103ce88826106fe565b8452602084019350604083019250505b6001810190506103bb565b5050505092915050565b600082601f83011215156104075760006000fd5b813561041a61041582610e30565b610d41565b915081818352602084019350602081019050838560408402820111156104405760006000fd5b60005b83811015610471578161045688826106fe565b8452602084019350604083019250505b600181019050610443565b5050505092915050565b600082601f830112151561048f5760006000fd5b81356104a261049d82610e59565b610d41565b915081818352602084019350602081019050838560208402820111156104c85760006000fd5b60005b838110156104f957816104de8882610760565b8452602084019350602083019250505b6001810190506104cb565b5050505092915050565b600082601f83011215156105175760006000fd5b813561052a61052582610e82565b610d41565b915081818352602084019350602081019050838560208402820111156105505760006000fd5b60005b8381101561058157816105668882610760565b8452602084019350602083019250505b600181019050610553565b5050505092915050565b60006040828403121561059e5760006000fd5b6105a86040610d41565b905060006105b88482850161074b565b60008301525060206105cc8482850161074b565b60208301525092915050565b6000606082840312156105eb5760006000fd5b6105f56060610d41565b9050600061060584828501610760565b600083015250602082013567ffffffffffffffff8111156106265760006000fd5b6106328482850161047b565b602083015250604082013567ffffffffffffffff8111156106535760006000fd5b61065f848285016103f3565b60408301525092915050565b60006060828403121561067e5760006000fd5b6106886060610d41565b9050600061069884828501610760565b600083015250602082013567ffffffffffffffff8111156106b95760006000fd5b6106c58482850161047b565b602083015250604082013567ffffffffffffffff8111156106e65760006000fd5b6106f2848285016103f3565b60408301525092915050565b6000604082840312156107115760006000fd5b61071b6040610d41565b9050600061072b84828501610760565b600083015250602061073f84828501610760565b60208301525092915050565b60008135905061075a8161103a565b92915050565b60008135905061076f81611054565b92915050565b6000602082840312156107885760006000fd5b600082013567ffffffffffffffff8111156107a35760006000fd5b6107af8482850161027a565b91505092915050565b6000600060006000600060a086880312156107d35760006000fd5b600086013567ffffffffffffffff8111156107ee5760006000fd5b6107fa8882890161066b565b955050602086013567ffffffffffffffff8111156108185760006000fd5b61082488828901610189565b945050604086013567ffffffffffffffff8111156108425760006000fd5b61084e88828901610211565b935050606086013567ffffffffffffffff81111561086c5760006000fd5b61087888828901610302565b925050608086013567ffffffffffffffff8111156108965760006000fd5b6108a288828901610503565b9150509295509295909350565b60006108bb8383610a6a565b60808301905092915050565b60006108d38383610ac2565b905092915050565b60006108e78383610c36565b905092915050565b60006108fb8383610c8d565b60408301905092915050565b60006109138383610cbc565b60208301905092915050565b600061092a82610f0f565b6109348185610fb7565b935061093f83610eab565b8060005b8381101561097157815161095788826108af565b975061096283610f5c565b9250505b600181019050610943565b5085935050505092915050565b600061098982610f1a565b6109938185610fc8565b9350836020820285016109a585610ebb565b8060005b858110156109e257848403895281516109c285826108c7565b94506109cd83610f69565b925060208a019950505b6001810190506109a9565b50829750879550505050505092915050565b60006109ff82610f25565b610a098185610fd3565b935083602082028501610a1b85610ec5565b8060005b85811015610a585784840389528151610a3885826108db565b9450610a4383610f76565b925060208a019950505b600181019050610a1f565b50829750879550505050505092915050565b610a7381610f30565b610a7d8184610fe4565b9250610a8882610ed5565b8060005b83811015610aba578151610aa087826108ef565b9650610aab83610f83565b9250505b600181019050610a8c565b505050505050565b6000610acd82610f3b565b610ad78185610fef565b9350610ae283610edf565b8060005b83811015610b14578151610afa88826108ef565b9750610b0583610f90565b9250505b600181019050610ae6565b5085935050505092915050565b6000610b2c82610f51565b610b368185611011565b9350610b4183610eff565b8060005b83811015610b73578151610b598882610907565b9750610b6483610faa565b9250505b600181019050610b45565b5085935050505092915050565b6000610b8b82610f46565b610b958185611000565b9350610ba083610eef565b8060005b83811015610bd2578151610bb88882610907565b9750610bc383610f9d565b9250505b600181019050610ba4565b5085935050505092915050565b6000606083016000830151610bf76000860182610cbc565b5060208301518482036020860152610c0f8282610b80565b91505060408301518482036040860152610c298282610ac2565b9150508091505092915050565b6000606083016000830151610c4e6000860182610cbc565b5060208301518482036020860152610c668282610b80565b91505060408301518482036040860152610c808282610ac2565b9150508091505092915050565b604082016000820151610ca36000850182610cbc565b506020820151610cb66020850182610cbc565b50505050565b610cc581611030565b82525050565b600060a0820190508181036000830152610ce58188610bdf565b90508181036020830152610cf9818761091f565b90508181036040830152610d0d818661097e565b90508181036060830152610d2181856109f4565b90508181036080830152610d358184610b21565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610d655760006000fd5b8060405250919050565b600067ffffffffffffffff821115610d875760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610db05760006000fd5b602082029050919050565b600067ffffffffffffffff821115610dd35760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610dfc5760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e255760006000fd5b602082029050919050565b600067ffffffffffffffff821115610e485760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e715760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e9a5760006000fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061ffff82169050919050565b6000819050919050565b61104381611022565b811415156110515760006000fd5b50565b61105d81611030565b8114151561106b5760006000fd5b50565bfea365627a7a72315820d78c6ba7ee332581e6c4d9daa5fc07941841230f7ce49edf6e05b1b63853e8746c6578706572696d656e74616cf564736f6c634300050c0040`}, 1242 []string{` 1243 [{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"indexed":false,"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"indexed":false,"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"indexed":false,"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"indexed":false,"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"indexed":false,"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"TupleEvent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"}],"indexed":false,"internalType":"struct Tuple.P[]","name":"","type":"tuple[]"}],"name":"TupleEvent2","type":"event"},{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"func1","outputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"","type":"tuple[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"func2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"internalType":"uint16","name":"x","type":"uint16"},{"internalType":"uint16","name":"y","type":"uint16"}],"internalType":"struct Tuple.Q[]","name":"","type":"tuple[]"}],"name":"func3","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}] 1244 `}, 1245 ` 1246 "math/big" 1247 "reflect" 1248 1249 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1250 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1251 "github.com/ava-labs/subnet-evm/core" 1252 "github.com/ethereum/go-ethereum/crypto" 1253 `, 1254 1255 ` 1256 key, _ := crypto.GenerateKey() 1257 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1258 1259 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1260 defer sim.Close() 1261 1262 _, _, contract, err := DeployTuple(auth, sim) 1263 if err != nil { 1264 t.Fatalf("deploy contract failed %v", err) 1265 } 1266 sim.Commit(false) 1267 1268 check := func(a, b interface{}, errMsg string) { 1269 if !reflect.DeepEqual(a, b) { 1270 t.Fatal(errMsg) 1271 } 1272 } 1273 1274 a := TupleS{ 1275 A: big.NewInt(1), 1276 B: []*big.Int{big.NewInt(2), big.NewInt(3)}, 1277 C: []TupleT{ 1278 { 1279 X: big.NewInt(4), 1280 Y: big.NewInt(5), 1281 }, 1282 { 1283 X: big.NewInt(6), 1284 Y: big.NewInt(7), 1285 }, 1286 }, 1287 } 1288 1289 b := [][2]TupleT{ 1290 { 1291 { 1292 X: big.NewInt(8), 1293 Y: big.NewInt(9), 1294 }, 1295 { 1296 X: big.NewInt(10), 1297 Y: big.NewInt(11), 1298 }, 1299 }, 1300 } 1301 1302 c := [2][]TupleT{ 1303 { 1304 { 1305 X: big.NewInt(12), 1306 Y: big.NewInt(13), 1307 }, 1308 { 1309 X: big.NewInt(14), 1310 Y: big.NewInt(15), 1311 }, 1312 }, 1313 { 1314 { 1315 X: big.NewInt(16), 1316 Y: big.NewInt(17), 1317 }, 1318 }, 1319 } 1320 1321 d := []TupleS{a} 1322 1323 e := []*big.Int{big.NewInt(18), big.NewInt(19)} 1324 ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e) 1325 if err != nil { 1326 t.Fatalf("invoke contract failed, err %v", err) 1327 } 1328 check(ret1, a, "ret1 mismatch") 1329 check(ret2, b, "ret2 mismatch") 1330 check(ret3, c, "ret3 mismatch") 1331 check(ret4, d, "ret4 mismatch") 1332 check(ret5, e, "ret5 mismatch") 1333 1334 _, err = contract.Func2(auth, a, b, c, d, e) 1335 if err != nil { 1336 t.Fatalf("invoke contract failed, err %v", err) 1337 } 1338 sim.Commit(false) 1339 1340 iter, err := contract.FilterTupleEvent(nil) 1341 if err != nil { 1342 t.Fatalf("failed to create event filter, err %v", err) 1343 } 1344 defer iter.Close() 1345 1346 iter.Next() 1347 check(iter.Event.A, a, "field1 mismatch") 1348 check(iter.Event.B, b, "field2 mismatch") 1349 check(iter.Event.C, c, "field3 mismatch") 1350 check(iter.Event.D, d, "field4 mismatch") 1351 check(iter.Event.E, e, "field5 mismatch") 1352 1353 err = contract.Func3(nil, nil) 1354 if err != nil { 1355 t.Fatalf("failed to call function which has no return, err %v", err) 1356 } 1357 `, 1358 nil, 1359 nil, 1360 nil, 1361 nil, 1362 }, 1363 { 1364 `UseLibrary`, 1365 ` 1366 library Math { 1367 function add(uint a, uint b) public view returns(uint) { 1368 return a + b; 1369 } 1370 } 1371 1372 contract UseLibrary { 1373 function add (uint c, uint d) public view returns(uint) { 1374 return Math.add(c,d); 1375 } 1376 } 1377 `, 1378 []string{ 1379 // Bytecode for the UseLibrary contract 1380 `608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`, 1381 // Bytecode for the Math contract 1382 `60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`, 1383 }, 1384 []string{ 1385 `[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, 1386 `[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, 1387 }, 1388 ` 1389 "math/big" 1390 1391 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1392 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1393 "github.com/ava-labs/subnet-evm/core" 1394 "github.com/ethereum/go-ethereum/crypto" 1395 `, 1396 ` 1397 // Generate a new random account and a funded simulator 1398 key, _ := crypto.GenerateKey() 1399 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1400 1401 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1402 defer sim.Close() 1403 1404 //deploy the test contract 1405 _, _, testContract, err := DeployUseLibrary(auth, sim) 1406 if err != nil { 1407 t.Fatalf("Failed to deploy test contract: %v", err) 1408 } 1409 1410 // Finish deploy. 1411 sim.Commit(false) 1412 1413 // Check that the library contract has been deployed 1414 // by calling the contract's add function. 1415 res, err := testContract.Add(&bind.CallOpts{ 1416 From: auth.From, 1417 Accepted: false, 1418 }, big.NewInt(1), big.NewInt(2)) 1419 if err != nil { 1420 t.Fatalf("Failed to call linked contract: %v", err) 1421 } 1422 if res.Cmp(big.NewInt(3)) != 0 { 1423 t.Fatalf("Add did not return the correct result: %d != %d", res, 3) 1424 } 1425 `, 1426 nil, 1427 map[string]string{ 1428 "b98c933f0a6ececcd167bd4f9d3299b1a0": "Math", 1429 }, 1430 nil, 1431 []string{"UseLibrary", "Math"}, 1432 }, { 1433 "Overload", 1434 ` 1435 pragma solidity ^0.5.10; 1436 1437 contract overload { 1438 mapping(address => uint256) balances; 1439 1440 event bar(uint256 i); 1441 event bar(uint256 i, uint256 j); 1442 1443 function foo(uint256 i) public { 1444 emit bar(i); 1445 } 1446 function foo(uint256 i, uint256 j) public { 1447 emit bar(i, j); 1448 } 1449 } 1450 `, 1451 []string{`608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032`}, 1452 []string{`[{"constant":false,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]`}, 1453 ` 1454 "math/big" 1455 "time" 1456 1457 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1458 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1459 "github.com/ava-labs/subnet-evm/core" 1460 "github.com/ethereum/go-ethereum/crypto" 1461 `, 1462 ` 1463 // Initialize test accounts 1464 key, _ := crypto.GenerateKey() 1465 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1466 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: new(big.Int).Mul(big.NewInt(10000000000000000), big.NewInt(1000))}}, 10000000) 1467 defer sim.Close() 1468 1469 // deploy the test contract 1470 _, _, contract, err := DeployOverload(auth, sim) 1471 if err != nil { 1472 t.Fatalf("Failed to deploy contract: %v", err) 1473 } 1474 1475 resCh, stopCh := make(chan uint64), make(chan struct{}) 1476 1477 go func() { 1478 barSink := make(chan *OverloadBar) 1479 sub, _ := contract.WatchBar(nil, barSink) 1480 defer sub.Unsubscribe() 1481 1482 bar0Sink := make(chan *OverloadBar0) 1483 sub0, _ := contract.WatchBar0(nil, bar0Sink) 1484 defer sub0.Unsubscribe() 1485 1486 for { 1487 select { 1488 case ev := <-barSink: 1489 resCh <- ev.I.Uint64() 1490 case ev := <-bar0Sink: 1491 resCh <- ev.I.Uint64() + ev.J.Uint64() 1492 case <-stopCh: 1493 return 1494 } 1495 } 1496 }() 1497 1498 time.Sleep(5 * time.Second) 1499 1500 // Finish deploy. 1501 sim.Commit(false) 1502 1503 contract.Foo(auth, big.NewInt(1), big.NewInt(2)) 1504 sim.Commit(false) 1505 1506 time.Sleep(5 * time.Second) 1507 1508 bar0Timer := time.NewTimer(60 * time.Second) 1509 time.Sleep(1 * time.Second) 1510 1511 select { 1512 case n := <-resCh: 1513 if n != 3 { 1514 t.Fatalf("Invalid bar0 event") 1515 } 1516 case <-bar0Timer.C: 1517 t.Fatalf("Wait bar0 event timeout") 1518 } 1519 1520 bar0Timer.Stop() 1521 1522 contract.Foo0(auth, big.NewInt(1)) 1523 sim.Commit(false) 1524 1525 time.Sleep(5 * time.Second) 1526 1527 barTimer := time.NewTimer(60 * time.Second) 1528 time.Sleep(1 * time.Second) 1529 1530 select { 1531 case n := <-resCh: 1532 if n != 1 { 1533 t.Fatalf("Invalid bar event") 1534 } 1535 case <-barTimer.C: 1536 t.Fatalf("Wait bar event timeout") 1537 } 1538 1539 barTimer.Stop() 1540 1541 close(stopCh) 1542 `, 1543 nil, 1544 nil, 1545 nil, 1546 nil, 1547 }, 1548 { 1549 "IdentifierCollision", 1550 ` 1551 pragma solidity >=0.4.19 <0.6.0; 1552 1553 contract IdentifierCollision { 1554 uint public _myVar; 1555 1556 function MyVar() public view returns (uint) { 1557 return _myVar; 1558 } 1559 } 1560 `, 1561 []string{"60806040523480156100115760006000fd5b50610017565b60c3806100256000396000f3fe608060405234801560105760006000fd5b506004361060365760003560e01c806301ad4d8714603c5780634ef1f0ad146058576036565b60006000fd5b60426074565b6040518082815260200191505060405180910390f35b605e607d565b6040518082815260200191505060405180910390f35b60006000505481565b60006000600050549050608b565b9056fea265627a7a7231582067c8d84688b01c4754ba40a2a871cede94ea1f28b5981593ab2a45b46ac43af664736f6c634300050c0032"}, 1562 []string{`[{"constant":true,"inputs":[],"name":"MyVar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_myVar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`}, 1563 ` 1564 "math/big" 1565 1566 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1567 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1568 "github.com/ethereum/go-ethereum/crypto" 1569 "github.com/ava-labs/subnet-evm/core" 1570 `, 1571 ` 1572 // Initialize test accounts 1573 key, _ := crypto.GenerateKey() 1574 addr := crypto.PubkeyToAddress(key.PublicKey) 1575 1576 // Deploy registrar contract 1577 sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: new(big.Int).Mul(big.NewInt(10000000000000000), big.NewInt(1000))}}, 10000000) 1578 defer sim.Close() 1579 1580 transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1581 _, _, _, err := DeployIdentifierCollision(transactOpts, sim) 1582 if err != nil { 1583 t.Fatalf("failed to deploy contract: %v", err) 1584 } 1585 `, 1586 nil, 1587 nil, 1588 map[string]string{"_myVar": "pubVar"}, // alias MyVar to PubVar 1589 nil, 1590 }, 1591 { 1592 "MultiContracts", 1593 ` 1594 pragma solidity ^0.5.11; 1595 pragma experimental ABIEncoderV2; 1596 1597 library ExternalLib { 1598 struct SharedStruct{ 1599 uint256 f1; 1600 bytes32 f2; 1601 } 1602 } 1603 1604 contract ContractOne { 1605 function foo(ExternalLib.SharedStruct memory s) pure public { 1606 // Do stuff 1607 } 1608 } 1609 1610 contract ContractTwo { 1611 function bar(ExternalLib.SharedStruct memory s) pure public { 1612 // Do stuff 1613 } 1614 } 1615 `, 1616 []string{ 1617 `60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c80639d8a8ba81461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a72315820749274eb7f6c01010d5322af4e1668b0a154409eb7968bd6cae5524c7ed669bb6c6578706572696d656e74616cf564736f6c634300050c0040`, 1618 `60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c8063db8ba08c1461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a723158209bc28ee7ea97c131a13330d77ec73b4493b5c59c648352da81dd288b021192596c6578706572696d656e74616cf564736f6c634300050c0040`, 1619 `606c6026600b82828239805160001a6073141515601857fe5b30600052607381538281f350fe73000000000000000000000000000000000000000030146080604052600436106023575b60006000fdfea365627a7a72315820518f0110144f5b3de95697d05e456a064656890d08e6f9cff47f3be710cc46a36c6578706572696d656e74616cf564736f6c634300050c0040`, 1620 }, 1621 []string{ 1622 `[{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"f1","type":"uint256"},{"internalType":"bytes32","name":"f2","type":"bytes32"}],"internalType":"struct ExternalLib.SharedStruct","name":"s","type":"tuple"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`, 1623 `[{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"f1","type":"uint256"},{"internalType":"bytes32","name":"f2","type":"bytes32"}],"internalType":"struct ExternalLib.SharedStruct","name":"s","type":"tuple"}],"name":"bar","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`, 1624 `[]`, 1625 }, 1626 ` 1627 "math/big" 1628 1629 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1630 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1631 "github.com/ethereum/go-ethereum/crypto" 1632 "github.com/ava-labs/subnet-evm/core" 1633 `, 1634 ` 1635 key, _ := crypto.GenerateKey() 1636 addr := crypto.PubkeyToAddress(key.PublicKey) 1637 1638 // Deploy registrar contract 1639 sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1640 defer sim.Close() 1641 1642 transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1643 _, _, c1, err := DeployContractOne(transactOpts, sim) 1644 if err != nil { 1645 t.Fatal("Failed to deploy contract") 1646 } 1647 sim.Commit(false) 1648 err = c1.Foo(nil, ExternalLibSharedStruct{ 1649 F1: big.NewInt(100), 1650 F2: [32]byte{0x01, 0x02, 0x03}, 1651 }) 1652 if err != nil { 1653 t.Fatal("Failed to invoke function") 1654 } 1655 _, _, c2, err := DeployContractTwo(transactOpts, sim) 1656 if err != nil { 1657 t.Fatal("Failed to deploy contract") 1658 } 1659 sim.Commit(false) 1660 err = c2.Bar(nil, ExternalLibSharedStruct{ 1661 F1: big.NewInt(100), 1662 F2: [32]byte{0x01, 0x02, 0x03}, 1663 }) 1664 if err != nil { 1665 t.Fatal("Failed to invoke function") 1666 } 1667 `, 1668 nil, 1669 nil, 1670 nil, 1671 []string{"ContractOne", "ContractTwo", "ExternalLib"}, 1672 }, 1673 // Test the existence of the free retrieval calls 1674 { 1675 `PureAndView`, 1676 `pragma solidity >=0.6.0; 1677 contract PureAndView { 1678 function PureFunc() public pure returns (uint) { 1679 return 42; 1680 } 1681 function ViewFunc() public view returns (uint) { 1682 return block.number; 1683 } 1684 } 1685 `, 1686 []string{`608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806376b5686a146037578063bb38c66c146053575b600080fd5b603d606f565b6040518082815260200191505060405180910390f35b60596077565b6040518082815260200191505060405180910390f35b600043905090565b6000602a90509056fea2646970667358221220d158c2ab7fdfce366a7998ec79ab84edd43b9815630bbaede2c760ea77f29f7f64736f6c63430006000033`}, 1687 []string{`[{"inputs": [],"name": "PureFunc","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "pure","type": "function"},{"inputs": [],"name": "ViewFunc","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"}]`}, 1688 ` 1689 "math/big" 1690 1691 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1692 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1693 "github.com/ava-labs/subnet-evm/core" 1694 "github.com/ethereum/go-ethereum/crypto" 1695 `, 1696 ` 1697 // Generate a new random account and a funded simulator 1698 key, _ := crypto.GenerateKey() 1699 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1700 1701 sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1702 defer sim.Close() 1703 1704 // Deploy a tester contract and execute a structured call on it 1705 _, _, pav, err := DeployPureAndView(auth, sim) 1706 if err != nil { 1707 t.Fatalf("Failed to deploy PureAndView contract: %v", err) 1708 } 1709 sim.Commit(false) 1710 1711 // This test the existence of the free retreiver call for view and pure functions 1712 if num, err := pav.PureFunc(nil); err != nil { 1713 t.Fatalf("Failed to call anonymous field retriever: %v", err) 1714 } else if num.Cmp(big.NewInt(42)) != 0 { 1715 t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 42) 1716 } 1717 if num, err := pav.ViewFunc(nil); err != nil { 1718 t.Fatalf("Failed to call anonymous field retriever: %v", err) 1719 } else if num.Cmp(big.NewInt(1)) != 0 { 1720 t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 1) 1721 } 1722 `, 1723 nil, 1724 nil, 1725 nil, 1726 nil, 1727 }, 1728 // Test fallback separation introduced in v0.6.0 1729 { 1730 `NewFallbacks`, 1731 ` 1732 pragma solidity >=0.6.0 <0.7.0; 1733 1734 contract NewFallbacks { 1735 event Fallback(bytes data); 1736 fallback() external { 1737 emit Fallback(msg.data); 1738 } 1739 1740 event Received(address addr, uint value); 1741 receive() external payable { 1742 emit Received(msg.sender, msg.value); 1743 } 1744 } 1745 `, 1746 []string{"6080604052348015600f57600080fd5b506101078061001f6000396000f3fe608060405236605f577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1005b348015606a57600080fd5b507f9043988963722edecc2099c75b0af0ff76af14ffca42ed6bce059a20a2a9f98660003660405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a100fea26469706673582212201f994dcfbc53bf610b19176f9a361eafa77b447fd9c796fa2c615dfd0aaf3b8b64736f6c634300060c0033"}, 1747 []string{`[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Fallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Received","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]`}, 1748 ` 1749 "bytes" 1750 "math/big" 1751 1752 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1753 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1754 "github.com/ava-labs/subnet-evm/core" 1755 "github.com/ethereum/go-ethereum/crypto" 1756 `, 1757 ` 1758 key, _ := crypto.GenerateKey() 1759 addr := crypto.PubkeyToAddress(key.PublicKey) 1760 1761 1762 sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000000000000)}}, 1000000) 1763 defer sim.Close() 1764 1765 opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1766 _, _, c, err := DeployNewFallbacks(opts, sim) 1767 if err != nil { 1768 t.Fatalf("Failed to deploy contract: %v", err) 1769 } 1770 sim.Commit(false) 1771 1772 // Test receive function 1773 opts.Value = big.NewInt(100) 1774 c.Receive(opts) 1775 sim.Commit(false) 1776 1777 var gotEvent bool 1778 iter, _ := c.FilterReceived(nil) 1779 defer iter.Close() 1780 for iter.Next() { 1781 if iter.Event.Addr != addr { 1782 t.Fatal("Msg.sender mismatch") 1783 } 1784 if iter.Event.Value.Uint64() != 100 { 1785 t.Fatal("Msg.value mismatch") 1786 } 1787 gotEvent = true 1788 break 1789 } 1790 if !gotEvent { 1791 t.Fatal("Expect to receive event emitted by receive") 1792 } 1793 1794 // Test fallback function 1795 gotEvent = false 1796 opts.Value = nil 1797 calldata := []byte{0x01, 0x02, 0x03} 1798 c.Fallback(opts, calldata) 1799 sim.Commit(false) 1800 1801 iter2, _ := c.FilterFallback(nil) 1802 defer iter2.Close() 1803 for iter2.Next() { 1804 if !bytes.Equal(iter2.Event.Data, calldata) { 1805 t.Fatal("calldata mismatch") 1806 } 1807 gotEvent = true 1808 break 1809 } 1810 if !gotEvent { 1811 t.Fatal("Expect to receive event emitted by fallback") 1812 } 1813 `, 1814 nil, 1815 nil, 1816 nil, 1817 nil, 1818 }, 1819 // Test resolving single struct argument 1820 { 1821 `NewSingleStructArgument`, 1822 ` 1823 pragma solidity ^0.8.0; 1824 1825 contract NewSingleStructArgument { 1826 struct MyStruct{ 1827 uint256 a; 1828 uint256 b; 1829 } 1830 event StructEvent(MyStruct s); 1831 function TestEvent() public { 1832 emit StructEvent(MyStruct({a: 1, b: 2})); 1833 } 1834 } 1835 `, 1836 []string{"608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806324ec1d3f14602d575b600080fd5b60336035565b005b7fb4b2ff75e30cb4317eaae16dd8a187dd89978df17565104caa6c2797caae27d460405180604001604052806001815260200160028152506040516078919060ba565b60405180910390a1565b6040820160008201516096600085018260ad565b50602082015160a7602085018260ad565b50505050565b60b48160d3565b82525050565b600060408201905060cd60008301846082565b92915050565b600081905091905056fea26469706673582212208823628796125bf9941ce4eda18da1be3cf2931b231708ab848e1bd7151c0c9a64736f6c63430008070033"}, 1837 []string{`[{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"indexed":false,"internalType":"struct Test.MyStruct","name":"s","type":"tuple"}],"name":"StructEvent","type":"event"},{"inputs":[],"name":"TestEvent","outputs":[],"stateMutability":"nonpayable","type":"function"}]`}, 1838 ` 1839 "math/big" 1840 1841 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1842 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1843 "github.com/ava-labs/subnet-evm/core" 1844 "github.com/ethereum/go-ethereum/crypto" 1845 `, 1846 ` 1847 var ( 1848 key, _ = crypto.GenerateKey() 1849 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1850 sim = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1851 ) 1852 defer sim.Close() 1853 1854 _, _, d, err := DeployNewSingleStructArgument(user, sim) 1855 if err != nil { 1856 t.Fatalf("Failed to deploy contract %v", err) 1857 } 1858 sim.Commit(false) 1859 1860 _, err = d.TestEvent(user) 1861 if err != nil { 1862 t.Fatalf("Failed to call contract %v", err) 1863 } 1864 sim.Commit(false) 1865 1866 it, err := d.FilterStructEvent(nil) 1867 if err != nil { 1868 t.Fatalf("Failed to filter contract event %v", err) 1869 } 1870 var count int 1871 for it.Next() { 1872 if it.Event.S.A.Cmp(big.NewInt(1)) != 0 { 1873 t.Fatal("Unexpected contract event") 1874 } 1875 if it.Event.S.B.Cmp(big.NewInt(2)) != 0 { 1876 t.Fatal("Unexpected contract event") 1877 } 1878 count += 1 1879 } 1880 if count != 1 { 1881 t.Fatal("Unexpected contract event number") 1882 } 1883 `, 1884 nil, 1885 nil, 1886 nil, 1887 nil, 1888 }, 1889 // Test errors introduced in v0.8.4 1890 { 1891 `NewErrors`, 1892 ` 1893 pragma solidity >0.8.4; 1894 1895 contract NewErrors { 1896 error MyError(uint256); 1897 error MyError1(uint256); 1898 error MyError2(uint256, uint256); 1899 error MyError3(uint256 a, uint256 b, uint256 c); 1900 function Error() public pure { 1901 revert MyError3(1,2,3); 1902 } 1903 } 1904 `, 1905 []string{"0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063726c638214602d575b600080fd5b60336035565b005b60405163024876cd60e61b815260016004820152600260248201526003604482015260640160405180910390fdfea264697066735822122093f786a1bc60216540cd999fbb4a6109e0fef20abcff6e9107fb2817ca968f3c64736f6c63430008070033"}, 1906 []string{`[{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError1","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError2","type":"error"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"}],"name":"MyError3","type":"error"},{"inputs":[],"name":"Error","outputs":[],"stateMutability":"pure","type":"function"}]`}, 1907 ` 1908 "math/big" 1909 1910 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1911 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1912 "github.com/ava-labs/subnet-evm/core" 1913 "github.com/ethereum/go-ethereum/crypto" 1914 `, 1915 ` 1916 var ( 1917 key, _ = crypto.GenerateKey() 1918 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1919 sim = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1920 ) 1921 defer sim.Close() 1922 1923 _, tx, contract, err := DeployNewErrors(user, sim) 1924 if err != nil { 1925 t.Fatal(err) 1926 } 1927 sim.Commit(true) 1928 _, err = bind.WaitDeployed(nil, sim, tx) 1929 if err != nil { 1930 t.Error(err) 1931 } 1932 if err := contract.Error(new(bind.CallOpts)); err == nil { 1933 t.Fatalf("expected contract to throw error") 1934 } 1935 // TODO (MariusVanDerWijden unpack error using abigen 1936 // once that is implemented 1937 `, 1938 nil, 1939 nil, 1940 nil, 1941 nil, 1942 }, 1943 { 1944 name: `ConstructorWithStructParam`, 1945 contract: ` 1946 pragma solidity >=0.8.0 <0.9.0; 1947 1948 contract ConstructorWithStructParam { 1949 struct StructType { 1950 uint256 field; 1951 } 1952 1953 constructor(StructType memory st) {} 1954 } 1955 `, 1956 bytecode: []string{`0x608060405234801561001057600080fd5b506040516101c43803806101c48339818101604052810190610032919061014a565b50610177565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100958261004c565b810181811067ffffffffffffffff821117156100b4576100b361005d565b5b80604052505050565b60006100c7610038565b90506100d3828261008c565b919050565b6000819050919050565b6100eb816100d8565b81146100f657600080fd5b50565b600081519050610108816100e2565b92915050565b60006020828403121561012457610123610047565b5b61012e60206100bd565b9050600061013e848285016100f9565b60008301525092915050565b6000602082840312156101605761015f610042565b5b600061016e8482850161010e565b91505092915050565b603f806101856000396000f3fe6080604052600080fdfea2646970667358221220cdffa667affecefac5561f65f4a4ba914204a8d4eb859d8cd426fb306e5c12a364736f6c634300080a0033`}, 1957 abi: []string{`[{"inputs":[{"components":[{"internalType":"uint256","name":"field","type":"uint256"}],"internalType":"struct ConstructorWithStructParam.StructType","name":"st","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"}]`}, 1958 imports: ` 1959 "math/big" 1960 1961 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 1962 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 1963 "github.com/ava-labs/subnet-evm/core" 1964 "github.com/ethereum/go-ethereum/crypto" 1965 `, 1966 tester: ` 1967 var ( 1968 key, _ = crypto.GenerateKey() 1969 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1970 sim = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000) 1971 ) 1972 defer sim.Close() 1973 1974 _, tx, _, err := DeployConstructorWithStructParam(user, sim, ConstructorWithStructParamStructType{Field: big.NewInt(42)}) 1975 if err != nil { 1976 t.Fatalf("DeployConstructorWithStructParam() got err %v; want nil err", err) 1977 } 1978 sim.Commit(true) 1979 1980 if _, err = bind.WaitDeployed(nil, sim, tx); err != nil { 1981 t.Logf("Deployment tx: %+v", tx) 1982 t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err) 1983 } 1984 `, 1985 }, 1986 { 1987 name: `NameConflict`, 1988 contract: ` 1989 // SPDX-License-Identifier: GPL-3.0 1990 pragma solidity >=0.4.22 <0.9.0; 1991 contract oracle { 1992 struct request { 1993 bytes data; 1994 bytes _data; 1995 } 1996 event log (int msg, int _msg); 1997 function addRequest(request memory req) public pure {} 1998 function getRequest() pure public returns (request memory) { 1999 return request("", ""); 2000 } 2001 } 2002 `, 2003 bytecode: []string{"0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c2bb515f1461003b578063cce7b04814610059575b600080fd5b610043610075565b60405161005091906101af565b60405180910390f35b610073600480360381019061006e91906103ac565b6100b5565b005b61007d6100b8565b604051806040016040528060405180602001604052806000815250815260200160405180602001604052806000815250815250905090565b50565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561010c5780820151818401526020810190506100f1565b8381111561011b576000848401525b50505050565b6000601f19601f8301169050919050565b600061013d826100d2565b61014781856100dd565b93506101578185602086016100ee565b61016081610121565b840191505092915050565b600060408301600083015184820360008601526101888282610132565b915050602083015184820360208601526101a28282610132565b9150508091505092915050565b600060208201905081810360008301526101c9818461016b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022282610121565b810181811067ffffffffffffffff82111715610241576102406101ea565b5b80604052505050565b60006102546101d1565b90506102608282610219565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561028f5761028e6101ea565b5b61029882610121565b9050602081019050919050565b82818337600083830152505050565b60006102c76102c284610274565b61024a565b9050828152602081018484840111156102e3576102e261026f565b5b6102ee8482856102a5565b509392505050565b600082601f83011261030b5761030a61026a565b5b813561031b8482602086016102b4565b91505092915050565b60006040828403121561033a576103396101e5565b5b610344604061024a565b9050600082013567ffffffffffffffff81111561036457610363610265565b5b610370848285016102f6565b600083015250602082013567ffffffffffffffff81111561039457610393610265565b5b6103a0848285016102f6565b60208301525092915050565b6000602082840312156103c2576103c16101db565b5b600082013567ffffffffffffffff8111156103e0576103df6101e0565b5b6103ec84828501610324565b9150509291505056fea264697066735822122033bca1606af9b6aeba1673f98c52003cec19338539fb44b86690ce82c51483b564736f6c634300080e0033"}, 2004 abi: []string{`[ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "int256", "name": "msg", "type": "int256" }, { "indexed": false, "internalType": "int256", "name": "_msg", "type": "int256" } ], "name": "log", "type": "event" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "internalType": "struct oracle.request", "name": "req", "type": "tuple" } ], "name": "addRequest", "outputs": [], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getRequest", "outputs": [ { "components": [ { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "internalType": "struct oracle.request", "name": "", "type": "tuple" } ], "stateMutability": "pure", "type": "function" } ]`}, 2005 imports: ` 2006 "math/big" 2007 2008 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 2009 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 2010 "github.com/ava-labs/subnet-evm/core" 2011 "github.com/ethereum/go-ethereum/crypto" 2012 `, 2013 tester: ` 2014 var ( 2015 gasCeil = uint64(30000000) // Note: from geth's ethconfig.Defaults.Miner.GasCeil 2016 key, _ = crypto.GenerateKey() 2017 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 2018 sim = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, gasCeil) 2019 ) 2020 defer sim.Close() 2021 2022 _, tx, _, err := DeployNameConflict(user, sim) 2023 if err != nil { 2024 t.Fatalf("DeployNameConflict() got err %v; want nil err", err) 2025 } 2026 sim.Commit(true) 2027 2028 if _, err = bind.WaitDeployed(nil, sim, tx); err != nil { 2029 t.Logf("Deployment tx: %+v", tx) 2030 t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err) 2031 } 2032 `, 2033 }, 2034 { 2035 name: "RangeKeyword", 2036 contract: ` 2037 // SPDX-License-Identifier: GPL-3.0 2038 pragma solidity >=0.4.22 <0.9.0; 2039 contract keywordcontract { 2040 function functionWithKeywordParameter(range uint256) public pure {} 2041 } 2042 `, 2043 bytecode: []string{"0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063527a119f14602d575b600080fd5b60436004803603810190603f9190605b565b6045565b005b50565b6000813590506055816092565b92915050565b600060208284031215606e57606d608d565b5b6000607a848285016048565b91505092915050565b6000819050919050565b600080fd5b6099816083565b811460a357600080fd5b5056fea2646970667358221220d4f4525e2615516394055d369fb17df41c359e5e962734f27fd683ea81fd9db164736f6c63430008070033"}, 2044 abi: []string{`[{"inputs":[{"internalType":"uint256","name":"range","type":"uint256"}],"name":"functionWithKeywordParameter","outputs":[],"stateMutability":"pure","type":"function"}]`}, 2045 imports: ` 2046 "math/big" 2047 2048 "github.com/ava-labs/subnet-evm/accounts/abi/bind" 2049 "github.com/ava-labs/subnet-evm/accounts/abi/bind/backends" 2050 "github.com/ava-labs/subnet-evm/core" 2051 "github.com/ethereum/go-ethereum/crypto" 2052 `, 2053 tester: ` 2054 var ( 2055 gasCeil = uint64(30000000) // Note: from geth's ethconfig.Defaults.Miner.GasCeil 2056 key, _ = crypto.GenerateKey() 2057 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 2058 sim = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, gasCeil) 2059 ) 2060 _, tx, _, err := DeployRangeKeyword(user, sim) 2061 if err != nil { 2062 t.Fatalf("error deploying contract: %v", err) 2063 } 2064 sim.Commit(true) 2065 2066 if _, err = bind.WaitDeployed(nil, sim, tx); err != nil { 2067 t.Errorf("error deploying the contract: %v", err) 2068 } 2069 `, 2070 }, { 2071 name: "NumericMethodName", 2072 contract: ` 2073 // SPDX-License-Identifier: GPL-3.0 2074 pragma solidity >=0.4.22 <0.9.0; 2075 2076 contract NumericMethodName { 2077 event _1TestEvent(address _param); 2078 function _1test() public pure {} 2079 function __1test() public pure {} 2080 function __2test() public pure {} 2081 } 2082 `, 2083 bytecode: []string{"0x6080604052348015600f57600080fd5b5060958061001e6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80639d993132146041578063d02767c7146049578063ffa02795146051575b600080fd5b60476059565b005b604f605b565b005b6057605d565b005b565b565b56fea26469706673582212200382ca602dff96a7e2ba54657985e2b4ac423a56abe4a1f0667bc635c4d4371f64736f6c63430008110033"}, 2084 abi: []string{`[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_param","type":"address"}],"name":"_1TestEvent","type":"event"},{"inputs":[],"name":"_1test","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"__1test","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"__2test","outputs":[],"stateMutability":"pure","type":"function"}]`}, 2085 imports: ` 2086 "github.com/ethereum/go-ethereum/common" 2087 `, 2088 tester: ` 2089 if b, err := NewNumericMethodName(common.Address{}, nil); b == nil || err != nil { 2090 t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil) 2091 } 2092 `, 2093 }, 2094 } 2095 2096 // The binding tests have been modified to run in two separate test 2097 // functions to allow these tests to pass on GitHub Actions. 2098 func TestGolangBindingsOverload(t *testing.T) { 2099 golangBindings(t, true) 2100 } 2101 2102 func TestGolangBindings(t *testing.T) { 2103 golangBindings(t, false) 2104 } 2105 2106 // Tests that packages generated by the binder can be successfully compiled and 2107 // the requested tester run against it. 2108 func golangBindings(t *testing.T, overload bool) { 2109 // Skip the test if no Go command can be found 2110 gocmd := runtime.GOROOT() + "/bin/go" 2111 if !common.FileExist(gocmd) { 2112 t.Skip("go sdk not found for testing") 2113 } 2114 // Create a temporary workspace for the test suite 2115 ws := t.TempDir() 2116 2117 pkg := filepath.Join(ws, "bindtest") 2118 if err := os.MkdirAll(pkg, 0700); err != nil { 2119 t.Fatalf("failed to create package: %v", err) 2120 } 2121 // Generate the test suite for all the contracts 2122 for i, tt := range bindTests { 2123 t.Run(tt.name, func(t *testing.T) { 2124 // Skip the "Overload" test if [!overload] 2125 if !overload && tt.name == "Overload" { 2126 return 2127 } 2128 // Skip all tests except for "Overload" if [overload] 2129 if overload && tt.name != "Overload" { 2130 return 2131 } 2132 var types []string 2133 if tt.types != nil { 2134 types = tt.types 2135 } else { 2136 types = []string{tt.name} 2137 } 2138 // Generate the binding and create a Go source file in the workspace 2139 bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases) 2140 if err != nil { 2141 t.Fatalf("test %d: failed to generate binding: %v", i, err) 2142 } 2143 if err = os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil { 2144 t.Fatalf("test %d: failed to write binding: %v", i, err) 2145 } 2146 // Generate the test file with the injected test code 2147 code := fmt.Sprintf(` 2148 package bindtest 2149 2150 import ( 2151 "testing" 2152 %s 2153 ) 2154 2155 func Test%s(t *testing.T) { 2156 %s 2157 } 2158 `, tt.imports, tt.name, tt.tester) 2159 if err := os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { 2160 t.Fatalf("test %d: failed to write tests: %v", i, err) 2161 } 2162 }) 2163 } 2164 // Convert the package to go modules and use the current source for go-ethereum 2165 moder := exec.Command(gocmd, "mod", "init", "bindtest") 2166 moder.Dir = pkg 2167 if out, err := moder.CombinedOutput(); err != nil { 2168 t.Fatalf("failed to convert binding test to modules: %v\n%s", err, out) 2169 } 2170 pwd, _ := os.Getwd() 2171 replacer := exec.Command(gocmd, "mod", "edit", "-x", "-require", "github.com/ava-labs/subnet-evm@v0.0.0", "-replace", "github.com/ava-labs/subnet-evm="+filepath.Join(pwd, "..", "..", "..")) // Repo root 2172 replacer.Dir = pkg 2173 if out, err := replacer.CombinedOutput(); err != nil { 2174 t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out) 2175 } 2176 tidier := exec.Command(gocmd, "mod", "tidy", "-compat=1.21") 2177 tidier.Dir = pkg 2178 if out, err := tidier.CombinedOutput(); err != nil { 2179 t.Fatalf("failed to tidy Go module file: %v\n%s", err, out) 2180 } 2181 // Test the entire package and report any failures 2182 cmd := exec.Command(gocmd, "test", "-v", "-count", "1") 2183 cmd.Dir = pkg 2184 if out, err := cmd.CombinedOutput(); err != nil { 2185 t.Fatalf("failed to run binding test: %v\n%s", err, out) 2186 } 2187 }