github.com/ethereum/go-ethereum@v1.14.3/accounts/abi/bind/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 bind 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 } 943 sim.Commit() 944 } 945 // Test filtering for certain events and ensure they can be found 946 sit, err := eventer.FilterSimpleEvent(nil, []common.Address{common.Address{1}, common.Address{3}}, [][32]byte{{byte(1)}, {byte(2)}, {byte(3)}}, []bool{true}) 947 if err != nil { 948 t.Fatalf("failed to filter for simple events: %v", err) 949 } 950 defer sit.Close() 951 952 sit.Next() 953 if sit.Event.Value.Uint64() != 11 || !sit.Event.Flag { 954 t.Errorf("simple log content mismatch: have %v, want {11, true}", sit.Event) 955 } 956 sit.Next() 957 if sit.Event.Value.Uint64() != 21 || !sit.Event.Flag { 958 t.Errorf("simple log content mismatch: have %v, want {21, true}", sit.Event) 959 } 960 sit.Next() 961 if sit.Event.Value.Uint64() != 31 || !sit.Event.Flag { 962 t.Errorf("simple log content mismatch: have %v, want {31, true}", sit.Event) 963 } 964 sit.Next() 965 if sit.Event.Value.Uint64() != 33 || !sit.Event.Flag { 966 t.Errorf("simple log content mismatch: have %v, want {33, true}", sit.Event) 967 } 968 969 if sit.Next() { 970 t.Errorf("unexpected simple event found: %+v", sit.Event) 971 } 972 if err = sit.Error(); err != nil { 973 t.Fatalf("simple event iteration failed: %v", err) 974 } 975 // Test raising and filtering for an event with no data component 976 if _, err := eventer.RaiseNodataEvent(auth, big.NewInt(314), 141, 271); err != nil { 977 t.Fatalf("failed to raise nodata event: %v", err) 978 } 979 sim.Commit() 980 981 nit, err := eventer.FilterNodataEvent(nil, []*big.Int{big.NewInt(314)}, []int16{140, 141, 142}, []uint32{271}) 982 if err != nil { 983 t.Fatalf("failed to filter for nodata events: %v", err) 984 } 985 defer nit.Close() 986 987 if !nit.Next() { 988 t.Fatalf("nodata log not found: %v", nit.Error()) 989 } 990 if nit.Event.Number.Uint64() != 314 { 991 t.Errorf("nodata log content mismatch: have %v, want 314", nit.Event.Number) 992 } 993 if nit.Next() { 994 t.Errorf("unexpected nodata event found: %+v", nit.Event) 995 } 996 if err = nit.Error(); err != nil { 997 t.Fatalf("nodata event iteration failed: %v", err) 998 } 999 // Test raising and filtering for events with dynamic indexed components 1000 if _, err := eventer.RaiseDynamicEvent(auth, "Hello", []byte("World")); err != nil { 1001 t.Fatalf("failed to raise dynamic event: %v", err) 1002 } 1003 sim.Commit() 1004 1005 dit, err := eventer.FilterDynamicEvent(nil, []string{"Hi", "Hello", "Bye"}, [][]byte{[]byte("World")}) 1006 if err != nil { 1007 t.Fatalf("failed to filter for dynamic events: %v", err) 1008 } 1009 defer dit.Close() 1010 1011 if !dit.Next() { 1012 t.Fatalf("dynamic log not found: %v", dit.Error()) 1013 } 1014 if dit.Event.NonIndexedString != "Hello" || string(dit.Event.NonIndexedBytes) != "World" || dit.Event.IndexedString != common.HexToHash("0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2") || dit.Event.IndexedBytes != common.HexToHash("0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18") { 1015 t.Errorf("dynamic log content mismatch: have %v, want {'0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2, '0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18', 'Hello', 'World'}", dit.Event) 1016 } 1017 if dit.Next() { 1018 t.Errorf("unexpected dynamic event found: %+v", dit.Event) 1019 } 1020 if err = dit.Error(); err != nil { 1021 t.Fatalf("dynamic event iteration failed: %v", err) 1022 } 1023 // Test raising and filtering for events with fixed bytes components 1024 var fblob [24]byte 1025 copy(fblob[:], []byte("Fixed Bytes")) 1026 1027 if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil { 1028 t.Fatalf("failed to raise fixed bytes event: %v", err) 1029 } 1030 sim.Commit() 1031 1032 fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob}) 1033 if err != nil { 1034 t.Fatalf("failed to filter for fixed bytes events: %v", err) 1035 } 1036 defer fit.Close() 1037 1038 if !fit.Next() { 1039 t.Fatalf("fixed bytes log not found: %v", fit.Error()) 1040 } 1041 if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob { 1042 t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob) 1043 } 1044 if fit.Next() { 1045 t.Errorf("unexpected fixed bytes event found: %+v", fit.Event) 1046 } 1047 if err = fit.Error(); err != nil { 1048 t.Fatalf("fixed bytes event iteration failed: %v", err) 1049 } 1050 // Test subscribing to an event and raising it afterwards 1051 ch := make(chan *EventerSimpleEvent, 16) 1052 sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil) 1053 if err != nil { 1054 t.Fatalf("failed to subscribe to simple events: %v", err) 1055 } 1056 if _, err := eventer.RaiseSimpleEvent(auth, common.Address{255}, [32]byte{255}, true, big.NewInt(255)); err != nil { 1057 t.Fatalf("failed to raise subscribed simple event: %v", err) 1058 } 1059 sim.Commit() 1060 1061 select { 1062 case event := <-ch: 1063 if event.Value.Uint64() != 255 { 1064 t.Errorf("simple log content mismatch: have %v, want 255", event) 1065 } 1066 case <-time.After(250 * time.Millisecond): 1067 t.Fatalf("subscribed simple event didn't arrive") 1068 } 1069 // Unsubscribe from the event and make sure we're not delivered more 1070 sub.Unsubscribe() 1071 1072 if _, err := eventer.RaiseSimpleEvent(auth, common.Address{254}, [32]byte{254}, true, big.NewInt(254)); err != nil { 1073 t.Fatalf("failed to raise subscribed simple event: %v", err) 1074 } 1075 sim.Commit() 1076 1077 select { 1078 case event := <-ch: 1079 t.Fatalf("unsubscribed simple event arrived: %v", event) 1080 case <-time.After(250 * time.Millisecond): 1081 } 1082 `, 1083 nil, 1084 nil, 1085 nil, 1086 nil, 1087 }, 1088 { 1089 `DeeplyNestedArray`, 1090 ` 1091 contract DeeplyNestedArray { 1092 uint64[3][4][5] public deepUint64Array; 1093 function storeDeepUintArray(uint64[3][4][5] arr) public { 1094 deepUint64Array = arr; 1095 } 1096 function retrieveDeepArray() public view returns (uint64[3][4][5]) { 1097 return deepUint64Array; 1098 } 1099 } 1100 `, 1101 []string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`}, 1102 []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"}]`}, 1103 ` 1104 "math/big" 1105 1106 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1107 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1108 "github.com/ethereum/go-ethereum/core/types" 1109 "github.com/ethereum/go-ethereum/crypto" 1110 `, 1111 ` 1112 // Generate a new random account and a funded simulator 1113 key, _ := crypto.GenerateKey() 1114 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1115 1116 sim := backends.NewSimulatedBackend(types.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1117 defer sim.Close() 1118 1119 //deploy the test contract 1120 _, _, testContract, err := DeployDeeplyNestedArray(auth, sim) 1121 if err != nil { 1122 t.Fatalf("Failed to deploy test contract: %v", err) 1123 } 1124 1125 // Finish deploy. 1126 sim.Commit() 1127 1128 //Create coordinate-filled array, for testing purposes. 1129 testArr := [5][4][3]uint64{} 1130 for i := 0; i < 5; i++ { 1131 testArr[i] = [4][3]uint64{} 1132 for j := 0; j < 4; j++ { 1133 testArr[i][j] = [3]uint64{} 1134 for k := 0; k < 3; k++ { 1135 //pack the coordinates, each array value will be unique, and can be validated easily. 1136 testArr[i][j][k] = uint64(i) << 16 | uint64(j) << 8 | uint64(k) 1137 } 1138 } 1139 } 1140 1141 if _, err := testContract.StoreDeepUintArray(&bind.TransactOpts{ 1142 From: auth.From, 1143 Signer: auth.Signer, 1144 }, testArr); err != nil { 1145 t.Fatalf("Failed to store nested array in test contract: %v", err) 1146 } 1147 1148 sim.Commit() 1149 1150 retrievedArr, err := testContract.RetrieveDeepArray(&bind.CallOpts{ 1151 From: auth.From, 1152 Pending: false, 1153 }) 1154 if err != nil { 1155 t.Fatalf("Failed to retrieve nested array from test contract: %v", err) 1156 } 1157 1158 //quick check to see if contents were copied 1159 // (See accounts/abi/unpack_test.go for more extensive testing) 1160 if retrievedArr[4][3][2] != testArr[4][3][2] { 1161 t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err) 1162 } 1163 `, 1164 nil, 1165 nil, 1166 nil, 1167 nil, 1168 }, 1169 { 1170 `CallbackParam`, 1171 ` 1172 contract FunctionPointerTest { 1173 function test(function(uint256) external callback) external { 1174 callback(1); 1175 } 1176 } 1177 `, 1178 []string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`}, 1179 []string{`[ 1180 { 1181 "constant": false, 1182 "inputs": [ 1183 { 1184 "name": "callback", 1185 "type": "function" 1186 } 1187 ], 1188 "name": "test", 1189 "outputs": [], 1190 "payable": false, 1191 "stateMutability": "nonpayable", 1192 "type": "function" 1193 } 1194 ]`}, ` 1195 "strings" 1196 `, 1197 ` 1198 if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 { 1199 t.Fatalf("") 1200 } 1201 `, 1202 []map[string]string{ 1203 { 1204 "test(function)": "d7a5aba2", 1205 }, 1206 }, 1207 nil, 1208 nil, 1209 nil, 1210 }, { 1211 `Tuple`, 1212 ` 1213 pragma solidity >=0.4.19 <0.6.0; 1214 pragma experimental ABIEncoderV2; 1215 1216 contract Tuple { 1217 struct S { uint a; uint[] b; T[] c; } 1218 struct T { uint x; uint y; } 1219 struct P { uint8 x; uint8 y; } 1220 struct Q { uint16 x; uint16 y; } 1221 event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e); 1222 event TupleEvent2(P[]); 1223 1224 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) { 1225 return (a, b, c, d, e); 1226 } 1227 function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public { 1228 emit TupleEvent(a, b, c, d, e); 1229 } 1230 function func3(Q[] memory) public pure {} // call function, nothing to return 1231 } 1232 `, 1233 []string{`60806040523480156100115760006000fd5b50610017565b6110b2806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100465760003560e01c8063443c79b41461004c578063d0062cdd14610080578063e4d9a43b1461009c57610046565b60006000fd5b610066600480360361006191908101906107b8565b6100b8565b604051610077959493929190610ccb565b60405180910390f35b61009a600480360361009591908101906107b8565b6100ef565b005b6100b660048036036100b19190810190610775565b610136565b005b6100c061013a565b60606100ca61015e565b606060608989898989945094509450945094506100e2565b9550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd008585858585604051610126959493929190610ccb565b60405180910390a15b5050505050565b5b50565b60405180606001604052806000815260200160608152602001606081526020015090565b60405180604001604052806002905b606081526020019060019003908161016d57905050905661106e565b600082601f830112151561019d5760006000fd5b81356101b06101ab82610d6f565b610d41565b915081818352602084019350602081019050838560808402820111156101d65760006000fd5b60005b8381101561020757816101ec888261037a565b8452602084019350608083019250505b6001810190506101d9565b5050505092915050565b600082601f83011215156102255760006000fd5b600261023861023382610d98565b610d41565b9150818360005b83811015610270578135860161025588826103f3565b8452602084019350602083019250505b60018101905061023f565b5050505092915050565b600082601f830112151561028e5760006000fd5b81356102a161029c82610dbb565b610d41565b915081818352602084019350602081019050838560408402820111156102c75760006000fd5b60005b838110156102f857816102dd888261058b565b8452602084019350604083019250505b6001810190506102ca565b5050505092915050565b600082601f83011215156103165760006000fd5b813561032961032482610de4565b610d41565b9150818183526020840193506020810190508360005b83811015610370578135860161035588826105d8565b8452602084019350602083019250505b60018101905061033f565b5050505092915050565b600082601f830112151561038e5760006000fd5b60026103a161039c82610e0d565b610d41565b915081838560408402820111156103b85760006000fd5b60005b838110156103e957816103ce88826106fe565b8452602084019350604083019250505b6001810190506103bb565b5050505092915050565b600082601f83011215156104075760006000fd5b813561041a61041582610e30565b610d41565b915081818352602084019350602081019050838560408402820111156104405760006000fd5b60005b83811015610471578161045688826106fe565b8452602084019350604083019250505b600181019050610443565b5050505092915050565b600082601f830112151561048f5760006000fd5b81356104a261049d82610e59565b610d41565b915081818352602084019350602081019050838560208402820111156104c85760006000fd5b60005b838110156104f957816104de8882610760565b8452602084019350602083019250505b6001810190506104cb565b5050505092915050565b600082601f83011215156105175760006000fd5b813561052a61052582610e82565b610d41565b915081818352602084019350602081019050838560208402820111156105505760006000fd5b60005b8381101561058157816105668882610760565b8452602084019350602083019250505b600181019050610553565b5050505092915050565b60006040828403121561059e5760006000fd5b6105a86040610d41565b905060006105b88482850161074b565b60008301525060206105cc8482850161074b565b60208301525092915050565b6000606082840312156105eb5760006000fd5b6105f56060610d41565b9050600061060584828501610760565b600083015250602082013567ffffffffffffffff8111156106265760006000fd5b6106328482850161047b565b602083015250604082013567ffffffffffffffff8111156106535760006000fd5b61065f848285016103f3565b60408301525092915050565b60006060828403121561067e5760006000fd5b6106886060610d41565b9050600061069884828501610760565b600083015250602082013567ffffffffffffffff8111156106b95760006000fd5b6106c58482850161047b565b602083015250604082013567ffffffffffffffff8111156106e65760006000fd5b6106f2848285016103f3565b60408301525092915050565b6000604082840312156107115760006000fd5b61071b6040610d41565b9050600061072b84828501610760565b600083015250602061073f84828501610760565b60208301525092915050565b60008135905061075a8161103a565b92915050565b60008135905061076f81611054565b92915050565b6000602082840312156107885760006000fd5b600082013567ffffffffffffffff8111156107a35760006000fd5b6107af8482850161027a565b91505092915050565b6000600060006000600060a086880312156107d35760006000fd5b600086013567ffffffffffffffff8111156107ee5760006000fd5b6107fa8882890161066b565b955050602086013567ffffffffffffffff8111156108185760006000fd5b61082488828901610189565b945050604086013567ffffffffffffffff8111156108425760006000fd5b61084e88828901610211565b935050606086013567ffffffffffffffff81111561086c5760006000fd5b61087888828901610302565b925050608086013567ffffffffffffffff8111156108965760006000fd5b6108a288828901610503565b9150509295509295909350565b60006108bb8383610a6a565b60808301905092915050565b60006108d38383610ac2565b905092915050565b60006108e78383610c36565b905092915050565b60006108fb8383610c8d565b60408301905092915050565b60006109138383610cbc565b60208301905092915050565b600061092a82610f0f565b6109348185610fb7565b935061093f83610eab565b8060005b8381101561097157815161095788826108af565b975061096283610f5c565b9250505b600181019050610943565b5085935050505092915050565b600061098982610f1a565b6109938185610fc8565b9350836020820285016109a585610ebb565b8060005b858110156109e257848403895281516109c285826108c7565b94506109cd83610f69565b925060208a019950505b6001810190506109a9565b50829750879550505050505092915050565b60006109ff82610f25565b610a098185610fd3565b935083602082028501610a1b85610ec5565b8060005b85811015610a585784840389528151610a3885826108db565b9450610a4383610f76565b925060208a019950505b600181019050610a1f565b50829750879550505050505092915050565b610a7381610f30565b610a7d8184610fe4565b9250610a8882610ed5565b8060005b83811015610aba578151610aa087826108ef565b9650610aab83610f83565b9250505b600181019050610a8c565b505050505050565b6000610acd82610f3b565b610ad78185610fef565b9350610ae283610edf565b8060005b83811015610b14578151610afa88826108ef565b9750610b0583610f90565b9250505b600181019050610ae6565b5085935050505092915050565b6000610b2c82610f51565b610b368185611011565b9350610b4183610eff565b8060005b83811015610b73578151610b598882610907565b9750610b6483610faa565b9250505b600181019050610b45565b5085935050505092915050565b6000610b8b82610f46565b610b958185611000565b9350610ba083610eef565b8060005b83811015610bd2578151610bb88882610907565b9750610bc383610f9d565b9250505b600181019050610ba4565b5085935050505092915050565b6000606083016000830151610bf76000860182610cbc565b5060208301518482036020860152610c0f8282610b80565b91505060408301518482036040860152610c298282610ac2565b9150508091505092915050565b6000606083016000830151610c4e6000860182610cbc565b5060208301518482036020860152610c668282610b80565b91505060408301518482036040860152610c808282610ac2565b9150508091505092915050565b604082016000820151610ca36000850182610cbc565b506020820151610cb66020850182610cbc565b50505050565b610cc581611030565b82525050565b600060a0820190508181036000830152610ce58188610bdf565b90508181036020830152610cf9818761091f565b90508181036040830152610d0d818661097e565b90508181036060830152610d2181856109f4565b90508181036080830152610d358184610b21565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610d655760006000fd5b8060405250919050565b600067ffffffffffffffff821115610d875760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610db05760006000fd5b602082029050919050565b600067ffffffffffffffff821115610dd35760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610dfc5760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e255760006000fd5b602082029050919050565b600067ffffffffffffffff821115610e485760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e715760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e9a5760006000fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061ffff82169050919050565b6000819050919050565b61104381611022565b811415156110515760006000fd5b50565b61105d81611030565b8114151561106b5760006000fd5b50565bfea365627a7a72315820d78c6ba7ee332581e6c4d9daa5fc07941841230f7ce49edf6e05b1b63853e8746c6578706572696d656e74616cf564736f6c634300050c0040`}, 1234 []string{` 1235 [{"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"}] 1236 `}, 1237 ` 1238 "math/big" 1239 "reflect" 1240 1241 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1242 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1243 "github.com/ethereum/go-ethereum/core/types" 1244 "github.com/ethereum/go-ethereum/crypto" 1245 `, 1246 1247 ` 1248 key, _ := crypto.GenerateKey() 1249 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1250 1251 sim := backends.NewSimulatedBackend(types.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1252 defer sim.Close() 1253 1254 _, _, contract, err := DeployTuple(auth, sim) 1255 if err != nil { 1256 t.Fatalf("deploy contract failed %v", err) 1257 } 1258 sim.Commit() 1259 1260 check := func(a, b interface{}, errMsg string) { 1261 if !reflect.DeepEqual(a, b) { 1262 t.Fatal(errMsg) 1263 } 1264 } 1265 1266 a := TupleS{ 1267 A: big.NewInt(1), 1268 B: []*big.Int{big.NewInt(2), big.NewInt(3)}, 1269 C: []TupleT{ 1270 { 1271 X: big.NewInt(4), 1272 Y: big.NewInt(5), 1273 }, 1274 { 1275 X: big.NewInt(6), 1276 Y: big.NewInt(7), 1277 }, 1278 }, 1279 } 1280 1281 b := [][2]TupleT{ 1282 { 1283 { 1284 X: big.NewInt(8), 1285 Y: big.NewInt(9), 1286 }, 1287 { 1288 X: big.NewInt(10), 1289 Y: big.NewInt(11), 1290 }, 1291 }, 1292 } 1293 1294 c := [2][]TupleT{ 1295 { 1296 { 1297 X: big.NewInt(12), 1298 Y: big.NewInt(13), 1299 }, 1300 { 1301 X: big.NewInt(14), 1302 Y: big.NewInt(15), 1303 }, 1304 }, 1305 { 1306 { 1307 X: big.NewInt(16), 1308 Y: big.NewInt(17), 1309 }, 1310 }, 1311 } 1312 1313 d := []TupleS{a} 1314 1315 e := []*big.Int{big.NewInt(18), big.NewInt(19)} 1316 ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e) 1317 if err != nil { 1318 t.Fatalf("invoke contract failed, err %v", err) 1319 } 1320 check(ret1, a, "ret1 mismatch") 1321 check(ret2, b, "ret2 mismatch") 1322 check(ret3, c, "ret3 mismatch") 1323 check(ret4, d, "ret4 mismatch") 1324 check(ret5, e, "ret5 mismatch") 1325 1326 _, err = contract.Func2(auth, a, b, c, d, e) 1327 if err != nil { 1328 t.Fatalf("invoke contract failed, err %v", err) 1329 } 1330 sim.Commit() 1331 1332 iter, err := contract.FilterTupleEvent(nil) 1333 if err != nil { 1334 t.Fatalf("failed to create event filter, err %v", err) 1335 } 1336 defer iter.Close() 1337 1338 iter.Next() 1339 check(iter.Event.A, a, "field1 mismatch") 1340 check(iter.Event.B, b, "field2 mismatch") 1341 check(iter.Event.C, c, "field3 mismatch") 1342 check(iter.Event.D, d, "field4 mismatch") 1343 check(iter.Event.E, e, "field5 mismatch") 1344 1345 err = contract.Func3(nil, nil) 1346 if err != nil { 1347 t.Fatalf("failed to call function which has no return, err %v", err) 1348 } 1349 `, 1350 nil, 1351 nil, 1352 nil, 1353 nil, 1354 }, 1355 { 1356 `UseLibrary`, 1357 ` 1358 library Math { 1359 function add(uint a, uint b) public view returns(uint) { 1360 return a + b; 1361 } 1362 } 1363 1364 contract UseLibrary { 1365 function add (uint c, uint d) public view returns(uint) { 1366 return Math.add(c,d); 1367 } 1368 } 1369 `, 1370 []string{ 1371 // Bytecode for the UseLibrary contract 1372 `608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`, 1373 // Bytecode for the Math contract 1374 `60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`, 1375 }, 1376 []string{ 1377 `[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, 1378 `[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, 1379 }, 1380 ` 1381 "math/big" 1382 1383 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1384 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1385 "github.com/ethereum/go-ethereum/core/types" 1386 "github.com/ethereum/go-ethereum/crypto" 1387 `, 1388 ` 1389 // Generate a new random account and a funded simulator 1390 key, _ := crypto.GenerateKey() 1391 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1392 1393 sim := backends.NewSimulatedBackend(types.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1394 defer sim.Close() 1395 1396 //deploy the test contract 1397 _, _, testContract, err := DeployUseLibrary(auth, sim) 1398 if err != nil { 1399 t.Fatalf("Failed to deploy test contract: %v", err) 1400 } 1401 1402 // Finish deploy. 1403 sim.Commit() 1404 1405 // Check that the library contract has been deployed 1406 // by calling the contract's add function. 1407 res, err := testContract.Add(&bind.CallOpts{ 1408 From: auth.From, 1409 Pending: false, 1410 }, big.NewInt(1), big.NewInt(2)) 1411 if err != nil { 1412 t.Fatalf("Failed to call linked contract: %v", err) 1413 } 1414 if res.Cmp(big.NewInt(3)) != 0 { 1415 t.Fatalf("Add did not return the correct result: %d != %d", res, 3) 1416 } 1417 `, 1418 nil, 1419 map[string]string{ 1420 "b98c933f0a6ececcd167bd4f9d3299b1a0": "Math", 1421 }, 1422 nil, 1423 []string{"UseLibrary", "Math"}, 1424 }, { 1425 "Overload", 1426 ` 1427 pragma solidity ^0.5.10; 1428 1429 contract overload { 1430 mapping(address => uint256) balances; 1431 1432 event bar(uint256 i); 1433 event bar(uint256 i, uint256 j); 1434 1435 function foo(uint256 i) public { 1436 emit bar(i); 1437 } 1438 function foo(uint256 i, uint256 j) public { 1439 emit bar(i, j); 1440 } 1441 } 1442 `, 1443 []string{`608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032`}, 1444 []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"}]`}, 1445 ` 1446 "math/big" 1447 "time" 1448 1449 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1450 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1451 "github.com/ethereum/go-ethereum/core/types" 1452 "github.com/ethereum/go-ethereum/crypto" 1453 `, 1454 ` 1455 // Initialize test accounts 1456 key, _ := crypto.GenerateKey() 1457 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1458 sim := backends.NewSimulatedBackend(types.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1459 defer sim.Close() 1460 1461 // deploy the test contract 1462 _, _, contract, err := DeployOverload(auth, sim) 1463 if err != nil { 1464 t.Fatalf("Failed to deploy contract: %v", err) 1465 } 1466 // Finish deploy. 1467 sim.Commit() 1468 1469 resCh, stopCh := make(chan uint64), make(chan struct{}) 1470 1471 go func() { 1472 barSink := make(chan *OverloadBar) 1473 sub, _ := contract.WatchBar(nil, barSink) 1474 defer sub.Unsubscribe() 1475 1476 bar0Sink := make(chan *OverloadBar0) 1477 sub0, _ := contract.WatchBar0(nil, bar0Sink) 1478 defer sub0.Unsubscribe() 1479 1480 for { 1481 select { 1482 case ev := <-barSink: 1483 resCh <- ev.I.Uint64() 1484 case ev := <-bar0Sink: 1485 resCh <- ev.I.Uint64() + ev.J.Uint64() 1486 case <-stopCh: 1487 return 1488 } 1489 } 1490 }() 1491 contract.Foo(auth, big.NewInt(1), big.NewInt(2)) 1492 sim.Commit() 1493 select { 1494 case n := <-resCh: 1495 if n != 3 { 1496 t.Fatalf("Invalid bar0 event") 1497 } 1498 case <-time.NewTimer(3 * time.Second).C: 1499 t.Fatalf("Wait bar0 event timeout") 1500 } 1501 1502 contract.Foo0(auth, big.NewInt(1)) 1503 sim.Commit() 1504 select { 1505 case n := <-resCh: 1506 if n != 1 { 1507 t.Fatalf("Invalid bar event") 1508 } 1509 case <-time.NewTimer(3 * time.Second).C: 1510 t.Fatalf("Wait bar event timeout") 1511 } 1512 close(stopCh) 1513 `, 1514 nil, 1515 nil, 1516 nil, 1517 nil, 1518 }, 1519 { 1520 "IdentifierCollision", 1521 ` 1522 pragma solidity >=0.4.19 <0.6.0; 1523 1524 contract IdentifierCollision { 1525 uint public _myVar; 1526 1527 function MyVar() public view returns (uint) { 1528 return _myVar; 1529 } 1530 } 1531 `, 1532 []string{"60806040523480156100115760006000fd5b50610017565b60c3806100256000396000f3fe608060405234801560105760006000fd5b506004361060365760003560e01c806301ad4d8714603c5780634ef1f0ad146058576036565b60006000fd5b60426074565b6040518082815260200191505060405180910390f35b605e607d565b6040518082815260200191505060405180910390f35b60006000505481565b60006000600050549050608b565b9056fea265627a7a7231582067c8d84688b01c4754ba40a2a871cede94ea1f28b5981593ab2a45b46ac43af664736f6c634300050c0032"}, 1533 []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"}]`}, 1534 ` 1535 "math/big" 1536 1537 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1538 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1539 "github.com/ethereum/go-ethereum/crypto" 1540 "github.com/ethereum/go-ethereum/core/types" 1541 `, 1542 ` 1543 // Initialize test accounts 1544 key, _ := crypto.GenerateKey() 1545 addr := crypto.PubkeyToAddress(key.PublicKey) 1546 1547 // Deploy registrar contract 1548 sim := backends.NewSimulatedBackend(types.GenesisAlloc{addr: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1549 defer sim.Close() 1550 1551 transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1552 _, _, _, err := DeployIdentifierCollision(transactOpts, sim) 1553 if err != nil { 1554 t.Fatalf("failed to deploy contract: %v", err) 1555 } 1556 `, 1557 nil, 1558 nil, 1559 map[string]string{"_myVar": "pubVar"}, // alias MyVar to PubVar 1560 nil, 1561 }, 1562 { 1563 "MultiContracts", 1564 ` 1565 pragma solidity ^0.5.11; 1566 pragma experimental ABIEncoderV2; 1567 1568 library ExternalLib { 1569 struct SharedStruct{ 1570 uint256 f1; 1571 bytes32 f2; 1572 } 1573 } 1574 1575 contract ContractOne { 1576 function foo(ExternalLib.SharedStruct memory s) pure public { 1577 // Do stuff 1578 } 1579 } 1580 1581 contract ContractTwo { 1582 function bar(ExternalLib.SharedStruct memory s) pure public { 1583 // Do stuff 1584 } 1585 } 1586 `, 1587 []string{ 1588 `60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c80639d8a8ba81461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a72315820749274eb7f6c01010d5322af4e1668b0a154409eb7968bd6cae5524c7ed669bb6c6578706572696d656e74616cf564736f6c634300050c0040`, 1589 `60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c8063db8ba08c1461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a723158209bc28ee7ea97c131a13330d77ec73b4493b5c59c648352da81dd288b021192596c6578706572696d656e74616cf564736f6c634300050c0040`, 1590 `606c6026600b82828239805160001a6073141515601857fe5b30600052607381538281f350fe73000000000000000000000000000000000000000030146080604052600436106023575b60006000fdfea365627a7a72315820518f0110144f5b3de95697d05e456a064656890d08e6f9cff47f3be710cc46a36c6578706572696d656e74616cf564736f6c634300050c0040`, 1591 }, 1592 []string{ 1593 `[{"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"}]`, 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":"bar","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`, 1595 `[]`, 1596 }, 1597 ` 1598 "math/big" 1599 1600 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1601 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1602 "github.com/ethereum/go-ethereum/crypto" 1603 "github.com/ethereum/go-ethereum/core/types" 1604 `, 1605 ` 1606 key, _ := crypto.GenerateKey() 1607 addr := crypto.PubkeyToAddress(key.PublicKey) 1608 1609 // Deploy registrar contract 1610 sim := backends.NewSimulatedBackend(types.GenesisAlloc{addr: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1611 defer sim.Close() 1612 1613 transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1614 _, _, c1, err := DeployContractOne(transactOpts, sim) 1615 if err != nil { 1616 t.Fatal("Failed to deploy contract") 1617 } 1618 sim.Commit() 1619 err = c1.Foo(nil, ExternalLibSharedStruct{ 1620 F1: big.NewInt(100), 1621 F2: [32]byte{0x01, 0x02, 0x03}, 1622 }) 1623 if err != nil { 1624 t.Fatal("Failed to invoke function") 1625 } 1626 _, _, c2, err := DeployContractTwo(transactOpts, sim) 1627 if err != nil { 1628 t.Fatal("Failed to deploy contract") 1629 } 1630 sim.Commit() 1631 err = c2.Bar(nil, ExternalLibSharedStruct{ 1632 F1: big.NewInt(100), 1633 F2: [32]byte{0x01, 0x02, 0x03}, 1634 }) 1635 if err != nil { 1636 t.Fatal("Failed to invoke function") 1637 } 1638 `, 1639 nil, 1640 nil, 1641 nil, 1642 []string{"ContractOne", "ContractTwo", "ExternalLib"}, 1643 }, 1644 // Test the existence of the free retrieval calls 1645 { 1646 `PureAndView`, 1647 `pragma solidity >=0.6.0; 1648 contract PureAndView { 1649 function PureFunc() public pure returns (uint) { 1650 return 42; 1651 } 1652 function ViewFunc() public view returns (uint) { 1653 return block.number; 1654 } 1655 } 1656 `, 1657 []string{`608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806376b5686a146037578063bb38c66c146053575b600080fd5b603d606f565b6040518082815260200191505060405180910390f35b60596077565b6040518082815260200191505060405180910390f35b600043905090565b6000602a90509056fea2646970667358221220d158c2ab7fdfce366a7998ec79ab84edd43b9815630bbaede2c760ea77f29f7f64736f6c63430006000033`}, 1658 []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"}]`}, 1659 ` 1660 "math/big" 1661 1662 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1663 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1664 "github.com/ethereum/go-ethereum/core/types" 1665 "github.com/ethereum/go-ethereum/crypto" 1666 `, 1667 ` 1668 // Generate a new random account and a funded simulator 1669 key, _ := crypto.GenerateKey() 1670 auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1671 1672 sim := backends.NewSimulatedBackend(types.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000000000)}}, 10000000) 1673 defer sim.Close() 1674 1675 // Deploy a tester contract and execute a structured call on it 1676 _, _, pav, err := DeployPureAndView(auth, sim) 1677 if err != nil { 1678 t.Fatalf("Failed to deploy PureAndView contract: %v", err) 1679 } 1680 sim.Commit() 1681 1682 // This test the existence of the free retriever call for view and pure functions 1683 if num, err := pav.PureFunc(nil); err != nil { 1684 t.Fatalf("Failed to call anonymous field retriever: %v", err) 1685 } else if num.Cmp(big.NewInt(42)) != 0 { 1686 t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 42) 1687 } 1688 if num, err := pav.ViewFunc(nil); err != nil { 1689 t.Fatalf("Failed to call anonymous field retriever: %v", err) 1690 } else if num.Cmp(big.NewInt(1)) != 0 { 1691 t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 1) 1692 } 1693 `, 1694 nil, 1695 nil, 1696 nil, 1697 nil, 1698 }, 1699 // Test fallback separation introduced in v0.6.0 1700 { 1701 `NewFallbacks`, 1702 ` 1703 pragma solidity >=0.6.0 <0.7.0; 1704 1705 contract NewFallbacks { 1706 event Fallback(bytes data); 1707 fallback() external { 1708 emit Fallback(msg.data); 1709 } 1710 1711 event Received(address addr, uint value); 1712 receive() external payable { 1713 emit Received(msg.sender, msg.value); 1714 } 1715 } 1716 `, 1717 []string{"6080604052348015600f57600080fd5b506101078061001f6000396000f3fe608060405236605f577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1005b348015606a57600080fd5b507f9043988963722edecc2099c75b0af0ff76af14ffca42ed6bce059a20a2a9f98660003660405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a100fea26469706673582212201f994dcfbc53bf610b19176f9a361eafa77b447fd9c796fa2c615dfd0aaf3b8b64736f6c634300060c0033"}, 1718 []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"}]`}, 1719 ` 1720 "bytes" 1721 "math/big" 1722 1723 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1724 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1725 "github.com/ethereum/go-ethereum/core/types" 1726 "github.com/ethereum/go-ethereum/crypto" 1727 `, 1728 ` 1729 key, _ := crypto.GenerateKey() 1730 addr := crypto.PubkeyToAddress(key.PublicKey) 1731 1732 sim := backends.NewSimulatedBackend(types.GenesisAlloc{addr: {Balance: big.NewInt(10000000000000000)}}, 1000000) 1733 defer sim.Close() 1734 1735 opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1736 _, _, c, err := DeployNewFallbacks(opts, sim) 1737 if err != nil { 1738 t.Fatalf("Failed to deploy contract: %v", err) 1739 } 1740 sim.Commit() 1741 1742 // Test receive function 1743 opts.Value = big.NewInt(100) 1744 c.Receive(opts) 1745 sim.Commit() 1746 1747 var gotEvent bool 1748 iter, _ := c.FilterReceived(nil) 1749 defer iter.Close() 1750 for iter.Next() { 1751 if iter.Event.Addr != addr { 1752 t.Fatal("Msg.sender mismatch") 1753 } 1754 if iter.Event.Value.Uint64() != 100 { 1755 t.Fatal("Msg.value mismatch") 1756 } 1757 gotEvent = true 1758 break 1759 } 1760 if !gotEvent { 1761 t.Fatal("Expect to receive event emitted by receive") 1762 } 1763 1764 // Test fallback function 1765 gotEvent = false 1766 opts.Value = nil 1767 calldata := []byte{0x01, 0x02, 0x03} 1768 c.Fallback(opts, calldata) 1769 sim.Commit() 1770 1771 iter2, _ := c.FilterFallback(nil) 1772 defer iter2.Close() 1773 for iter2.Next() { 1774 if !bytes.Equal(iter2.Event.Data, calldata) { 1775 t.Fatal("calldata mismatch") 1776 } 1777 gotEvent = true 1778 break 1779 } 1780 if !gotEvent { 1781 t.Fatal("Expect to receive event emitted by fallback") 1782 } 1783 `, 1784 nil, 1785 nil, 1786 nil, 1787 nil, 1788 }, 1789 // Test resolving single struct argument 1790 { 1791 `NewSingleStructArgument`, 1792 ` 1793 pragma solidity ^0.8.0; 1794 1795 contract NewSingleStructArgument { 1796 struct MyStruct{ 1797 uint256 a; 1798 uint256 b; 1799 } 1800 event StructEvent(MyStruct s); 1801 function TestEvent() public { 1802 emit StructEvent(MyStruct({a: 1, b: 2})); 1803 } 1804 } 1805 `, 1806 []string{"608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806324ec1d3f14602d575b600080fd5b60336035565b005b7fb4b2ff75e30cb4317eaae16dd8a187dd89978df17565104caa6c2797caae27d460405180604001604052806001815260200160028152506040516078919060ba565b60405180910390a1565b6040820160008201516096600085018260ad565b50602082015160a7602085018260ad565b50505050565b60b48160d3565b82525050565b600060408201905060cd60008301846082565b92915050565b600081905091905056fea26469706673582212208823628796125bf9941ce4eda18da1be3cf2931b231708ab848e1bd7151c0c9a64736f6c63430008070033"}, 1807 []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"}]`}, 1808 ` 1809 "math/big" 1810 1811 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1812 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1813 "github.com/ethereum/go-ethereum/core/types" 1814 "github.com/ethereum/go-ethereum/crypto" 1815 "github.com/ethereum/go-ethereum/eth/ethconfig" 1816 `, 1817 ` 1818 var ( 1819 key, _ = crypto.GenerateKey() 1820 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1821 sim = backends.NewSimulatedBackend(types.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil) 1822 ) 1823 defer sim.Close() 1824 1825 _, _, d, err := DeployNewSingleStructArgument(user, sim) 1826 if err != nil { 1827 t.Fatalf("Failed to deploy contract %v", err) 1828 } 1829 sim.Commit() 1830 1831 _, err = d.TestEvent(user) 1832 if err != nil { 1833 t.Fatalf("Failed to call contract %v", err) 1834 } 1835 sim.Commit() 1836 1837 it, err := d.FilterStructEvent(nil) 1838 if err != nil { 1839 t.Fatalf("Failed to filter contract event %v", err) 1840 } 1841 var count int 1842 for it.Next() { 1843 if it.Event.S.A.Cmp(big.NewInt(1)) != 0 { 1844 t.Fatal("Unexpected contract event") 1845 } 1846 if it.Event.S.B.Cmp(big.NewInt(2)) != 0 { 1847 t.Fatal("Unexpected contract event") 1848 } 1849 count += 1 1850 } 1851 if count != 1 { 1852 t.Fatal("Unexpected contract event number") 1853 } 1854 `, 1855 nil, 1856 nil, 1857 nil, 1858 nil, 1859 }, 1860 // Test errors introduced in v0.8.4 1861 { 1862 `NewErrors`, 1863 ` 1864 pragma solidity >0.8.4; 1865 1866 contract NewErrors { 1867 error MyError(uint256); 1868 error MyError1(uint256); 1869 error MyError2(uint256, uint256); 1870 error MyError3(uint256 a, uint256 b, uint256 c); 1871 function Error() public pure { 1872 revert MyError3(1,2,3); 1873 } 1874 } 1875 `, 1876 []string{"0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063726c638214602d575b600080fd5b60336035565b005b60405163024876cd60e61b815260016004820152600260248201526003604482015260640160405180910390fdfea264697066735822122093f786a1bc60216540cd999fbb4a6109e0fef20abcff6e9107fb2817ca968f3c64736f6c63430008070033"}, 1877 []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"}]`}, 1878 ` 1879 "context" 1880 "math/big" 1881 1882 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1883 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1884 "github.com/ethereum/go-ethereum/core/types" 1885 "github.com/ethereum/go-ethereum/crypto" 1886 "github.com/ethereum/go-ethereum/eth/ethconfig" 1887 `, 1888 ` 1889 var ( 1890 key, _ = crypto.GenerateKey() 1891 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1892 sim = backends.NewSimulatedBackend(types.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil) 1893 ) 1894 defer sim.Close() 1895 1896 _, tx, contract, err := DeployNewErrors(user, sim) 1897 if err != nil { 1898 t.Fatal(err) 1899 } 1900 sim.Commit() 1901 _, err = bind.WaitDeployed(context.Background(), sim, tx) 1902 if err != nil { 1903 t.Error(err) 1904 } 1905 if err := contract.Error(new(bind.CallOpts)); err == nil { 1906 t.Fatalf("expected contract to throw error") 1907 } 1908 // TODO (MariusVanDerWijden unpack error using abigen 1909 // once that is implemented 1910 `, 1911 nil, 1912 nil, 1913 nil, 1914 nil, 1915 }, 1916 { 1917 name: `ConstructorWithStructParam`, 1918 contract: ` 1919 pragma solidity >=0.8.0 <0.9.0; 1920 1921 contract ConstructorWithStructParam { 1922 struct StructType { 1923 uint256 field; 1924 } 1925 1926 constructor(StructType memory st) {} 1927 } 1928 `, 1929 bytecode: []string{`0x608060405234801561001057600080fd5b506040516101c43803806101c48339818101604052810190610032919061014a565b50610177565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100958261004c565b810181811067ffffffffffffffff821117156100b4576100b361005d565b5b80604052505050565b60006100c7610038565b90506100d3828261008c565b919050565b6000819050919050565b6100eb816100d8565b81146100f657600080fd5b50565b600081519050610108816100e2565b92915050565b60006020828403121561012457610123610047565b5b61012e60206100bd565b9050600061013e848285016100f9565b60008301525092915050565b6000602082840312156101605761015f610042565b5b600061016e8482850161010e565b91505092915050565b603f806101856000396000f3fe6080604052600080fdfea2646970667358221220cdffa667affecefac5561f65f4a4ba914204a8d4eb859d8cd426fb306e5c12a364736f6c634300080a0033`}, 1930 abi: []string{`[{"inputs":[{"components":[{"internalType":"uint256","name":"field","type":"uint256"}],"internalType":"struct ConstructorWithStructParam.StructType","name":"st","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"}]`}, 1931 imports: ` 1932 "context" 1933 "math/big" 1934 1935 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1936 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1937 "github.com/ethereum/go-ethereum/core/types" 1938 "github.com/ethereum/go-ethereum/crypto" 1939 "github.com/ethereum/go-ethereum/eth/ethconfig" 1940 `, 1941 tester: ` 1942 var ( 1943 key, _ = crypto.GenerateKey() 1944 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1945 sim = backends.NewSimulatedBackend(types.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil) 1946 ) 1947 defer sim.Close() 1948 1949 _, tx, _, err := DeployConstructorWithStructParam(user, sim, ConstructorWithStructParamStructType{Field: big.NewInt(42)}) 1950 if err != nil { 1951 t.Fatalf("DeployConstructorWithStructParam() got err %v; want nil err", err) 1952 } 1953 sim.Commit() 1954 1955 if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil { 1956 t.Logf("Deployment tx: %+v", tx) 1957 t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err) 1958 } 1959 `, 1960 }, 1961 { 1962 name: `NameConflict`, 1963 contract: ` 1964 // SPDX-License-Identifier: GPL-3.0 1965 pragma solidity >=0.4.22 <0.9.0; 1966 contract oracle { 1967 struct request { 1968 bytes data; 1969 bytes _data; 1970 } 1971 event log (int msg, int _msg); 1972 function addRequest(request memory req) public pure {} 1973 function getRequest() pure public returns (request memory) { 1974 return request("", ""); 1975 } 1976 } 1977 `, 1978 bytecode: []string{"0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c2bb515f1461003b578063cce7b04814610059575b600080fd5b610043610075565b60405161005091906101af565b60405180910390f35b610073600480360381019061006e91906103ac565b6100b5565b005b61007d6100b8565b604051806040016040528060405180602001604052806000815250815260200160405180602001604052806000815250815250905090565b50565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561010c5780820151818401526020810190506100f1565b8381111561011b576000848401525b50505050565b6000601f19601f8301169050919050565b600061013d826100d2565b61014781856100dd565b93506101578185602086016100ee565b61016081610121565b840191505092915050565b600060408301600083015184820360008601526101888282610132565b915050602083015184820360208601526101a28282610132565b9150508091505092915050565b600060208201905081810360008301526101c9818461016b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022282610121565b810181811067ffffffffffffffff82111715610241576102406101ea565b5b80604052505050565b60006102546101d1565b90506102608282610219565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561028f5761028e6101ea565b5b61029882610121565b9050602081019050919050565b82818337600083830152505050565b60006102c76102c284610274565b61024a565b9050828152602081018484840111156102e3576102e261026f565b5b6102ee8482856102a5565b509392505050565b600082601f83011261030b5761030a61026a565b5b813561031b8482602086016102b4565b91505092915050565b60006040828403121561033a576103396101e5565b5b610344604061024a565b9050600082013567ffffffffffffffff81111561036457610363610265565b5b610370848285016102f6565b600083015250602082013567ffffffffffffffff81111561039457610393610265565b5b6103a0848285016102f6565b60208301525092915050565b6000602082840312156103c2576103c16101db565b5b600082013567ffffffffffffffff8111156103e0576103df6101e0565b5b6103ec84828501610324565b9150509291505056fea264697066735822122033bca1606af9b6aeba1673f98c52003cec19338539fb44b86690ce82c51483b564736f6c634300080e0033"}, 1979 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" } ]`}, 1980 imports: ` 1981 "context" 1982 "math/big" 1983 1984 "github.com/ethereum/go-ethereum/accounts/abi/bind" 1985 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 1986 "github.com/ethereum/go-ethereum/core/types" 1987 "github.com/ethereum/go-ethereum/crypto" 1988 "github.com/ethereum/go-ethereum/eth/ethconfig" 1989 `, 1990 tester: ` 1991 var ( 1992 key, _ = crypto.GenerateKey() 1993 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 1994 sim = backends.NewSimulatedBackend(types.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil) 1995 ) 1996 defer sim.Close() 1997 1998 _, tx, _, err := DeployNameConflict(user, sim) 1999 if err != nil { 2000 t.Fatalf("DeployNameConflict() got err %v; want nil err", err) 2001 } 2002 sim.Commit() 2003 2004 if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil { 2005 t.Logf("Deployment tx: %+v", tx) 2006 t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err) 2007 } 2008 `, 2009 }, 2010 { 2011 name: "RangeKeyword", 2012 contract: ` 2013 // SPDX-License-Identifier: GPL-3.0 2014 pragma solidity >=0.4.22 <0.9.0; 2015 contract keywordcontract { 2016 function functionWithKeywordParameter(range uint256) public pure {} 2017 } 2018 `, 2019 bytecode: []string{"0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063527a119f14602d575b600080fd5b60436004803603810190603f9190605b565b6045565b005b50565b6000813590506055816092565b92915050565b600060208284031215606e57606d608d565b5b6000607a848285016048565b91505092915050565b6000819050919050565b600080fd5b6099816083565b811460a357600080fd5b5056fea2646970667358221220d4f4525e2615516394055d369fb17df41c359e5e962734f27fd683ea81fd9db164736f6c63430008070033"}, 2020 abi: []string{`[{"inputs":[{"internalType":"uint256","name":"range","type":"uint256"}],"name":"functionWithKeywordParameter","outputs":[],"stateMutability":"pure","type":"function"}]`}, 2021 imports: ` 2022 "context" 2023 "math/big" 2024 2025 "github.com/ethereum/go-ethereum/accounts/abi/bind" 2026 "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" 2027 "github.com/ethereum/go-ethereum/core/types" 2028 "github.com/ethereum/go-ethereum/crypto" 2029 "github.com/ethereum/go-ethereum/eth/ethconfig" 2030 `, 2031 tester: ` 2032 var ( 2033 key, _ = crypto.GenerateKey() 2034 user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) 2035 sim = backends.NewSimulatedBackend(types.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, ethconfig.Defaults.Miner.GasCeil) 2036 ) 2037 _, tx, _, err := DeployRangeKeyword(user, sim) 2038 if err != nil { 2039 t.Fatalf("error deploying contract: %v", err) 2040 } 2041 sim.Commit() 2042 2043 if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil { 2044 t.Errorf("error deploying the contract: %v", err) 2045 } 2046 `, 2047 }, { 2048 name: "NumericMethodName", 2049 contract: ` 2050 // SPDX-License-Identifier: GPL-3.0 2051 pragma solidity >=0.4.22 <0.9.0; 2052 2053 contract NumericMethodName { 2054 event _1TestEvent(address _param); 2055 function _1test() public pure {} 2056 function __1test() public pure {} 2057 function __2test() public pure {} 2058 } 2059 `, 2060 bytecode: []string{"0x6080604052348015600f57600080fd5b5060958061001e6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80639d993132146041578063d02767c7146049578063ffa02795146051575b600080fd5b60476059565b005b604f605b565b005b6057605d565b005b565b565b56fea26469706673582212200382ca602dff96a7e2ba54657985e2b4ac423a56abe4a1f0667bc635c4d4371f64736f6c63430008110033"}, 2061 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"}]`}, 2062 imports: ` 2063 "github.com/ethereum/go-ethereum/common" 2064 `, 2065 tester: ` 2066 if b, err := NewNumericMethodName(common.Address{}, nil); b == nil || err != nil { 2067 t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil) 2068 } 2069 `, 2070 }, 2071 } 2072 2073 // Tests that packages generated by the binder can be successfully compiled and 2074 // the requested tester run against it. 2075 func TestGolangBindings(t *testing.T) { 2076 t.Parallel() 2077 // Skip the test if no Go command can be found 2078 gocmd := runtime.GOROOT() + "/bin/go" 2079 if !common.FileExist(gocmd) { 2080 t.Skip("go sdk not found for testing") 2081 } 2082 // Create a temporary workspace for the test suite 2083 ws := t.TempDir() 2084 2085 pkg := filepath.Join(ws, "bindtest") 2086 if err := os.MkdirAll(pkg, 0700); err != nil { 2087 t.Fatalf("failed to create package: %v", err) 2088 } 2089 // Generate the test suite for all the contracts 2090 for i, tt := range bindTests { 2091 t.Run(tt.name, func(t *testing.T) { 2092 var types []string 2093 if tt.types != nil { 2094 types = tt.types 2095 } else { 2096 types = []string{tt.name} 2097 } 2098 // Generate the binding and create a Go source file in the workspace 2099 bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases) 2100 if err != nil { 2101 t.Fatalf("test %d: failed to generate binding: %v", i, err) 2102 } 2103 if err = os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil { 2104 t.Fatalf("test %d: failed to write binding: %v", i, err) 2105 } 2106 // Generate the test file with the injected test code 2107 code := fmt.Sprintf(` 2108 package bindtest 2109 2110 import ( 2111 "testing" 2112 %s 2113 ) 2114 2115 func Test%s(t *testing.T) { 2116 %s 2117 } 2118 `, tt.imports, tt.name, tt.tester) 2119 if err := os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { 2120 t.Fatalf("test %d: failed to write tests: %v", i, err) 2121 } 2122 }) 2123 } 2124 // Convert the package to go modules and use the current source for go-ethereum 2125 moder := exec.Command(gocmd, "mod", "init", "bindtest") 2126 moder.Dir = pkg 2127 if out, err := moder.CombinedOutput(); err != nil { 2128 t.Fatalf("failed to convert binding test to modules: %v\n%s", err, out) 2129 } 2130 pwd, _ := os.Getwd() 2131 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 2132 replacer.Dir = pkg 2133 if out, err := replacer.CombinedOutput(); err != nil { 2134 t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out) 2135 } 2136 tidier := exec.Command(gocmd, "mod", "tidy") 2137 tidier.Dir = pkg 2138 if out, err := tidier.CombinedOutput(); err != nil { 2139 t.Fatalf("failed to tidy Go module file: %v\n%s", err, out) 2140 } 2141 // Test the entire package and report any failures 2142 cmd := exec.Command(gocmd, "test", "-v", "-count", "1") 2143 cmd.Dir = pkg 2144 if out, err := cmd.CombinedOutput(); err != nil { 2145 t.Fatalf("failed to run binding test: %v\n%s", err, out) 2146 } 2147 }