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