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