github.com/bcskill/bcschain/v3@v3.4.9-beta2/accounts/abi/bind/bind_test.go (about)

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