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