github.com/ethereum/go-ethereum@v1.14.3/accounts/abi/bind/bind_test.go (about)

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