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