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