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