github.com/guiltylotus/go-ethereum@v1.9.7/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  	types    []string
    42  }{
    43  	// Test that the binding is available in combined and separate forms too
    44  	{
    45  		`Empty`,
    46  		`contract NilContract {}`,
    47  		[]string{`606060405260068060106000396000f3606060405200`},
    48  		[]string{`[]`},
    49  		`"github.com/ethereum/go-ethereum/common"`,
    50  		`
    51  			if b, err := NewEmpty(common.Address{}, nil); b == nil || err != nil {
    52  				t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil)
    53  			}
    54  			if b, err := NewEmptyCaller(common.Address{}, nil); b == nil || err != nil {
    55  				t.Fatalf("caller binding (%v) nil or error (%v) not nil", b, nil)
    56  			}
    57  			if b, err := NewEmptyTransactor(common.Address{}, nil); b == nil || err != nil {
    58  				t.Fatalf("transactor binding (%v) nil or error (%v) not nil", b, nil)
    59  			}
    60  		`,
    61  		nil,
    62  		nil,
    63  		nil,
    64  	},
    65  	// Test that all the official sample contracts bind correctly
    66  	{
    67  		`Token`,
    68  		`https://ethereum.org/token`,
    69  		[]string{`60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`},
    70  		[]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"}]`},
    71  		`"github.com/ethereum/go-ethereum/common"`,
    72  		`
    73  			if b, err := NewToken(common.Address{}, nil); b == nil || err != nil {
    74  				t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
    75  			}
    76  		`,
    77  		nil,
    78  		nil,
    79  		nil,
    80  	},
    81  	{
    82  		`Crowdsale`,
    83  		`https://ethereum.org/crowdsale`,
    84  		[]string{`606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`},
    85  		[]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"}]`},
    86  		`"github.com/ethereum/go-ethereum/common"`,
    87  		`
    88  			if b, err := NewCrowdsale(common.Address{}, nil); b == nil || err != nil {
    89  				t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
    90  			}
    91  		`,
    92  		nil,
    93  		nil,
    94  		nil,
    95  	},
    96  	{
    97  		`DAO`,
    98  		`https://ethereum.org/dao`,
    99  		[]string{`606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`},
   100  		[]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"}]`},
   101  		`"github.com/ethereum/go-ethereum/common"`,
   102  		`
   103  			if b, err := NewDAO(common.Address{}, nil); b == nil || err != nil {
   104  				t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   105  			}
   106  		`,
   107  		nil,
   108  		nil,
   109  		nil,
   110  	},
   111  	// Test that named and anonymous inputs are handled correctly
   112  	{
   113  		`InputChecker`, ``, []string{``},
   114  		[]string{`
   115  			[
   116  				{"type":"function","name":"noInput","constant":true,"inputs":[],"outputs":[]},
   117  				{"type":"function","name":"namedInput","constant":true,"inputs":[{"name":"str","type":"string"}],"outputs":[]},
   118  				{"type":"function","name":"anonInput","constant":true,"inputs":[{"name":"","type":"string"}],"outputs":[]},
   119  				{"type":"function","name":"namedInputs","constant":true,"inputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}],"outputs":[]},
   120  				{"type":"function","name":"anonInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"outputs":[]},
   121  				{"type":"function","name":"mixedInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"str","type":"string"}],"outputs":[]}
   122  			]
   123  		`},
   124  		`
   125  			"fmt"
   126  
   127  			"github.com/ethereum/go-ethereum/common"
   128  		`,
   129  		`if b, err := NewInputChecker(common.Address{}, nil); b == nil || err != nil {
   130  			 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   131  		 } else if false { // Don't run, just compile and test types
   132  			 var err error
   133  
   134  			 err = b.NoInput(nil)
   135  			 err = b.NamedInput(nil, "")
   136  			 err = b.AnonInput(nil, "")
   137  			 err = b.NamedInputs(nil, "", "")
   138  			 err = b.AnonInputs(nil, "", "")
   139  			 err = b.MixedInputs(nil, "", "")
   140  
   141  			 fmt.Println(err)
   142  		 }`,
   143  		nil,
   144  		nil,
   145  		nil,
   146  	},
   147  	// Test that named and anonymous outputs are handled correctly
   148  	{
   149  		`OutputChecker`, ``, []string{``},
   150  		[]string{`
   151  			[
   152  				{"type":"function","name":"noOutput","constant":true,"inputs":[],"outputs":[]},
   153  				{"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]},
   154  				{"type":"function","name":"anonOutput","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"}]},
   155  				{"type":"function","name":"namedOutputs","constant":true,"inputs":[],"outputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}]},
   156  				{"type":"function","name":"collidingOutputs","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"},{"name":"Str","type":"string"}]},
   157  				{"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]},
   158  				{"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]}
   159  			]
   160  		`},
   161  		`
   162  			"fmt"
   163  
   164  			"github.com/ethereum/go-ethereum/common"
   165  		`,
   166  		`if b, err := NewOutputChecker(common.Address{}, nil); b == nil || err != nil {
   167  			 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   168  		 } else if false { // Don't run, just compile and test types
   169  			 var str1, str2 string
   170  			 var err error
   171  
   172  			 err              = b.NoOutput(nil)
   173  			 str1, err        = b.NamedOutput(nil)
   174  			 str1, err        = b.AnonOutput(nil)
   175  			 res, _          := b.NamedOutputs(nil)
   176  			 str1, str2, err  = b.CollidingOutputs(nil)
   177  			 str1, str2, err  = b.AnonOutputs(nil)
   178  			 str1, str2, err  = b.MixedOutputs(nil)
   179  
   180  			 fmt.Println(str1, str2, res.Str1, res.Str2, err)
   181  		 }`,
   182  		nil,
   183  		nil,
   184  		nil,
   185  	},
   186  	// Tests that named, anonymous and indexed events are handled correctly
   187  	{
   188  		`EventChecker`, ``, []string{``},
   189  		[]string{`
   190  			[
   191  				{"type":"event","name":"empty","inputs":[]},
   192  				{"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]},
   193  				{"type":"event","name":"mixed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256"}]},
   194  				{"type":"event","name":"anonymous","anonymous":true,"inputs":[]},
   195  				{"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"}]}
   196  			]
   197  		`},
   198  		`
   199  			"fmt"
   200  			"math/big"
   201  			"reflect"
   202  
   203  			"github.com/ethereum/go-ethereum/common"
   204  		`,
   205  		`if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil {
   206  			 t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil)
   207  		 } else if false { // Don't run, just compile and test types
   208  			 var (
   209  				 err  error
   210  			   res  bool
   211  				 str  string
   212  				 dat  []byte
   213  				 hash common.Hash
   214  			 )
   215  			 _, err = e.FilterEmpty(nil)
   216  			 _, err = e.FilterIndexed(nil, []common.Address{}, []*big.Int{})
   217  
   218  			 mit, err := e.FilterMixed(nil, []common.Address{})
   219  
   220  			 res = mit.Next()  // Make sure the iterator has a Next method
   221  			 err = mit.Error() // Make sure the iterator has an Error method
   222  			 err = mit.Close() // Make sure the iterator has a Close method
   223  
   224  			 fmt.Println(mit.Event.Raw.BlockHash) // Make sure the raw log is contained within the results
   225  			 fmt.Println(mit.Event.Num)           // Make sure the unpacked non-indexed fields are present
   226  			 fmt.Println(mit.Event.Addr)          // Make sure the reconstructed indexed fields are present
   227  
   228  			 dit, err := e.FilterDynamic(nil, []string{}, [][]byte{})
   229  
   230  			 str  = dit.Event.Str    // Make sure non-indexed strings retain their type
   231  			 dat  = dit.Event.Dat    // Make sure non-indexed bytes retain their type
   232  			 hash = dit.Event.IdxStr // Make sure indexed strings turn into hashes
   233  			 hash = dit.Event.IdxDat // Make sure indexed bytes turn into hashes
   234  
   235  			 sink := make(chan *EventCheckerMixed)
   236  			 sub, err := e.WatchMixed(nil, sink, []common.Address{})
   237  			 defer sub.Unsubscribe()
   238  
   239  			 event := <-sink
   240  			 fmt.Println(event.Raw.BlockHash) // Make sure the raw log is contained within the results
   241  			 fmt.Println(event.Num)           // Make sure the unpacked non-indexed fields are present
   242  			 fmt.Println(event.Addr)          // Make sure the reconstructed indexed fields are present
   243  
   244  			 fmt.Println(res, str, dat, hash, err)
   245  		 }
   246  		 // Run a tiny reflection test to ensure disallowed methods don't appear
   247  		 if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok {
   248  		 	t.Errorf("binding has disallowed method (FilterAnonymous)")
   249  		 }`,
   250  		nil,
   251  		nil,
   252  		nil,
   253  	},
   254  	// Test that contract interactions (deploy, transact and call) generate working code
   255  	{
   256  		`Interactor`,
   257  		`
   258  			contract Interactor {
   259  				string public deployString;
   260  				string public transactString;
   261  
   262  				function Interactor(string str) {
   263  				  deployString = str;
   264  				}
   265  
   266  				function transact(string str) {
   267  				  transactString = str;
   268  				}
   269  			}
   270  		`,
   271  		[]string{`6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`},
   272  		[]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"}]`},
   273  		`
   274  			"math/big"
   275  
   276  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   277  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   278  			"github.com/ethereum/go-ethereum/core"
   279  			"github.com/ethereum/go-ethereum/crypto"
   280  		`,
   281  		`
   282  			// Generate a new random account and a funded simulator
   283  			key, _ := crypto.GenerateKey()
   284  			auth := bind.NewKeyedTransactor(key)
   285  
   286  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   287  			defer sim.Close()
   288  
   289  			// Deploy an interaction tester contract and call a transaction on it
   290  			_, _, interactor, err := DeployInteractor(auth, sim, "Deploy string")
   291  			if err != nil {
   292  				t.Fatalf("Failed to deploy interactor contract: %v", err)
   293  			}
   294  			if _, err := interactor.Transact(auth, "Transact string"); err != nil {
   295  				t.Fatalf("Failed to transact with interactor contract: %v", err)
   296  			}
   297  			// Commit all pending transactions in the simulator and check the contract state
   298  			sim.Commit()
   299  
   300  			if str, err := interactor.DeployString(nil); err != nil {
   301  				t.Fatalf("Failed to retrieve deploy string: %v", err)
   302  			} else if str != "Deploy string" {
   303  				t.Fatalf("Deploy string mismatch: have '%s', want 'Deploy string'", str)
   304  			}
   305  			if str, err := interactor.TransactString(nil); err != nil {
   306  				t.Fatalf("Failed to retrieve transact string: %v", err)
   307  			} else if str != "Transact string" {
   308  				t.Fatalf("Transact string mismatch: have '%s', want 'Transact string'", str)
   309  			}
   310  		`,
   311  		nil,
   312  		nil,
   313  		nil,
   314  	},
   315  	// Tests that plain values can be properly returned and deserialized
   316  	{
   317  		`Getter`,
   318  		`
   319  			contract Getter {
   320  				function getter() constant returns (string, int, bytes32) {
   321  					return ("Hi", 1, sha3(""));
   322  				}
   323  			}
   324  		`,
   325  		[]string{`606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`},
   326  		[]string{`[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`},
   327  		`
   328  			"math/big"
   329  
   330  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   331  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   332  			"github.com/ethereum/go-ethereum/core"
   333  			"github.com/ethereum/go-ethereum/crypto"
   334  		`,
   335  		`
   336  			// Generate a new random account and a funded simulator
   337  			key, _ := crypto.GenerateKey()
   338  			auth := bind.NewKeyedTransactor(key)
   339  
   340  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   341  			defer sim.Close()
   342  
   343  			// Deploy a tuple tester contract and execute a structured call on it
   344  			_, _, getter, err := DeployGetter(auth, sim)
   345  			if err != nil {
   346  				t.Fatalf("Failed to deploy getter contract: %v", err)
   347  			}
   348  			sim.Commit()
   349  
   350  			if str, num, _, err := getter.Getter(nil); err != nil {
   351  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
   352  			} else if str != "Hi" || num.Cmp(big.NewInt(1)) != 0 {
   353  				t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", str, num, "Hi", 1)
   354  			}
   355  		`,
   356  		nil,
   357  		nil,
   358  		nil,
   359  	},
   360  	// Tests that tuples can be properly returned and deserialized
   361  	{
   362  		`Tupler`,
   363  		`
   364  			contract Tupler {
   365  				function tuple() constant returns (string a, int b, bytes32 c) {
   366  					return ("Hi", 1, sha3(""));
   367  				}
   368  			}
   369  		`,
   370  		[]string{`606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`},
   371  		[]string{`[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`},
   372  		`
   373  			"math/big"
   374  
   375  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   376  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   377  			"github.com/ethereum/go-ethereum/core"
   378  			"github.com/ethereum/go-ethereum/crypto"
   379  		`,
   380  		`
   381  			// Generate a new random account and a funded simulator
   382  			key, _ := crypto.GenerateKey()
   383  			auth := bind.NewKeyedTransactor(key)
   384  
   385  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   386  			defer sim.Close()
   387  
   388  			// Deploy a tuple tester contract and execute a structured call on it
   389  			_, _, tupler, err := DeployTupler(auth, sim)
   390  			if err != nil {
   391  				t.Fatalf("Failed to deploy tupler contract: %v", err)
   392  			}
   393  			sim.Commit()
   394  
   395  			if res, err := tupler.Tuple(nil); err != nil {
   396  				t.Fatalf("Failed to call structure retriever: %v", err)
   397  			} else if res.A != "Hi" || res.B.Cmp(big.NewInt(1)) != 0 {
   398  				t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", res.A, res.B, "Hi", 1)
   399  			}
   400  		`,
   401  		nil,
   402  		nil,
   403  		nil,
   404  	},
   405  	// Tests that arrays/slices can be properly returned and deserialized.
   406  	// Only addresses are tested, remainder just compiled to keep the test small.
   407  	{
   408  		`Slicer`,
   409  		`
   410  			contract Slicer {
   411  				function echoAddresses(address[] input) constant returns (address[] output) {
   412  					return input;
   413  				}
   414  				function echoInts(int[] input) constant returns (int[] output) {
   415  					return input;
   416  				}
   417  				function echoFancyInts(uint24[23] input) constant returns (uint24[23] output) {
   418  					return input;
   419  				}
   420  				function echoBools(bool[] input) constant returns (bool[] output) {
   421  					return input;
   422  				}
   423  			}
   424  		`,
   425  		[]string{`606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`},
   426  		[]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"}]`},
   427  		`
   428  			"math/big"
   429  			"reflect"
   430  
   431  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   432  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   433  			"github.com/ethereum/go-ethereum/common"
   434  			"github.com/ethereum/go-ethereum/core"
   435  			"github.com/ethereum/go-ethereum/crypto"
   436  		`,
   437  		`
   438  			// Generate a new random account and a funded simulator
   439  			key, _ := crypto.GenerateKey()
   440  			auth := bind.NewKeyedTransactor(key)
   441  
   442  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   443  			defer sim.Close()
   444  
   445  			// Deploy a slice tester contract and execute a n array call on it
   446  			_, _, slicer, err := DeploySlicer(auth, sim)
   447  			if err != nil {
   448  					t.Fatalf("Failed to deploy slicer contract: %v", err)
   449  			}
   450  			sim.Commit()
   451  
   452  			if out, err := slicer.EchoAddresses(nil, []common.Address{auth.From, common.Address{}}); err != nil {
   453  					t.Fatalf("Failed to call slice echoer: %v", err)
   454  			} else if !reflect.DeepEqual(out, []common.Address{auth.From, common.Address{}}) {
   455  					t.Fatalf("Slice return mismatch: have %v, want %v", out, []common.Address{auth.From, common.Address{}})
   456  			}
   457  		`,
   458  		nil,
   459  		nil,
   460  		nil,
   461  	},
   462  	// Tests that anonymous default methods can be correctly invoked
   463  	{
   464  		`Defaulter`,
   465  		`
   466  			contract Defaulter {
   467  				address public caller;
   468  
   469  				function() {
   470  					caller = msg.sender;
   471  				}
   472  			}
   473  		`,
   474  		[]string{`6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`},
   475  		[]string{`[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`},
   476  		`
   477  			"math/big"
   478  
   479  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   480  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   481  			"github.com/ethereum/go-ethereum/core"
   482  			"github.com/ethereum/go-ethereum/crypto"
   483  		`,
   484  		`
   485  			// Generate a new random account and a funded simulator
   486  			key, _ := crypto.GenerateKey()
   487  			auth := bind.NewKeyedTransactor(key)
   488  
   489  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   490  			defer sim.Close()
   491  
   492  			// Deploy a default method invoker contract and execute its default method
   493  			_, _, defaulter, err := DeployDefaulter(auth, sim)
   494  			if err != nil {
   495  				t.Fatalf("Failed to deploy defaulter contract: %v", err)
   496  			}
   497  			if _, err := (&DefaulterRaw{defaulter}).Transfer(auth); err != nil {
   498  				t.Fatalf("Failed to invoke default method: %v", err)
   499  			}
   500  			sim.Commit()
   501  
   502  			if caller, err := defaulter.Caller(nil); err != nil {
   503  				t.Fatalf("Failed to call address retriever: %v", err)
   504  			} else if (caller != auth.From) {
   505  				t.Fatalf("Address mismatch: have %v, want %v", caller, auth.From)
   506  			}
   507  		`,
   508  		nil,
   509  		nil,
   510  		nil,
   511  	},
   512  	// Tests that non-existent contracts are reported as such (though only simulator test)
   513  	{
   514  		`NonExistent`,
   515  		`
   516  			contract NonExistent {
   517  				function String() constant returns(string) {
   518  					return "I don't exist";
   519  				}
   520  			}
   521  		`,
   522  		[]string{`6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`},
   523  		[]string{`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`},
   524  		`
   525  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   526  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   527  			"github.com/ethereum/go-ethereum/common"
   528  			"github.com/ethereum/go-ethereum/core"
   529  		`,
   530  		`
   531  			// Create a simulator and wrap a non-deployed contract
   532  
   533  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000))
   534  			defer sim.Close()
   535  
   536  			nonexistent, err := NewNonExistent(common.Address{}, sim)
   537  			if err != nil {
   538  				t.Fatalf("Failed to access non-existent contract: %v", err)
   539  			}
   540  			// Ensure that contract calls fail with the appropriate error
   541  			if res, err := nonexistent.String(nil); err == nil {
   542  				t.Fatalf("Call succeeded on non-existent contract: %v", res)
   543  			} else if (err != bind.ErrNoCode) {
   544  				t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode)
   545  			}
   546  		`,
   547  		nil,
   548  		nil,
   549  		nil,
   550  	},
   551  	// Tests that gas estimation works for contracts with weird gas mechanics too.
   552  	{
   553  		`FunkyGasPattern`,
   554  		`
   555  			contract FunkyGasPattern {
   556  				string public field;
   557  
   558  				function SetField(string value) {
   559  					// This check will screw gas estimation! Good, good!
   560  					if (msg.gas < 100000) {
   561  						throw;
   562  					}
   563  					field = value;
   564  				}
   565  			}
   566  		`,
   567  		[]string{`606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`},
   568  		[]string{`[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`},
   569  		`
   570  			"math/big"
   571  
   572  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   573  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   574  			"github.com/ethereum/go-ethereum/core"
   575  			"github.com/ethereum/go-ethereum/crypto"
   576  		`,
   577  		`
   578  			// Generate a new random account and a funded simulator
   579  			key, _ := crypto.GenerateKey()
   580  			auth := bind.NewKeyedTransactor(key)
   581  
   582  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   583  			defer sim.Close()
   584  
   585  			// Deploy a funky gas pattern contract
   586  			_, _, limiter, err := DeployFunkyGasPattern(auth, sim)
   587  			if err != nil {
   588  				t.Fatalf("Failed to deploy funky contract: %v", err)
   589  			}
   590  			sim.Commit()
   591  
   592  			// Set the field with automatic estimation and check that it succeeds
   593  			if _, err := limiter.SetField(auth, "automatic"); err != nil {
   594  				t.Fatalf("Failed to call automatically gased transaction: %v", err)
   595  			}
   596  			sim.Commit()
   597  
   598  			if field, _ := limiter.Field(nil); field != "automatic" {
   599  				t.Fatalf("Field mismatch: have %v, want %v", field, "automatic")
   600  			}
   601  		`,
   602  		nil,
   603  		nil,
   604  		nil,
   605  	},
   606  	// Test that constant functions can be called from an (optional) specified address
   607  	{
   608  		`CallFrom`,
   609  		`
   610  			contract CallFrom {
   611  				function callFrom() constant returns(address) {
   612  					return msg.sender;
   613  				}
   614  			}
   615  		`, []string{`6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`},
   616  		[]string{`[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`},
   617  		`
   618  			"math/big"
   619  
   620  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   621  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   622  			"github.com/ethereum/go-ethereum/common"
   623  			"github.com/ethereum/go-ethereum/core"
   624  			"github.com/ethereum/go-ethereum/crypto"
   625  		`,
   626  		`
   627  			// Generate a new random account and a funded simulator
   628  			key, _ := crypto.GenerateKey()
   629  			auth := bind.NewKeyedTransactor(key)
   630  
   631  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   632  			defer sim.Close()
   633  
   634  			// Deploy a sender tester contract and execute a structured call on it
   635  			_, _, callfrom, err := DeployCallFrom(auth, sim)
   636  			if err != nil {
   637  				t.Fatalf("Failed to deploy sender contract: %v", err)
   638  			}
   639  			sim.Commit()
   640  
   641  			if res, err := callfrom.CallFrom(nil); err != nil {
   642  				t.Errorf("Failed to call constant function: %v", err)
   643  			} else if res != (common.Address{}) {
   644  				t.Errorf("Invalid address returned, want: %x, got: %x", (common.Address{}), res)
   645  			}
   646  
   647  			for _, addr := range []common.Address{common.Address{}, common.Address{1}, common.Address{2}} {
   648  				if res, err := callfrom.CallFrom(&bind.CallOpts{From: addr}); err != nil {
   649  					t.Fatalf("Failed to call constant function: %v", err)
   650  				} else if res != addr {
   651  					t.Fatalf("Invalid address returned, want: %x, got: %x", addr, res)
   652  				}
   653  			}
   654  		`,
   655  		nil,
   656  		nil,
   657  		nil,
   658  	},
   659  	// Tests that methods and returns with underscores inside work correctly.
   660  	{
   661  		`Underscorer`,
   662  		`
   663  		contract Underscorer {
   664  			function UnderscoredOutput() constant returns (int _int, string _string) {
   665  				return (314, "pi");
   666  			}
   667  			function LowerLowerCollision() constant returns (int _res, int res) {
   668  				return (1, 2);
   669  			}
   670  			function LowerUpperCollision() constant returns (int _res, int Res) {
   671  				return (1, 2);
   672  			}
   673  			function UpperLowerCollision() constant returns (int _Res, int res) {
   674  				return (1, 2);
   675  			}
   676  			function UpperUpperCollision() constant returns (int _Res, int Res) {
   677  				return (1, 2);
   678  			}
   679  			function PurelyUnderscoredOutput() constant returns (int _, int res) {
   680  				return (1, 2);
   681  			}
   682  			function AllPurelyUnderscoredOutput() constant returns (int _, int __) {
   683  				return (1, 2);
   684  			}
   685  			function _under_scored_func() constant returns (int _int) {
   686  				return 0;
   687  			}
   688  		}
   689  		`, []string{`6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`},
   690  		[]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"}]`},
   691  		`
   692  			"fmt"
   693  			"math/big"
   694  
   695  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   696  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   697  			"github.com/ethereum/go-ethereum/core"
   698  			"github.com/ethereum/go-ethereum/crypto"
   699  		`,
   700  		`
   701  			// Generate a new random account and a funded simulator
   702  			key, _ := crypto.GenerateKey()
   703  			auth := bind.NewKeyedTransactor(key)
   704  
   705  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   706  			defer sim.Close()
   707  
   708  			// Deploy a underscorer tester contract and execute a structured call on it
   709  			_, _, underscorer, err := DeployUnderscorer(auth, sim)
   710  			if err != nil {
   711  				t.Fatalf("Failed to deploy underscorer contract: %v", err)
   712  			}
   713  			sim.Commit()
   714  
   715  			// Verify that underscored return values correctly parse into structs
   716  			if res, err := underscorer.UnderscoredOutput(nil); err != nil {
   717  				t.Errorf("Failed to call constant function: %v", err)
   718  			} else if res.Int.Cmp(big.NewInt(314)) != 0 || res.String != "pi" {
   719  				t.Errorf("Invalid result, want: {314, \"pi\"}, got: %+v", res)
   720  			}
   721  			// Verify that underscored and non-underscored name collisions force tuple outputs
   722  			var a, b *big.Int
   723  
   724  			a, b, _ = underscorer.LowerLowerCollision(nil)
   725  			a, b, _ = underscorer.LowerUpperCollision(nil)
   726  			a, b, _ = underscorer.UpperLowerCollision(nil)
   727  			a, b, _ = underscorer.UpperUpperCollision(nil)
   728  			a, b, _ = underscorer.PurelyUnderscoredOutput(nil)
   729  			a, b, _ = underscorer.AllPurelyUnderscoredOutput(nil)
   730  			a, _ = underscorer.UnderScoredFunc(nil)
   731  
   732  			fmt.Println(a, b, err)
   733  		`,
   734  		nil,
   735  		nil,
   736  		nil,
   737  	},
   738  	// Tests that logs can be successfully filtered and decoded.
   739  	{
   740  		`Eventer`,
   741  		`
   742  			contract Eventer {
   743  				event SimpleEvent (
   744  					address indexed Addr,
   745  					bytes32 indexed Id,
   746  					bool    indexed Flag,
   747  					uint    Value
   748  				);
   749  				function raiseSimpleEvent(address addr, bytes32 id, bool flag, uint value) {
   750  					SimpleEvent(addr, id, flag, value);
   751  				}
   752  
   753  				event NodataEvent (
   754  					uint   indexed Number,
   755  					int16  indexed Short,
   756  					uint32 indexed Long
   757  				);
   758  				function raiseNodataEvent(uint number, int16 short, uint32 long) {
   759  					NodataEvent(number, short, long);
   760  				}
   761  
   762  				event DynamicEvent (
   763  					string indexed IndexedString,
   764  					bytes  indexed IndexedBytes,
   765  					string NonIndexedString,
   766  					bytes  NonIndexedBytes
   767  				);
   768  				function raiseDynamicEvent(string str, bytes blob) {
   769  					DynamicEvent(str, blob, str, blob);
   770  				}
   771  
   772  				event FixedBytesEvent (
   773  					bytes24 indexed IndexedBytes,
   774  					bytes24 NonIndexedBytes
   775  				);
   776  				function raiseFixedBytesEvent(bytes24 blob) {
   777  					FixedBytesEvent(blob, blob);
   778  				}
   779  			}
   780  		`,
   781  		[]string{`608060405234801561001057600080fd5b5061043f806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663528300ff8114610066578063630c31e2146100ff5780636cc6b94014610138578063c7d116dd1461015b575b600080fd5b34801561007257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100fd94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506101829650505050505050565b005b34801561010b57600080fd5b506100fd73ffffffffffffffffffffffffffffffffffffffff60043516602435604435151560643561033c565b34801561014457600080fd5b506100fd67ffffffffffffffff1960043516610394565b34801561016757600080fd5b506100fd60043560243560010b63ffffffff604435166103d6565b806040518082805190602001908083835b602083106101b25780518252601f199092019160209182019101610193565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955087945090928392508401908083835b6020831061020b5780518252601f1990920191602091820191016101ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561029c578181015183820152602001610284565b50505050905090810190601f1680156102c95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102fc5781810151838201526020016102e4565b50505050905090810190601f1680156103295780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b60408051828152905183151591859173ffffffffffffffffffffffffffffffffffffffff8816917f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8919081900360200190a450505050565b6040805167ffffffffffffffff19831680825291517fcdc4c1b1aed5524ffb4198d7a5839a34712baef5fa06884fac7559f4a5854e0a9181900360200190a250565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820468b5843bf653145bd924b323c64ef035d3dd922c170644b44d61aa666ea6eee0029`},
   782  		[]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"}]`},
   783  		`
   784  			"math/big"
   785  			"time"
   786  
   787  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   788  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   789  			"github.com/ethereum/go-ethereum/common"
   790  			"github.com/ethereum/go-ethereum/core"
   791  			"github.com/ethereum/go-ethereum/crypto"
   792  		`,
   793  		`
   794  			// Generate a new random account and a funded simulator
   795  			key, _ := crypto.GenerateKey()
   796  			auth := bind.NewKeyedTransactor(key)
   797  
   798  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   799  			defer sim.Close()
   800  
   801  			// Deploy an eventer contract
   802  			_, _, eventer, err := DeployEventer(auth, sim)
   803  			if err != nil {
   804  				t.Fatalf("Failed to deploy eventer contract: %v", err)
   805  			}
   806  			sim.Commit()
   807  
   808  			// Inject a few events into the contract, gradually more in each block
   809  			for i := 1; i <= 3; i++ {
   810  				for j := 1; j <= i; j++ {
   811  					if _, err := eventer.RaiseSimpleEvent(auth, common.Address{byte(j)}, [32]byte{byte(j)}, true, big.NewInt(int64(10*i+j))); err != nil {
   812  						t.Fatalf("block %d, event %d: raise failed: %v", i, j, err)
   813  					}
   814  				}
   815  				sim.Commit()
   816  			}
   817  			// Test filtering for certain events and ensure they can be found
   818  			sit, err := eventer.FilterSimpleEvent(nil, []common.Address{common.Address{1}, common.Address{3}}, [][32]byte{{byte(1)}, {byte(2)}, {byte(3)}}, []bool{true})
   819  			if err != nil {
   820  				t.Fatalf("failed to filter for simple events: %v", err)
   821  			}
   822  			defer sit.Close()
   823  
   824  			sit.Next()
   825  			if sit.Event.Value.Uint64() != 11 || !sit.Event.Flag {
   826  				t.Errorf("simple log content mismatch: have %v, want {11, true}", sit.Event)
   827  			}
   828  			sit.Next()
   829  			if sit.Event.Value.Uint64() != 21 || !sit.Event.Flag {
   830  				t.Errorf("simple log content mismatch: have %v, want {21, true}", sit.Event)
   831  			}
   832  			sit.Next()
   833  			if sit.Event.Value.Uint64() != 31 || !sit.Event.Flag {
   834  				t.Errorf("simple log content mismatch: have %v, want {31, true}", sit.Event)
   835  			}
   836  			sit.Next()
   837  			if sit.Event.Value.Uint64() != 33 || !sit.Event.Flag {
   838  				t.Errorf("simple log content mismatch: have %v, want {33, true}", sit.Event)
   839  			}
   840  
   841  			if sit.Next() {
   842  				t.Errorf("unexpected simple event found: %+v", sit.Event)
   843  			}
   844  			if err = sit.Error(); err != nil {
   845  				t.Fatalf("simple event iteration failed: %v", err)
   846  			}
   847  			// Test raising and filtering for an event with no data component
   848  			if _, err := eventer.RaiseNodataEvent(auth, big.NewInt(314), 141, 271); err != nil {
   849  				t.Fatalf("failed to raise nodata event: %v", err)
   850  			}
   851  			sim.Commit()
   852  
   853  			nit, err := eventer.FilterNodataEvent(nil, []*big.Int{big.NewInt(314)}, []int16{140, 141, 142}, []uint32{271})
   854  			if err != nil {
   855  				t.Fatalf("failed to filter for nodata events: %v", err)
   856  			}
   857  			defer nit.Close()
   858  
   859  			if !nit.Next() {
   860  				t.Fatalf("nodata log not found: %v", nit.Error())
   861  			}
   862  			if nit.Event.Number.Uint64() != 314 {
   863  				t.Errorf("nodata log content mismatch: have %v, want 314", nit.Event.Number)
   864  			}
   865  			if nit.Next() {
   866  				t.Errorf("unexpected nodata event found: %+v", nit.Event)
   867  			}
   868  			if err = nit.Error(); err != nil {
   869  				t.Fatalf("nodata event iteration failed: %v", err)
   870  			}
   871  			// Test raising and filtering for events with dynamic indexed components
   872  			if _, err := eventer.RaiseDynamicEvent(auth, "Hello", []byte("World")); err != nil {
   873  				t.Fatalf("failed to raise dynamic event: %v", err)
   874  			}
   875  			sim.Commit()
   876  
   877  			dit, err := eventer.FilterDynamicEvent(nil, []string{"Hi", "Hello", "Bye"}, [][]byte{[]byte("World")})
   878  			if err != nil {
   879  				t.Fatalf("failed to filter for dynamic events: %v", err)
   880  			}
   881  			defer dit.Close()
   882  
   883  			if !dit.Next() {
   884  				t.Fatalf("dynamic log not found: %v", dit.Error())
   885  			}
   886  			if dit.Event.NonIndexedString != "Hello" || string(dit.Event.NonIndexedBytes) != "World" ||	dit.Event.IndexedString != common.HexToHash("0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2") || dit.Event.IndexedBytes != common.HexToHash("0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18") {
   887  				t.Errorf("dynamic log content mismatch: have %v, want {'0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2, '0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18', 'Hello', 'World'}", dit.Event)
   888  			}
   889  			if dit.Next() {
   890  				t.Errorf("unexpected dynamic event found: %+v", dit.Event)
   891  			}
   892  			if err = dit.Error(); err != nil {
   893  				t.Fatalf("dynamic event iteration failed: %v", err)
   894  			}
   895  			// Test raising and filtering for events with fixed bytes components
   896  			var fblob [24]byte
   897  			copy(fblob[:], []byte("Fixed Bytes"))
   898  
   899  			if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil {
   900  				t.Fatalf("failed to raise fixed bytes event: %v", err)
   901  			}
   902  			sim.Commit()
   903  
   904  			fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob})
   905  			if err != nil {
   906  				t.Fatalf("failed to filter for fixed bytes events: %v", err)
   907  			}
   908  			defer fit.Close()
   909  
   910  			if !fit.Next() {
   911  				t.Fatalf("fixed bytes log not found: %v", fit.Error())
   912  			}
   913  			if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob {
   914  				t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob)
   915  			}
   916  			if fit.Next() {
   917  				t.Errorf("unexpected fixed bytes event found: %+v", fit.Event)
   918  			}
   919  			if err = fit.Error(); err != nil {
   920  				t.Fatalf("fixed bytes event iteration failed: %v", err)
   921  			}
   922  			// Test subscribing to an event and raising it afterwards
   923  			ch := make(chan *EventerSimpleEvent, 16)
   924  			sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil)
   925  			if err != nil {
   926  				t.Fatalf("failed to subscribe to simple events: %v", err)
   927  			}
   928  			if _, err := eventer.RaiseSimpleEvent(auth, common.Address{255}, [32]byte{255}, true, big.NewInt(255)); err != nil {
   929  				t.Fatalf("failed to raise subscribed simple event: %v", err)
   930  			}
   931  			sim.Commit()
   932  
   933  			select {
   934  			case event := <-ch:
   935  				if event.Value.Uint64() != 255 {
   936  					t.Errorf("simple log content mismatch: have %v, want 255", event)
   937  				}
   938  			case <-time.After(250 * time.Millisecond):
   939  				t.Fatalf("subscribed simple event didn't arrive")
   940  			}
   941  			// Unsubscribe from the event and make sure we're not delivered more
   942  			sub.Unsubscribe()
   943  
   944  			if _, err := eventer.RaiseSimpleEvent(auth, common.Address{254}, [32]byte{254}, true, big.NewInt(254)); err != nil {
   945  				t.Fatalf("failed to raise subscribed simple event: %v", err)
   946  			}
   947  			sim.Commit()
   948  
   949  			select {
   950  			case event := <-ch:
   951  				t.Fatalf("unsubscribed simple event arrived: %v", event)
   952  			case <-time.After(250 * time.Millisecond):
   953  			}
   954  		`,
   955  		nil,
   956  		nil,
   957  		nil,
   958  	},
   959  	{
   960  		`DeeplyNestedArray`,
   961  		`
   962  			contract DeeplyNestedArray {
   963  				uint64[3][4][5] public deepUint64Array;
   964  				function storeDeepUintArray(uint64[3][4][5] arr) public {
   965  					deepUint64Array = arr;
   966  				}
   967  				function retrieveDeepArray() public view returns (uint64[3][4][5]) {
   968  					return deepUint64Array;
   969  				}
   970  			}
   971  		`,
   972  		[]string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`},
   973  		[]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"}]`},
   974  		`
   975  			"math/big"
   976  
   977  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
   978  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
   979  			"github.com/ethereum/go-ethereum/core"
   980  			"github.com/ethereum/go-ethereum/crypto"
   981  		`,
   982  		`
   983  			// Generate a new random account and a funded simulator
   984  			key, _ := crypto.GenerateKey()
   985  			auth := bind.NewKeyedTransactor(key)
   986  
   987  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
   988  			defer sim.Close()
   989  
   990  			//deploy the test contract
   991  			_, _, testContract, err := DeployDeeplyNestedArray(auth, sim)
   992  			if err != nil {
   993  				t.Fatalf("Failed to deploy test contract: %v", err)
   994  			}
   995  
   996  			// Finish deploy.
   997  			sim.Commit()
   998  
   999  			//Create coordinate-filled array, for testing purposes.
  1000  			testArr := [5][4][3]uint64{}
  1001  			for i := 0; i < 5; i++ {
  1002  				testArr[i] = [4][3]uint64{}
  1003  				for j := 0; j < 4; j++ {
  1004  					testArr[i][j] = [3]uint64{}
  1005  					for k := 0; k < 3; k++ {
  1006  						//pack the coordinates, each array value will be unique, and can be validated easily.
  1007  						testArr[i][j][k] = uint64(i) << 16 | uint64(j) << 8 | uint64(k)
  1008  					}
  1009  				}
  1010  			}
  1011  
  1012  			if _, err := testContract.StoreDeepUintArray(&bind.TransactOpts{
  1013  				From: auth.From,
  1014  				Signer: auth.Signer,
  1015  			}, testArr); err != nil {
  1016  				t.Fatalf("Failed to store nested array in test contract: %v", err)
  1017  			}
  1018  
  1019  			sim.Commit()
  1020  
  1021  			retrievedArr, err := testContract.RetrieveDeepArray(&bind.CallOpts{
  1022  				From: auth.From,
  1023  				Pending: false,
  1024  			})
  1025  			if err != nil {
  1026  				t.Fatalf("Failed to retrieve nested array from test contract: %v", err)
  1027  			}
  1028  
  1029  			//quick check to see if contents were copied
  1030  			// (See accounts/abi/unpack_test.go for more extensive testing)
  1031  			if retrievedArr[4][3][2] != testArr[4][3][2] {
  1032  				t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err)
  1033  			}
  1034  		`,
  1035  		nil,
  1036  		nil,
  1037  		nil,
  1038  	},
  1039  	{
  1040  		`CallbackParam`,
  1041  		`
  1042  			contract FunctionPointerTest {
  1043  				function test(function(uint256) external callback) external {
  1044  					callback(1);
  1045  				}
  1046  			}
  1047  		`,
  1048  		[]string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`},
  1049  		[]string{`[
  1050  			{
  1051  				"constant": false,
  1052  				"inputs": [
  1053  					{
  1054  						"name": "callback",
  1055  						"type": "function"
  1056  					}
  1057  				],
  1058  				"name": "test",
  1059  				"outputs": [],
  1060  				"payable": false,
  1061  				"stateMutability": "nonpayable",
  1062  				"type": "function"
  1063  			}
  1064  		]`}, `
  1065  			"strings"
  1066  		`,
  1067  		`
  1068  			if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 {
  1069  				t.Fatalf("")
  1070  			}
  1071  		`,
  1072  		[]map[string]string{
  1073  			{
  1074  				"test(function)": "d7a5aba2",
  1075  			},
  1076  		},
  1077  		nil,
  1078  		nil,
  1079  	}, {
  1080  		`Tuple`,
  1081  		`
  1082  		pragma solidity >=0.4.19 <0.6.0;
  1083  		pragma experimental ABIEncoderV2;
  1084  
  1085  		contract Tuple {
  1086  			struct S { uint a; uint[] b; T[] c; }
  1087  			struct T { uint x; uint y; }
  1088  			struct P { uint8 x; uint8 y; }
  1089  			struct Q { uint16 x; uint16 y; }
  1090  			event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e);
  1091  			event TupleEvent2(P[]);
  1092  
  1093  			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) {
  1094  				return (a, b, c, d, e);
  1095  			}
  1096  			function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public {
  1097  				emit TupleEvent(a, b, c, d, e);
  1098  			}
  1099  			function func3(Q[] memory) public pure {} // call function, nothing to return
  1100  		}
  1101  		`,
  1102  		[]string{`60806040523480156100115760006000fd5b50610017565b6110b2806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100465760003560e01c8063443c79b41461004c578063d0062cdd14610080578063e4d9a43b1461009c57610046565b60006000fd5b610066600480360361006191908101906107b8565b6100b8565b604051610077959493929190610ccb565b60405180910390f35b61009a600480360361009591908101906107b8565b6100ef565b005b6100b660048036036100b19190810190610775565b610136565b005b6100c061013a565b60606100ca61015e565b606060608989898989945094509450945094506100e2565b9550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd008585858585604051610126959493929190610ccb565b60405180910390a15b5050505050565b5b50565b60405180606001604052806000815260200160608152602001606081526020015090565b60405180604001604052806002905b606081526020019060019003908161016d57905050905661106e565b600082601f830112151561019d5760006000fd5b81356101b06101ab82610d6f565b610d41565b915081818352602084019350602081019050838560808402820111156101d65760006000fd5b60005b8381101561020757816101ec888261037a565b8452602084019350608083019250505b6001810190506101d9565b5050505092915050565b600082601f83011215156102255760006000fd5b600261023861023382610d98565b610d41565b9150818360005b83811015610270578135860161025588826103f3565b8452602084019350602083019250505b60018101905061023f565b5050505092915050565b600082601f830112151561028e5760006000fd5b81356102a161029c82610dbb565b610d41565b915081818352602084019350602081019050838560408402820111156102c75760006000fd5b60005b838110156102f857816102dd888261058b565b8452602084019350604083019250505b6001810190506102ca565b5050505092915050565b600082601f83011215156103165760006000fd5b813561032961032482610de4565b610d41565b9150818183526020840193506020810190508360005b83811015610370578135860161035588826105d8565b8452602084019350602083019250505b60018101905061033f565b5050505092915050565b600082601f830112151561038e5760006000fd5b60026103a161039c82610e0d565b610d41565b915081838560408402820111156103b85760006000fd5b60005b838110156103e957816103ce88826106fe565b8452602084019350604083019250505b6001810190506103bb565b5050505092915050565b600082601f83011215156104075760006000fd5b813561041a61041582610e30565b610d41565b915081818352602084019350602081019050838560408402820111156104405760006000fd5b60005b83811015610471578161045688826106fe565b8452602084019350604083019250505b600181019050610443565b5050505092915050565b600082601f830112151561048f5760006000fd5b81356104a261049d82610e59565b610d41565b915081818352602084019350602081019050838560208402820111156104c85760006000fd5b60005b838110156104f957816104de8882610760565b8452602084019350602083019250505b6001810190506104cb565b5050505092915050565b600082601f83011215156105175760006000fd5b813561052a61052582610e82565b610d41565b915081818352602084019350602081019050838560208402820111156105505760006000fd5b60005b8381101561058157816105668882610760565b8452602084019350602083019250505b600181019050610553565b5050505092915050565b60006040828403121561059e5760006000fd5b6105a86040610d41565b905060006105b88482850161074b565b60008301525060206105cc8482850161074b565b60208301525092915050565b6000606082840312156105eb5760006000fd5b6105f56060610d41565b9050600061060584828501610760565b600083015250602082013567ffffffffffffffff8111156106265760006000fd5b6106328482850161047b565b602083015250604082013567ffffffffffffffff8111156106535760006000fd5b61065f848285016103f3565b60408301525092915050565b60006060828403121561067e5760006000fd5b6106886060610d41565b9050600061069884828501610760565b600083015250602082013567ffffffffffffffff8111156106b95760006000fd5b6106c58482850161047b565b602083015250604082013567ffffffffffffffff8111156106e65760006000fd5b6106f2848285016103f3565b60408301525092915050565b6000604082840312156107115760006000fd5b61071b6040610d41565b9050600061072b84828501610760565b600083015250602061073f84828501610760565b60208301525092915050565b60008135905061075a8161103a565b92915050565b60008135905061076f81611054565b92915050565b6000602082840312156107885760006000fd5b600082013567ffffffffffffffff8111156107a35760006000fd5b6107af8482850161027a565b91505092915050565b6000600060006000600060a086880312156107d35760006000fd5b600086013567ffffffffffffffff8111156107ee5760006000fd5b6107fa8882890161066b565b955050602086013567ffffffffffffffff8111156108185760006000fd5b61082488828901610189565b945050604086013567ffffffffffffffff8111156108425760006000fd5b61084e88828901610211565b935050606086013567ffffffffffffffff81111561086c5760006000fd5b61087888828901610302565b925050608086013567ffffffffffffffff8111156108965760006000fd5b6108a288828901610503565b9150509295509295909350565b60006108bb8383610a6a565b60808301905092915050565b60006108d38383610ac2565b905092915050565b60006108e78383610c36565b905092915050565b60006108fb8383610c8d565b60408301905092915050565b60006109138383610cbc565b60208301905092915050565b600061092a82610f0f565b6109348185610fb7565b935061093f83610eab565b8060005b8381101561097157815161095788826108af565b975061096283610f5c565b9250505b600181019050610943565b5085935050505092915050565b600061098982610f1a565b6109938185610fc8565b9350836020820285016109a585610ebb565b8060005b858110156109e257848403895281516109c285826108c7565b94506109cd83610f69565b925060208a019950505b6001810190506109a9565b50829750879550505050505092915050565b60006109ff82610f25565b610a098185610fd3565b935083602082028501610a1b85610ec5565b8060005b85811015610a585784840389528151610a3885826108db565b9450610a4383610f76565b925060208a019950505b600181019050610a1f565b50829750879550505050505092915050565b610a7381610f30565b610a7d8184610fe4565b9250610a8882610ed5565b8060005b83811015610aba578151610aa087826108ef565b9650610aab83610f83565b9250505b600181019050610a8c565b505050505050565b6000610acd82610f3b565b610ad78185610fef565b9350610ae283610edf565b8060005b83811015610b14578151610afa88826108ef565b9750610b0583610f90565b9250505b600181019050610ae6565b5085935050505092915050565b6000610b2c82610f51565b610b368185611011565b9350610b4183610eff565b8060005b83811015610b73578151610b598882610907565b9750610b6483610faa565b9250505b600181019050610b45565b5085935050505092915050565b6000610b8b82610f46565b610b958185611000565b9350610ba083610eef565b8060005b83811015610bd2578151610bb88882610907565b9750610bc383610f9d565b9250505b600181019050610ba4565b5085935050505092915050565b6000606083016000830151610bf76000860182610cbc565b5060208301518482036020860152610c0f8282610b80565b91505060408301518482036040860152610c298282610ac2565b9150508091505092915050565b6000606083016000830151610c4e6000860182610cbc565b5060208301518482036020860152610c668282610b80565b91505060408301518482036040860152610c808282610ac2565b9150508091505092915050565b604082016000820151610ca36000850182610cbc565b506020820151610cb66020850182610cbc565b50505050565b610cc581611030565b82525050565b600060a0820190508181036000830152610ce58188610bdf565b90508181036020830152610cf9818761091f565b90508181036040830152610d0d818661097e565b90508181036060830152610d2181856109f4565b90508181036080830152610d358184610b21565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610d655760006000fd5b8060405250919050565b600067ffffffffffffffff821115610d875760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610db05760006000fd5b602082029050919050565b600067ffffffffffffffff821115610dd35760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610dfc5760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e255760006000fd5b602082029050919050565b600067ffffffffffffffff821115610e485760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e715760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e9a5760006000fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061ffff82169050919050565b6000819050919050565b61104381611022565b811415156110515760006000fd5b50565b61105d81611030565b8114151561106b5760006000fd5b50565bfea365627a7a72315820d78c6ba7ee332581e6c4d9daa5fc07941841230f7ce49edf6e05b1b63853e8746c6578706572696d656e74616cf564736f6c634300050c0040`},
  1103  		[]string{`
  1104  [{"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"}]
  1105  		`},
  1106  		`
  1107  			"math/big"
  1108  			"reflect"
  1109  
  1110  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
  1111  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
  1112  			"github.com/ethereum/go-ethereum/core"
  1113  			"github.com/ethereum/go-ethereum/crypto"
  1114  		`,
  1115  
  1116  		`
  1117  			key, _ := crypto.GenerateKey()
  1118  			auth := bind.NewKeyedTransactor(key)
  1119  
  1120  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
  1121  			defer sim.Close()
  1122  
  1123  			_, _, contract, err := DeployTuple(auth, sim)
  1124  			if err != nil {
  1125  				t.Fatalf("deploy contract failed %v", err)
  1126  			}
  1127  			sim.Commit()
  1128  
  1129  			check := func(a, b interface{}, errMsg string) {
  1130  				if !reflect.DeepEqual(a, b) {
  1131  					t.Fatal(errMsg)
  1132  				}
  1133  			}
  1134  
  1135  			a := TupleS{
  1136  				A: big.NewInt(1),
  1137  				B: []*big.Int{big.NewInt(2), big.NewInt(3)},
  1138  				C: []TupleT{
  1139  					{
  1140  						X: big.NewInt(4),
  1141  						Y: big.NewInt(5),
  1142  					},
  1143  					{
  1144  						X: big.NewInt(6),
  1145  						Y: big.NewInt(7),
  1146  					},
  1147  				},
  1148  			}
  1149  
  1150  			b := [][2]TupleT{
  1151  				{
  1152  					{
  1153  						X: big.NewInt(8),
  1154  						Y: big.NewInt(9),
  1155  					},
  1156  					{
  1157  						X: big.NewInt(10),
  1158  						Y: big.NewInt(11),
  1159  					},
  1160  				},
  1161  			}
  1162  
  1163  			c := [2][]TupleT{
  1164  				{
  1165  					{
  1166  						X: big.NewInt(12),
  1167  						Y: big.NewInt(13),
  1168  					},
  1169  					{
  1170  						X: big.NewInt(14),
  1171  						Y: big.NewInt(15),
  1172  					},
  1173  				},
  1174  				{
  1175  					{
  1176  						X: big.NewInt(16),
  1177  						Y: big.NewInt(17),
  1178  					},
  1179  				},
  1180  			}
  1181  
  1182  			d := []TupleS{a}
  1183  
  1184  			e := []*big.Int{big.NewInt(18), big.NewInt(19)}
  1185  			ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e)
  1186  			if err != nil {
  1187  				t.Fatalf("invoke contract failed, err %v", err)
  1188  			}
  1189  			check(ret1, a, "ret1 mismatch")
  1190  			check(ret2, b, "ret2 mismatch")
  1191  			check(ret3, c, "ret3 mismatch")
  1192  			check(ret4, d, "ret4 mismatch")
  1193  			check(ret5, e, "ret5 mismatch")
  1194  
  1195  			_, err = contract.Func2(auth, a, b, c, d, e)
  1196  			if err != nil {
  1197  				t.Fatalf("invoke contract failed, err %v", err)
  1198  			}
  1199  			sim.Commit()
  1200  
  1201  			iter, err := contract.FilterTupleEvent(nil)
  1202  			if err != nil {
  1203  				t.Fatalf("failed to create event filter, err %v", err)
  1204  			}
  1205  			defer iter.Close()
  1206  
  1207  			iter.Next()
  1208  			check(iter.Event.A, a, "field1 mismatch")
  1209  			check(iter.Event.B, b, "field2 mismatch")
  1210  			check(iter.Event.C, c, "field3 mismatch")
  1211  			check(iter.Event.D, d, "field4 mismatch")
  1212  			check(iter.Event.E, e, "field5 mismatch")
  1213  
  1214  			err = contract.Func3(nil, nil)
  1215  			if err != nil {
  1216  				t.Fatalf("failed to call function which has no return, err %v", err)
  1217  			}
  1218  		`,
  1219  		nil,
  1220  		nil,
  1221  		nil,
  1222  	},
  1223  	{
  1224  		`UseLibrary`,
  1225  		`
  1226  		library Math {
  1227      		function add(uint a, uint b) public view returns(uint) {
  1228          		return a + b;
  1229      		}
  1230  		}
  1231  
  1232  		contract UseLibrary {
  1233  			function add (uint c, uint d) public view returns(uint) {
  1234          		return Math.add(c,d);
  1235      		}
  1236  		}
  1237  		`,
  1238  		[]string{
  1239  			// Bytecode for the UseLibrary contract
  1240  			`608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`,
  1241  			// Bytecode for the Math contract
  1242  			`60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`,
  1243  		},
  1244  		[]string{
  1245  			`[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
  1246  			`[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
  1247  		},
  1248  		`
  1249  			"math/big"
  1250  
  1251  			"github.com/ethereum/go-ethereum/accounts/abi/bind"
  1252  			"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
  1253  			"github.com/ethereum/go-ethereum/core"
  1254  			"github.com/ethereum/go-ethereum/crypto"
  1255  		`,
  1256  		`
  1257  			// Generate a new random account and a funded simulator
  1258  			key, _ := crypto.GenerateKey()
  1259  			auth := bind.NewKeyedTransactor(key)
  1260  
  1261  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
  1262  			defer sim.Close()
  1263  
  1264  			//deploy the test contract
  1265  			_, _, testContract, err := DeployUseLibrary(auth, sim)
  1266  			if err != nil {
  1267  				t.Fatalf("Failed to deploy test contract: %v", err)
  1268  			}
  1269  
  1270  			// Finish deploy.
  1271  			sim.Commit()
  1272  
  1273  			// Check that the library contract has been deployed
  1274  			// by calling the contract's add function.
  1275  			res, err := testContract.Add(&bind.CallOpts{
  1276  				From: auth.From,
  1277  				Pending: false,
  1278  			}, big.NewInt(1), big.NewInt(2))
  1279  			if err != nil {
  1280  				t.Fatalf("Failed to call linked contract: %v", err)
  1281  			}
  1282  			if res.Cmp(big.NewInt(3)) != 0 {
  1283  				t.Fatalf("Add did not return the correct result: %d != %d", res, 3)
  1284  			}
  1285  		`,
  1286  		nil,
  1287  		map[string]string{
  1288  			"b98c933f0a6ececcd167bd4f9d3299b1a0": "Math",
  1289  		},
  1290  		[]string{"UseLibrary", "Math"},
  1291  	}, {
  1292  		"Overload",
  1293  		`
  1294  		pragma solidity ^0.5.10;
  1295  
  1296  		contract overload {
  1297  		  mapping(address => uint256) balances;
  1298  
  1299  		  event bar(uint256 i);
  1300  		  event bar(uint256 i, uint256 j);
  1301  			
  1302  		  function foo(uint256 i) public {
  1303  			  emit bar(i);
  1304  		  }
  1305  		  function foo(uint256 i, uint256 j) public {
  1306  			  emit bar(i, j);
  1307  		  }
  1308  		}
  1309  		`,
  1310  		[]string{`608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032`},
  1311  		[]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"}]`},
  1312  		`
  1313  		"math/big"
  1314  		"time"
  1315  
  1316  		"github.com/ethereum/go-ethereum/accounts/abi/bind"
  1317  		"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
  1318  		"github.com/ethereum/go-ethereum/core"
  1319  		"github.com/ethereum/go-ethereum/crypto"
  1320  		`,
  1321  		`
  1322  		// Initialize test accounts
  1323  		key, _ := crypto.GenerateKey()
  1324  		auth := bind.NewKeyedTransactor(key)
  1325  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000)
  1326  		defer sim.Close()
  1327  
  1328  		// deploy the test contract
  1329  		_, _, contract, err := DeployOverload(auth, sim)
  1330  		if err != nil {
  1331  			t.Fatalf("Failed to deploy contract: %v", err)
  1332  		}
  1333  		// Finish deploy.
  1334  		sim.Commit()
  1335  
  1336  		resCh, stopCh := make(chan uint64), make(chan struct{})
  1337  
  1338  		go func() {
  1339  			barSink := make(chan *OverloadBar)
  1340  			sub, _ := contract.WatchBar(nil, barSink)
  1341  			defer sub.Unsubscribe()
  1342  
  1343  			bar0Sink := make(chan *OverloadBar0)
  1344  			sub0, _ := contract.WatchBar0(nil, bar0Sink)
  1345  			defer sub0.Unsubscribe()
  1346  
  1347  			for {
  1348  				select {
  1349  				case ev := <-barSink:
  1350  					resCh <- ev.I.Uint64()
  1351  				case ev := <-bar0Sink:
  1352  					resCh <- ev.I.Uint64() + ev.J.Uint64()
  1353  				case <-stopCh:
  1354  					return
  1355  				}
  1356  			}
  1357  		}()
  1358  		contract.Foo(auth, big.NewInt(1), big.NewInt(2))
  1359  		sim.Commit()
  1360  		select {
  1361  		case n := <-resCh:
  1362  			if n != 3 {
  1363  				t.Fatalf("Invalid bar0 event")
  1364  			}
  1365  		case <-time.NewTimer(100 * time.Millisecond).C:
  1366  			t.Fatalf("Wait bar0 event timeout")
  1367  		}
  1368  
  1369  		contract.Foo0(auth, big.NewInt(1))
  1370  		sim.Commit()
  1371  		select {
  1372  		case n := <-resCh:
  1373  			if n != 1 {
  1374  				t.Fatalf("Invalid bar event")
  1375  			}
  1376  		case <-time.NewTimer(100 * time.Millisecond).C:
  1377  			t.Fatalf("Wait bar event timeout")
  1378  		}
  1379  		close(stopCh)
  1380  		`,
  1381  		nil,
  1382  		nil,
  1383  		nil,
  1384  	},
  1385  }
  1386  
  1387  // Tests that packages generated by the binder can be successfully compiled and
  1388  // the requested tester run against it.
  1389  func TestGolangBindings(t *testing.T) {
  1390  	// Skip the test if no Go command can be found
  1391  	gocmd := runtime.GOROOT() + "/bin/go"
  1392  	if !common.FileExist(gocmd) {
  1393  		t.Skip("go sdk not found for testing")
  1394  	}
  1395  	// Create a temporary workspace for the test suite
  1396  	ws, err := ioutil.TempDir("", "")
  1397  	if err != nil {
  1398  		t.Fatalf("failed to create temporary workspace: %v", err)
  1399  	}
  1400  	defer os.RemoveAll(ws)
  1401  
  1402  	pkg := filepath.Join(ws, "bindtest")
  1403  	if err = os.MkdirAll(pkg, 0700); err != nil {
  1404  		t.Fatalf("failed to create package: %v", err)
  1405  	}
  1406  	// Generate the test suite for all the contracts
  1407  	for i, tt := range bindTests {
  1408  		var types []string
  1409  		if tt.types != nil {
  1410  			types = tt.types
  1411  		} else {
  1412  			types = []string{tt.name}
  1413  		}
  1414  		// Generate the binding and create a Go source file in the workspace
  1415  		bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs)
  1416  		if err != nil {
  1417  			t.Fatalf("test %d: failed to generate binding: %v", i, err)
  1418  		}
  1419  		if err = ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil {
  1420  			t.Fatalf("test %d: failed to write binding: %v", i, err)
  1421  		}
  1422  		// Generate the test file with the injected test code
  1423  		code := fmt.Sprintf(`
  1424  			package bindtest
  1425  
  1426  			import (
  1427  				"testing"
  1428  				%s
  1429  			)
  1430  
  1431  			func Test%s(t *testing.T) {
  1432  				%s
  1433  			}
  1434  		`, tt.imports, tt.name, tt.tester)
  1435  		if err := ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil {
  1436  			t.Fatalf("test %d: failed to write tests: %v", i, err)
  1437  		}
  1438  	}
  1439  	// Test the entire package and report any failures
  1440  	cmd := exec.Command(gocmd, "test", "-v", "-count", "1")
  1441  	cmd.Dir = pkg
  1442  	if out, err := cmd.CombinedOutput(); err != nil {
  1443  		t.Fatalf("failed to run binding test: %v\n%s", err, out)
  1444  	}
  1445  }
  1446  
  1447  // Tests that java binding generated by the binder is exactly matched.
  1448  func TestJavaBindings(t *testing.T) {
  1449  	var cases = []struct {
  1450  		name     string
  1451  		contract string
  1452  		abi      string
  1453  		bytecode string
  1454  		expected string
  1455  	}{
  1456  		{
  1457  			"test",
  1458  			`
  1459  			pragma experimental ABIEncoderV2;
  1460  			pragma solidity ^0.5.2;
  1461  
  1462  			contract test {
  1463  				function setAddress(address a) public returns(address){}
  1464  				function setAddressList(address[] memory a_l) public returns(address[] memory){}
  1465  				function setAddressArray(address[2] memory a_a) public returns(address[2] memory){}
  1466  
  1467  				function setUint8(uint8 u8) public returns(uint8){}
  1468  				function setUint16(uint16 u16) public returns(uint16){}
  1469  				function setUint32(uint32 u32) public returns(uint32){}
  1470  				function setUint64(uint64 u64) public returns(uint64){}
  1471  				function setUint256(uint256 u256) public returns(uint256){}
  1472  				function setUint256List(uint256[] memory u256_l) public returns(uint256[] memory){}
  1473  				function setUint256Array(uint256[2] memory u256_a) public returns(uint256[2] memory){}
  1474  
  1475  				function setInt8(int8 i8) public returns(int8){}
  1476  				function setInt16(int16 i16) public returns(int16){}
  1477  				function setInt32(int32 i32) public returns(int32){}
  1478  				function setInt64(int64 i64) public returns(int64){}
  1479  				function setInt256(int256 i256) public returns(int256){}
  1480  				function setInt256List(int256[] memory i256_l) public returns(int256[] memory){}
  1481  				function setInt256Array(int256[2] memory i256_a) public returns(int256[2] memory){}
  1482  
  1483  				function setBytes1(bytes1 b1) public returns(bytes1) {}
  1484  				function setBytes32(bytes32 b32) public returns(bytes32) {}
  1485  				function setBytes(bytes memory bs) public returns(bytes memory) {}
  1486  				function setBytesList(bytes[] memory bs_l) public returns(bytes[] memory) {}
  1487  				function setBytesArray(bytes[2] memory bs_a) public returns(bytes[2] memory) {}
  1488  
  1489  				function setString(string memory s) public returns(string memory) {}
  1490  				function setStringList(string[] memory s_l) public returns(string[] memory) {}
  1491  				function setStringArray(string[2] memory s_a) public returns(string[2] memory) {}
  1492  
  1493  				function setBool(bool b) public returns(bool) {}
  1494  				function setBoolList(bool[] memory b_l) public returns(bool[] memory) {}
  1495  				function setBoolArray(bool[2] memory b_a) public returns(bool[2] memory) {}
  1496  			}`,
  1497  			`[{"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"}]`,
  1498  			`608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037`,
  1499  			`
  1500  // This file is an automatically generated Java binding. Do not modify as any
  1501  // change will likely be lost upon the next re-generation!
  1502  
  1503  package bindtest;
  1504  
  1505  import org.ethereum.geth.*;
  1506  import java.util.*;
  1507  
  1508  
  1509  
  1510  public class Test {
  1511  	// ABI is the input ABI used to generate the binding from.
  1512  	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\"}]";
  1513  	
  1514  	
  1515  	// BYTECODE is the compiled bytecode used for deploying new contracts.
  1516  	public final static String BYTECODE = "0x608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037";
  1517  
  1518  	// deploy deploys a new Ethereum contract, binding an instance of Test to it.
  1519  	public static Test deploy(TransactOpts auth, EthereumClient client) throws Exception {
  1520  		Interfaces args = Geth.newInterfaces(0);
  1521  		String bytecode = BYTECODE;
  1522  		
  1523  		
  1524  		return new Test(Geth.deployContract(auth, ABI, Geth.decodeFromHex(bytecode), client, args));
  1525  	}
  1526  
  1527  	// Internal constructor used by contract deployment.
  1528  	private Test(BoundContract deployment) {
  1529  		this.Address  = deployment.getAddress();
  1530  		this.Deployer = deployment.getDeployer();
  1531  		this.Contract = deployment;
  1532  	}
  1533  	
  1534  
  1535  	// Ethereum address where this contract is located at.
  1536  	public final Address Address;
  1537  
  1538  	// Ethereum transaction in which this contract was deployed (if known!).
  1539  	public final Transaction Deployer;
  1540  
  1541  	// Contract instance bound to a blockchain address.
  1542  	private final BoundContract Contract;
  1543  
  1544  	// Creates a new instance of Test, bound to a specific deployed contract.
  1545  	public Test(Address address, EthereumClient client) throws Exception {
  1546  		this(Geth.bindContract(address, ABI, client));
  1547  	}
  1548  
  1549  	
  1550  
  1551  	
  1552  	// setAddress is a paid mutator transaction binding the contract method 0xe30081a0.
  1553  	//
  1554  	// Solidity: function setAddress(address a) returns(address)
  1555  	public Transaction setAddress(TransactOpts opts, Address a) throws Exception {
  1556  		Interfaces args = Geth.newInterfaces(1);
  1557  		Interface arg0 = Geth.newInterface();arg0.setAddress(a);args.set(0,arg0);
  1558  		
  1559  		return this.Contract.transact(opts, "setAddress"	, args);
  1560  	}
  1561  	
  1562  	// setAddressArray is a paid mutator transaction binding the contract method 0x151f5471.
  1563  	//
  1564  	// Solidity: function setAddressArray(address[2] a_a) returns(address[2])
  1565  	public Transaction setAddressArray(TransactOpts opts, Addresses a_a) throws Exception {
  1566  		Interfaces args = Geth.newInterfaces(1);
  1567  		Interface arg0 = Geth.newInterface();arg0.setAddresses(a_a);args.set(0,arg0);
  1568  		
  1569  		return this.Contract.transact(opts, "setAddressArray"	, args);
  1570  	}
  1571  	
  1572  	// setAddressList is a paid mutator transaction binding the contract method 0x5be6b37e.
  1573  	//
  1574  	// Solidity: function setAddressList(address[] a_l) returns(address[])
  1575  	public Transaction setAddressList(TransactOpts opts, Addresses a_l) throws Exception {
  1576  		Interfaces args = Geth.newInterfaces(1);
  1577  		Interface arg0 = Geth.newInterface();arg0.setAddresses(a_l);args.set(0,arg0);
  1578  		
  1579  		return this.Contract.transact(opts, "setAddressList"	, args);
  1580  	}
  1581  	
  1582  	// setBool is a paid mutator transaction binding the contract method 0x1e26fd33.
  1583  	//
  1584  	// Solidity: function setBool(bool b) returns(bool)
  1585  	public Transaction setBool(TransactOpts opts, boolean b) throws Exception {
  1586  		Interfaces args = Geth.newInterfaces(1);
  1587  		Interface arg0 = Geth.newInterface();arg0.setBool(b);args.set(0,arg0);
  1588  		
  1589  		return this.Contract.transact(opts, "setBool"	, args);
  1590  	}
  1591  	
  1592  	// setBoolArray is a paid mutator transaction binding the contract method 0x118a9718.
  1593  	//
  1594  	// Solidity: function setBoolArray(bool[2] b_a) returns(bool[2])
  1595  	public Transaction setBoolArray(TransactOpts opts, Bools b_a) throws Exception {
  1596  		Interfaces args = Geth.newInterfaces(1);
  1597  		Interface arg0 = Geth.newInterface();arg0.setBools(b_a);args.set(0,arg0);
  1598  		
  1599  		return this.Contract.transact(opts, "setBoolArray"	, args);
  1600  	}
  1601  	
  1602  	// setBoolList is a paid mutator transaction binding the contract method 0x4d5ee6da.
  1603  	//
  1604  	// Solidity: function setBoolList(bool[] b_l) returns(bool[])
  1605  	public Transaction setBoolList(TransactOpts opts, Bools b_l) throws Exception {
  1606  		Interfaces args = Geth.newInterfaces(1);
  1607  		Interface arg0 = Geth.newInterface();arg0.setBools(b_l);args.set(0,arg0);
  1608  		
  1609  		return this.Contract.transact(opts, "setBoolList"	, args);
  1610  	}
  1611  	
  1612  	// setBytes is a paid mutator transaction binding the contract method 0xda359dc8.
  1613  	//
  1614  	// Solidity: function setBytes(bytes bs) returns(bytes)
  1615  	public Transaction setBytes(TransactOpts opts, byte[] bs) throws Exception {
  1616  		Interfaces args = Geth.newInterfaces(1);
  1617  		Interface arg0 = Geth.newInterface();arg0.setBinary(bs);args.set(0,arg0);
  1618  		
  1619  		return this.Contract.transact(opts, "setBytes"	, args);
  1620  	}
  1621  	
  1622  	// setBytes1 is a paid mutator transaction binding the contract method 0xfba1a1c3.
  1623  	//
  1624  	// Solidity: function setBytes1(bytes1 b1) returns(bytes1)
  1625  	public Transaction setBytes1(TransactOpts opts, byte[] b1) throws Exception {
  1626  		Interfaces args = Geth.newInterfaces(1);
  1627  		Interface arg0 = Geth.newInterface();arg0.setBinary(b1);args.set(0,arg0);
  1628  		
  1629  		return this.Contract.transact(opts, "setBytes1"	, args);
  1630  	}
  1631  	
  1632  	// setBytes32 is a paid mutator transaction binding the contract method 0xc2b12a73.
  1633  	//
  1634  	// Solidity: function setBytes32(bytes32 b32) returns(bytes32)
  1635  	public Transaction setBytes32(TransactOpts opts, byte[] b32) throws Exception {
  1636  		Interfaces args = Geth.newInterfaces(1);
  1637  		Interface arg0 = Geth.newInterface();arg0.setBinary(b32);args.set(0,arg0);
  1638  		
  1639  		return this.Contract.transact(opts, "setBytes32"	, args);
  1640  	}
  1641  	
  1642  	// setBytesArray is a paid mutator transaction binding the contract method 0x5119655d.
  1643  	//
  1644  	// Solidity: function setBytesArray(bytes[2] bs_a) returns(bytes[2])
  1645  	public Transaction setBytesArray(TransactOpts opts, Binaries bs_a) throws Exception {
  1646  		Interfaces args = Geth.newInterfaces(1);
  1647  		Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_a);args.set(0,arg0);
  1648  		
  1649  		return this.Contract.transact(opts, "setBytesArray"	, args);
  1650  	}
  1651  	
  1652  	// setBytesList is a paid mutator transaction binding the contract method 0x16c105e2.
  1653  	//
  1654  	// Solidity: function setBytesList(bytes[] bs_l) returns(bytes[])
  1655  	public Transaction setBytesList(TransactOpts opts, Binaries bs_l) throws Exception {
  1656  		Interfaces args = Geth.newInterfaces(1);
  1657  		Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_l);args.set(0,arg0);
  1658  		
  1659  		return this.Contract.transact(opts, "setBytesList"	, args);
  1660  	}
  1661  	
  1662  	// setInt16 is a paid mutator transaction binding the contract method 0x86114cea.
  1663  	//
  1664  	// Solidity: function setInt16(int16 i16) returns(int16)
  1665  	public Transaction setInt16(TransactOpts opts, short i16) throws Exception {
  1666  		Interfaces args = Geth.newInterfaces(1);
  1667  		Interface arg0 = Geth.newInterface();arg0.setInt16(i16);args.set(0,arg0);
  1668  		
  1669  		return this.Contract.transact(opts, "setInt16"	, args);
  1670  	}
  1671  	
  1672  	// setInt256 is a paid mutator transaction binding the contract method 0xa53b1c1e.
  1673  	//
  1674  	// Solidity: function setInt256(int256 i256) returns(int256)
  1675  	public Transaction setInt256(TransactOpts opts, BigInt i256) throws Exception {
  1676  		Interfaces args = Geth.newInterfaces(1);
  1677  		Interface arg0 = Geth.newInterface();arg0.setBigInt(i256);args.set(0,arg0);
  1678  		
  1679  		return this.Contract.transact(opts, "setInt256"	, args);
  1680  	}
  1681  	
  1682  	// setInt256Array is a paid mutator transaction binding the contract method 0x6aa482fc.
  1683  	//
  1684  	// Solidity: function setInt256Array(int256[2] i256_a) returns(int256[2])
  1685  	public Transaction setInt256Array(TransactOpts opts, BigInts i256_a) throws Exception {
  1686  		Interfaces args = Geth.newInterfaces(1);
  1687  		Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_a);args.set(0,arg0);
  1688  		
  1689  		return this.Contract.transact(opts, "setInt256Array"	, args);
  1690  	}
  1691  	
  1692  	// setInt256List is a paid mutator transaction binding the contract method 0x22722302.
  1693  	//
  1694  	// Solidity: function setInt256List(int256[] i256_l) returns(int256[])
  1695  	public Transaction setInt256List(TransactOpts opts, BigInts i256_l) throws Exception {
  1696  		Interfaces args = Geth.newInterfaces(1);
  1697  		Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_l);args.set(0,arg0);
  1698  		
  1699  		return this.Contract.transact(opts, "setInt256List"	, args);
  1700  	}
  1701  	
  1702  	// setInt32 is a paid mutator transaction binding the contract method 0xb7d5df31.
  1703  	//
  1704  	// Solidity: function setInt32(int32 i32) returns(int32)
  1705  	public Transaction setInt32(TransactOpts opts, int i32) throws Exception {
  1706  		Interfaces args = Geth.newInterfaces(1);
  1707  		Interface arg0 = Geth.newInterface();arg0.setInt32(i32);args.set(0,arg0);
  1708  		
  1709  		return this.Contract.transact(opts, "setInt32"	, args);
  1710  	}
  1711  	
  1712  	// setInt64 is a paid mutator transaction binding the contract method 0xe673eb32.
  1713  	//
  1714  	// Solidity: function setInt64(int64 i64) returns(int64)
  1715  	public Transaction setInt64(TransactOpts opts, long i64) throws Exception {
  1716  		Interfaces args = Geth.newInterfaces(1);
  1717  		Interface arg0 = Geth.newInterface();arg0.setInt64(i64);args.set(0,arg0);
  1718  		
  1719  		return this.Contract.transact(opts, "setInt64"	, args);
  1720  	}
  1721  	
  1722  	// setInt8 is a paid mutator transaction binding the contract method 0x9a19a953.
  1723  	//
  1724  	// Solidity: function setInt8(int8 i8) returns(int8)
  1725  	public Transaction setInt8(TransactOpts opts, byte i8) throws Exception {
  1726  		Interfaces args = Geth.newInterfaces(1);
  1727  		Interface arg0 = Geth.newInterface();arg0.setInt8(i8);args.set(0,arg0);
  1728  		
  1729  		return this.Contract.transact(opts, "setInt8"	, args);
  1730  	}
  1731  	
  1732  	// setString is a paid mutator transaction binding the contract method 0x7fcaf666.
  1733  	//
  1734  	// Solidity: function setString(string s) returns(string)
  1735  	public Transaction setString(TransactOpts opts, String s) throws Exception {
  1736  		Interfaces args = Geth.newInterfaces(1);
  1737  		Interface arg0 = Geth.newInterface();arg0.setString(s);args.set(0,arg0);
  1738  		
  1739  		return this.Contract.transact(opts, "setString"	, args);
  1740  	}
  1741  	
  1742  	// setStringArray is a paid mutator transaction binding the contract method 0x7173b695.
  1743  	//
  1744  	// Solidity: function setStringArray(string[2] s_a) returns(string[2])
  1745  	public Transaction setStringArray(TransactOpts opts, Strings s_a) throws Exception {
  1746  		Interfaces args = Geth.newInterfaces(1);
  1747  		Interface arg0 = Geth.newInterface();arg0.setStrings(s_a);args.set(0,arg0);
  1748  		
  1749  		return this.Contract.transact(opts, "setStringArray"	, args);
  1750  	}
  1751  	
  1752  	// setStringList is a paid mutator transaction binding the contract method 0xc5777961.
  1753  	//
  1754  	// Solidity: function setStringList(string[] s_l) returns(string[])
  1755  	public Transaction setStringList(TransactOpts opts, Strings s_l) throws Exception {
  1756  		Interfaces args = Geth.newInterfaces(1);
  1757  		Interface arg0 = Geth.newInterface();arg0.setStrings(s_l);args.set(0,arg0);
  1758  		
  1759  		return this.Contract.transact(opts, "setStringList"	, args);
  1760  	}
  1761  	
  1762  	// setUint16 is a paid mutator transaction binding the contract method 0x0477988a.
  1763  	//
  1764  	// Solidity: function setUint16(uint16 u16) returns(uint16)
  1765  	public Transaction setUint16(TransactOpts opts, BigInt u16) throws Exception {
  1766  		Interfaces args = Geth.newInterfaces(1);
  1767  		Interface arg0 = Geth.newInterface();arg0.setUint16(u16);args.set(0,arg0);
  1768  		
  1769  		return this.Contract.transact(opts, "setUint16"	, args);
  1770  	}
  1771  	
  1772  	// setUint256 is a paid mutator transaction binding the contract method 0xd2282dc5.
  1773  	//
  1774  	// Solidity: function setUint256(uint256 u256) returns(uint256)
  1775  	public Transaction setUint256(TransactOpts opts, BigInt u256) throws Exception {
  1776  		Interfaces args = Geth.newInterfaces(1);
  1777  		Interface arg0 = Geth.newInterface();arg0.setBigInt(u256);args.set(0,arg0);
  1778  		
  1779  		return this.Contract.transact(opts, "setUint256"	, args);
  1780  	}
  1781  	
  1782  	// setUint256Array is a paid mutator transaction binding the contract method 0x2766a755.
  1783  	//
  1784  	// Solidity: function setUint256Array(uint256[2] u256_a) returns(uint256[2])
  1785  	public Transaction setUint256Array(TransactOpts opts, BigInts u256_a) throws Exception {
  1786  		Interfaces args = Geth.newInterfaces(1);
  1787  		Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_a);args.set(0,arg0);
  1788  		
  1789  		return this.Contract.transact(opts, "setUint256Array"	, args);
  1790  	}
  1791  	
  1792  	// setUint256List is a paid mutator transaction binding the contract method 0xa0709e19.
  1793  	//
  1794  	// Solidity: function setUint256List(uint256[] u256_l) returns(uint256[])
  1795  	public Transaction setUint256List(TransactOpts opts, BigInts u256_l) throws Exception {
  1796  		Interfaces args = Geth.newInterfaces(1);
  1797  		Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_l);args.set(0,arg0);
  1798  		
  1799  		return this.Contract.transact(opts, "setUint256List"	, args);
  1800  	}
  1801  	
  1802  	// setUint32 is a paid mutator transaction binding the contract method 0x1c9352e2.
  1803  	//
  1804  	// Solidity: function setUint32(uint32 u32) returns(uint32)
  1805  	public Transaction setUint32(TransactOpts opts, BigInt u32) throws Exception {
  1806  		Interfaces args = Geth.newInterfaces(1);
  1807  		Interface arg0 = Geth.newInterface();arg0.setUint32(u32);args.set(0,arg0);
  1808  		
  1809  		return this.Contract.transact(opts, "setUint32"	, args);
  1810  	}
  1811  	
  1812  	// setUint64 is a paid mutator transaction binding the contract method 0x822cba69.
  1813  	//
  1814  	// Solidity: function setUint64(uint64 u64) returns(uint64)
  1815  	public Transaction setUint64(TransactOpts opts, BigInt u64) throws Exception {
  1816  		Interfaces args = Geth.newInterfaces(1);
  1817  		Interface arg0 = Geth.newInterface();arg0.setUint64(u64);args.set(0,arg0);
  1818  		
  1819  		return this.Contract.transact(opts, "setUint64"	, args);
  1820  	}
  1821  	
  1822  	// setUint8 is a paid mutator transaction binding the contract method 0x1774e646.
  1823  	//
  1824  	// Solidity: function setUint8(uint8 u8) returns(uint8)
  1825  	public Transaction setUint8(TransactOpts opts, BigInt u8) throws Exception {
  1826  		Interfaces args = Geth.newInterfaces(1);
  1827  		Interface arg0 = Geth.newInterface();arg0.setUint8(u8);args.set(0,arg0);
  1828  		
  1829  		return this.Contract.transact(opts, "setUint8"	, args);
  1830  	}
  1831  	
  1832  }
  1833  
  1834  `,
  1835  		},
  1836  	}
  1837  	for i, c := range cases {
  1838  		binding, err := Bind([]string{c.name}, []string{c.abi}, []string{c.bytecode}, nil, "bindtest", LangJava, nil)
  1839  		if err != nil {
  1840  			t.Fatalf("test %d: failed to generate binding: %v", i, err)
  1841  		}
  1842  		if binding != c.expected {
  1843  			t.Fatalf("test %d: generated binding mismatch, has %s, want %s", i, binding, c.expected)
  1844  		}
  1845  	}
  1846  }