github.com/ethereum/go-ethereum@v1.16.1/accounts/abi/abigen/bind_test.go (about)

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