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