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