github.com/dim4egster/coreth@v0.10.2/accounts/abi/bind/bind_test.go (about)

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