From a9db3ff6c1964d9b596051f8d647774860a6a8ab Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 17:34:42 +0900 Subject: [PATCH 1/9] allow erc20 metadata to be updated via gov if it is created from (ibc or opbridge) --- x/bank/keeper/grpc_query_test.go | 2 +- x/evm/contracts/counter/Counter.go | 2 +- x/evm/contracts/erc20/ERC20.go | 60 ++++++++++++++-- x/evm/contracts/erc20/ERC20.sol | 26 ++++++- x/evm/contracts/erc20_acl/ERC20ACL.go | 2 +- x/evm/contracts/erc20_acl/ERC20ACL.sol | 9 +++ x/evm/contracts/erc20_factory/ERC20Factory.go | 2 +- .../contracts/erc20_factory/ERC20Factory.sol | 2 +- x/evm/contracts/erc20_wrapper/ERC20Wrapper.go | 2 +- x/evm/contracts/i_cosmos/ICosmos.go | 33 ++++++++- x/evm/contracts/i_cosmos/ICosmos.sol | 5 ++ x/evm/contracts/initia_erc20/InitiaERC20.go | 2 +- x/evm/keeper/erc20.go | 7 ++ x/evm/keeper/erc20_test.go | 59 ++++++++++++++- x/evm/keeper/precompiles.go | 1 + x/evm/precompiles/cosmos/contract.go | 31 ++++++++ x/evm/precompiles/cosmos/contract_test.go | 71 ++++++++++++++++--- x/evm/precompiles/cosmos/types.go | 15 ++-- 18 files changed, 303 insertions(+), 28 deletions(-) diff --git a/x/bank/keeper/grpc_query_test.go b/x/bank/keeper/grpc_query_test.go index f99f5a0..1749c6b 100644 --- a/x/bank/keeper/grpc_query_test.go +++ b/x/bank/keeper/grpc_query_test.go @@ -144,7 +144,7 @@ func TestQueryDenomMetadata(t *testing.T) { require.Equal(t, []*types.DenomUnit{ { Denom: bondDenom, - Exponent: 0, + Exponent: 18, }, }, metadata.DenomUnits) } diff --git a/x/evm/contracts/counter/Counter.go b/x/evm/contracts/counter/Counter.go index 54643b6..0b9ce07 100644 --- a/x/evm/contracts/counter/Counter.go +++ b/x/evm/contracts/counter/Counter.go @@ -32,7 +32,7 @@ var ( // CounterMetaData contains all meta data concerning the Counter contract. var CounterMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"callback_received\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldCount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newCount\",\"type\":\"uint256\"}],\"name\":\"increased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"n\",\"type\":\"uint64\"}],\"name\":\"recursive_called\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"callback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"count\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"exec_msg\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"call_revert\",\"type\":\"bool\"}],\"name\":\"execute_cosmos\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"exec_msg\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allow_failure\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"name\":\"execute_cosmos_with_options\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"n\",\"type\":\"uint64\"}],\"name\":\"get_blockhash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"ibc_ack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"name\":\"ibc_timeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"increase\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"path\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"req\",\"type\":\"string\"}],\"name\":\"query_cosmos\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"result\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"n\",\"type\":\"uint64\"}],\"name\":\"recursive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405261196b806100115f395ff3fe608060405260043610610090575f3560e01c80637876da75116100585780637876da751461015e578063ac7fde5f14610186578063c31925a7146101c2578063cad23554146101ea578063e8927fbc1461022657610090565b806306661abd146100945780630d4f1f9d146100be57806324c68fce146100e657806331a503f01461010e5780636193689514610136575b5f80fd5b34801561009f575f80fd5b506100a8610230565b6040516100b59190610ca1565b60405180910390f35b3480156100c9575f80fd5b506100e460048036038101906100df9190610d3d565b610235565b005b3480156100f1575f80fd5b5061010c60048036038101906101079190610eb7565b61027c565b005b348015610119575f80fd5b50610134600480360381019061012f9190610f11565b61033c565b005b348015610141575f80fd5b5061015c60048036038101906101579190610f11565b610360565b005b348015610169575f80fd5b50610184600480360381019061017f9190610f3c565b6104b3565b005b348015610191575f80fd5b506101ac60048036038101906101a79190610f11565b610555565b6040516101b99190610fc0565b60405180910390f35b3480156101cd575f80fd5b506101e860048036038101906101e39190610d3d565b610569565b005b3480156101f5575f80fd5b50610210600480360381019061020b9190610fd9565b6105a6565b60405161021d91906110af565b60405180910390f35b61022e61062f565b005b5f5481565b8015610261578167ffffffffffffffff165f8082825461025591906110fc565b92505081905550610278565b5f808154809291906102729061112f565b91905055505b5050565b60f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6836040518263ffffffff1660e01b81526004016102b691906110af565b6020604051808303815f875af11580156102d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f6919061118a565b508015610338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032f90611225565b60405180910390fd5b5050565b8067ffffffffffffffff165f8082825461035691906110fc565b9250508190555050565b7f4475bbd12ef452e28d39c4cb77494d85136c2d89ca1354b52188d4aaa8f4ba518160405161038f9190611252565b60405180910390a15f8167ffffffffffffffff1603156104b05760f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e66103cf8361068e565b6040518263ffffffff1660e01b81526004016103eb91906110af565b6020604051808303815f875af1158015610407573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042b919061118a565b5060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e66104528361068e565b6040518263ffffffff1660e01b815260040161046e91906110af565b6020604051808303815f875af115801561048a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ae919061118a565b505b50565b60f173ffffffffffffffffffffffffffffffffffffffff16636c4f6bd584604051806040016040528086151581526020018567ffffffffffffffff168152506040518363ffffffff1660e01b815260040161050f9291906112b6565b6020604051808303815f875af115801561052b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054f919061118a565b50505050565b5f8167ffffffffffffffff16409050919050565b7fa019c7431cdfd7ba63501ffa1ba7d8f2a028e447653a5af5a96077e5038e0339828260405161059a9291906112f3565b60405180910390a15050565b606060f173ffffffffffffffffffffffffffffffffffffffff1663cad2355484846040518363ffffffff1660e01b81526004016105e492919061131a565b5f604051808303815f875af11580156105ff573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061062791906113bd565b905092915050565b5f808154809291906106409061112f565b91905055507f61996fe196f72cb598c483e896a1221263a28bb630480aa89495f737d4a8e3df60015f546106749190611404565b5f54604051610684929190611437565b60405180910390a1565b606060f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b81526004016106ca919061149d565b5f604051808303815f875af11580156106e5573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061070d91906113bd565b6107163061079a565b610772636193689560e01b60018661072e91906114b6565b60405160200161073e9190611252565b60405160208183030381529060405260405160200161075e929190611580565b6040516020818303038152906040526107c7565b6040516020016107849392919061180d565b6040516020818303038152906040529050919050565b60606107c08273ffffffffffffffffffffffffffffffffffffffff16601460ff16610a4b565b9050919050565b60605f60028084516107d991906118a0565b6107e391906110fc565b67ffffffffffffffff8111156107fc576107fb610d93565b5b6040519080825280601f01601f19166020018201604052801561082e5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110610865576108646118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106108c8576108c76118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b8351811015610a41575f848281518110610915576109146118e1565b5b602001015160f81c60f81b60f81c90507f303132333435363738396162636465660000000000000000000000000000000060048260ff16901c60ff1660108110610962576109616118e1565b5b1a60f81b836002808502018151811061097e5761097d6118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f3031323334353637383961626364656600000000000000000000000000000000600f821660ff16601081106109e5576109e46118e1565b5b1a60f81b836002600160028602010181518110610a0557610a046118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505080806001019150506108f8565b5080915050919050565b60605f8390505f6002846002610a6191906118a0565b610a6b91906110fc565b67ffffffffffffffff811115610a8457610a83610d93565b5b6040519080825280601f01601f191660200182016040528015610ab65781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110610aed57610aec6118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610b5057610b4f6118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002610b8e91906118a0565b610b9891906110fc565b90505b6001811115610c37577f3031323334353637383961626364656600000000000000000000000000000000600f841660108110610bda57610bd96118e1565b5b1a60f81b828281518110610bf157610bf06118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c925080610c309061190e565b9050610b9b565b505f8214610c7e5784846040517fe22e27eb000000000000000000000000000000000000000000000000000000008152600401610c75929190611437565b60405180910390fd5b809250505092915050565b5f819050919050565b610c9b81610c89565b82525050565b5f602082019050610cb45f830184610c92565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b610ce781610ccb565b8114610cf1575f80fd5b50565b5f81359050610d0281610cde565b92915050565b5f8115159050919050565b610d1c81610d08565b8114610d26575f80fd5b50565b5f81359050610d3781610d13565b92915050565b5f8060408385031215610d5357610d52610cc3565b5b5f610d6085828601610cf4565b9250506020610d7185828601610d29565b9150509250929050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610dc982610d83565b810181811067ffffffffffffffff82111715610de857610de7610d93565b5b80604052505050565b5f610dfa610cba565b9050610e068282610dc0565b919050565b5f67ffffffffffffffff821115610e2557610e24610d93565b5b610e2e82610d83565b9050602081019050919050565b828183375f83830152505050565b5f610e5b610e5684610e0b565b610df1565b905082815260208101848484011115610e7757610e76610d7f565b5b610e82848285610e3b565b509392505050565b5f82601f830112610e9e57610e9d610d7b565b5b8135610eae848260208601610e49565b91505092915050565b5f8060408385031215610ecd57610ecc610cc3565b5b5f83013567ffffffffffffffff811115610eea57610ee9610cc7565b5b610ef685828601610e8a565b9250506020610f0785828601610d29565b9150509250929050565b5f60208284031215610f2657610f25610cc3565b5b5f610f3384828501610cf4565b91505092915050565b5f805f60608486031215610f5357610f52610cc3565b5b5f84013567ffffffffffffffff811115610f7057610f6f610cc7565b5b610f7c86828701610e8a565b9350506020610f8d86828701610d29565b9250506040610f9e86828701610cf4565b9150509250925092565b5f819050919050565b610fba81610fa8565b82525050565b5f602082019050610fd35f830184610fb1565b92915050565b5f8060408385031215610fef57610fee610cc3565b5b5f83013567ffffffffffffffff81111561100c5761100b610cc7565b5b61101885828601610e8a565b925050602083013567ffffffffffffffff81111561103957611038610cc7565b5b61104585828601610e8a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6110818261104f565b61108b8185611059565b935061109b818560208601611069565b6110a481610d83565b840191505092915050565b5f6020820190508181035f8301526110c78184611077565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61110682610c89565b915061111183610c89565b9250828201905080821115611129576111286110cf565b5b92915050565b5f61113982610c89565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361116b5761116a6110cf565b5b600182019050919050565b5f8151905061118481610d13565b92915050565b5f6020828403121561119f5761119e610cc3565b5b5f6111ac84828501611176565b91505092915050565b7f72657665727420726561736f6e2064756d6d792076616c756520666f722074655f8201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b5f61120f602283611059565b915061121a826111b5565b604082019050919050565b5f6020820190508181035f83015261123c81611203565b9050919050565b61124c81610ccb565b82525050565b5f6020820190506112655f830184611243565b92915050565b61127481610d08565b82525050565b61128381610ccb565b82525050565b604082015f82015161129d5f85018261126b565b5060208201516112b0602085018261127a565b50505050565b5f6060820190508181035f8301526112ce8185611077565b90506112dd6020830184611289565b9392505050565b6112ed81610d08565b82525050565b5f6040820190506113065f830185611243565b61131360208301846112e4565b9392505050565b5f6040820190508181035f8301526113328185611077565b905081810360208301526113468184611077565b90509392505050565b5f61136161135c84610e0b565b610df1565b90508281526020810184848401111561137d5761137c610d7f565b5b611388848285611069565b509392505050565b5f82601f8301126113a4576113a3610d7b565b5b81516113b484826020860161134f565b91505092915050565b5f602082840312156113d2576113d1610cc3565b5b5f82015167ffffffffffffffff8111156113ef576113ee610cc7565b5b6113fb84828501611390565b91505092915050565b5f61140e82610c89565b915061141983610c89565b9250828203905081811115611431576114306110cf565b5b92915050565b5f60408201905061144a5f830185610c92565b6114576020830184610c92565b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114878261145e565b9050919050565b6114978161147d565b82525050565b5f6020820190506114b05f83018461148e565b92915050565b5f6114c082610ccb565b91506114cb83610ccb565b9250828203905067ffffffffffffffff8111156114eb576114ea6110cf565b5b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b611536611531826114f1565b61151c565b82525050565b5f81519050919050565b5f81905092915050565b5f61155a8261153c565b6115648185611546565b9350611574818560208601611069565b80840191505092915050565b5f61158b8285611525565b60048201915061159b8284611550565b91508190509392505050565b5f81905092915050565b7f7b224074797065223a20222f6d696e6965766d2e65766d2e76312e4d736743615f8201527f6c6c222c00000000000000000000000000000000000000000000000000000000602082015250565b5f61160b6024836115a7565b9150611616826115b1565b602482019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f611655600b836115a7565b915061166082611621565b600b82019050919050565b5f6116758261104f565b61167f81856115a7565b935061168f818560208601611069565b80840191505092915050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6116cf6002836115a7565b91506116da8261169b565b600282019050919050565b7f22636f6e74726163745f61646472223a202200000000000000000000000000005f82015250565b5f6117196012836115a7565b9150611724826116e5565b601282019050919050565b7f22696e707574223a2022000000000000000000000000000000000000000000005f82015250565b5f611763600a836115a7565b915061176e8261172f565b600a82019050919050565b7f2276616c7565223a202230222c000000000000000000000000000000000000005f82015250565b5f6117ad600d836115a7565b91506117b882611779565b600d82019050919050565b7f226163636573735f6c697374223a205b5d7d00000000000000000000000000005f82015250565b5f6117f76012836115a7565b9150611802826117c3565b601282019050919050565b5f611817826115ff565b915061182282611649565b915061182e828661166b565b9150611839826116c3565b91506118448261170d565b9150611850828561166b565b915061185b826116c3565b915061186682611757565b9150611872828461166b565b915061187d826116c3565b9150611888826117a1565b9150611893826117eb565b9150819050949350505050565b5f6118aa82610c89565b91506118b583610c89565b92508282026118c381610c89565b915082820484148315176118da576118d96110cf565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61191882610c89565b91505f820361192a576119296110cf565b5b60018203905091905056fea264697066735822122060aa52ec760fc9185fa974ad5976987e48326a71a2def5f39d9e5df612dc877364736f6c63430008190033", + Bin: "0x608060405261196b806100115f395ff3fe608060405260043610610090575f3560e01c80637876da75116100585780637876da751461015e578063ac7fde5f14610186578063c31925a7146101c2578063cad23554146101ea578063e8927fbc1461022657610090565b806306661abd146100945780630d4f1f9d146100be57806324c68fce146100e657806331a503f01461010e5780636193689514610136575b5f80fd5b34801561009f575f80fd5b506100a8610230565b6040516100b59190610ca1565b60405180910390f35b3480156100c9575f80fd5b506100e460048036038101906100df9190610d3d565b610235565b005b3480156100f1575f80fd5b5061010c60048036038101906101079190610eb7565b61027c565b005b348015610119575f80fd5b50610134600480360381019061012f9190610f11565b61033c565b005b348015610141575f80fd5b5061015c60048036038101906101579190610f11565b610360565b005b348015610169575f80fd5b50610184600480360381019061017f9190610f3c565b6104b3565b005b348015610191575f80fd5b506101ac60048036038101906101a79190610f11565b610555565b6040516101b99190610fc0565b60405180910390f35b3480156101cd575f80fd5b506101e860048036038101906101e39190610d3d565b610569565b005b3480156101f5575f80fd5b50610210600480360381019061020b9190610fd9565b6105a6565b60405161021d91906110af565b60405180910390f35b61022e61062f565b005b5f5481565b8015610261578167ffffffffffffffff165f8082825461025591906110fc565b92505081905550610278565b5f808154809291906102729061112f565b91905055505b5050565b60f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6836040518263ffffffff1660e01b81526004016102b691906110af565b6020604051808303815f875af11580156102d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f6919061118a565b508015610338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032f90611225565b60405180910390fd5b5050565b8067ffffffffffffffff165f8082825461035691906110fc565b9250508190555050565b7f4475bbd12ef452e28d39c4cb77494d85136c2d89ca1354b52188d4aaa8f4ba518160405161038f9190611252565b60405180910390a15f8167ffffffffffffffff1603156104b05760f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e66103cf8361068e565b6040518263ffffffff1660e01b81526004016103eb91906110af565b6020604051808303815f875af1158015610407573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042b919061118a565b5060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e66104528361068e565b6040518263ffffffff1660e01b815260040161046e91906110af565b6020604051808303815f875af115801561048a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ae919061118a565b505b50565b60f173ffffffffffffffffffffffffffffffffffffffff16636c4f6bd584604051806040016040528086151581526020018567ffffffffffffffff168152506040518363ffffffff1660e01b815260040161050f9291906112b6565b6020604051808303815f875af115801561052b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054f919061118a565b50505050565b5f8167ffffffffffffffff16409050919050565b7fa019c7431cdfd7ba63501ffa1ba7d8f2a028e447653a5af5a96077e5038e0339828260405161059a9291906112f3565b60405180910390a15050565b606060f173ffffffffffffffffffffffffffffffffffffffff1663cad2355484846040518363ffffffff1660e01b81526004016105e492919061131a565b5f604051808303815f875af11580156105ff573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061062791906113bd565b905092915050565b5f808154809291906106409061112f565b91905055507f61996fe196f72cb598c483e896a1221263a28bb630480aa89495f737d4a8e3df60015f546106749190611404565b5f54604051610684929190611437565b60405180910390a1565b606060f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b81526004016106ca919061149d565b5f604051808303815f875af11580156106e5573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061070d91906113bd565b6107163061079a565b610772636193689560e01b60018661072e91906114b6565b60405160200161073e9190611252565b60405160208183030381529060405260405160200161075e929190611580565b6040516020818303038152906040526107c7565b6040516020016107849392919061180d565b6040516020818303038152906040529050919050565b60606107c08273ffffffffffffffffffffffffffffffffffffffff16601460ff16610a4b565b9050919050565b60605f60028084516107d991906118a0565b6107e391906110fc565b67ffffffffffffffff8111156107fc576107fb610d93565b5b6040519080825280601f01601f19166020018201604052801561082e5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110610865576108646118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106108c8576108c76118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b8351811015610a41575f848281518110610915576109146118e1565b5b602001015160f81c60f81b60f81c90507f303132333435363738396162636465660000000000000000000000000000000060048260ff16901c60ff1660108110610962576109616118e1565b5b1a60f81b836002808502018151811061097e5761097d6118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f3031323334353637383961626364656600000000000000000000000000000000600f821660ff16601081106109e5576109e46118e1565b5b1a60f81b836002600160028602010181518110610a0557610a046118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505080806001019150506108f8565b5080915050919050565b60605f8390505f6002846002610a6191906118a0565b610a6b91906110fc565b67ffffffffffffffff811115610a8457610a83610d93565b5b6040519080825280601f01601f191660200182016040528015610ab65781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110610aed57610aec6118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610b5057610b4f6118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002610b8e91906118a0565b610b9891906110fc565b90505b6001811115610c37577f3031323334353637383961626364656600000000000000000000000000000000600f841660108110610bda57610bd96118e1565b5b1a60f81b828281518110610bf157610bf06118e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c925080610c309061190e565b9050610b9b565b505f8214610c7e5784846040517fe22e27eb000000000000000000000000000000000000000000000000000000008152600401610c75929190611437565b60405180910390fd5b809250505092915050565b5f819050919050565b610c9b81610c89565b82525050565b5f602082019050610cb45f830184610c92565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f67ffffffffffffffff82169050919050565b610ce781610ccb565b8114610cf1575f80fd5b50565b5f81359050610d0281610cde565b92915050565b5f8115159050919050565b610d1c81610d08565b8114610d26575f80fd5b50565b5f81359050610d3781610d13565b92915050565b5f8060408385031215610d5357610d52610cc3565b5b5f610d6085828601610cf4565b9250506020610d7185828601610d29565b9150509250929050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610dc982610d83565b810181811067ffffffffffffffff82111715610de857610de7610d93565b5b80604052505050565b5f610dfa610cba565b9050610e068282610dc0565b919050565b5f67ffffffffffffffff821115610e2557610e24610d93565b5b610e2e82610d83565b9050602081019050919050565b828183375f83830152505050565b5f610e5b610e5684610e0b565b610df1565b905082815260208101848484011115610e7757610e76610d7f565b5b610e82848285610e3b565b509392505050565b5f82601f830112610e9e57610e9d610d7b565b5b8135610eae848260208601610e49565b91505092915050565b5f8060408385031215610ecd57610ecc610cc3565b5b5f83013567ffffffffffffffff811115610eea57610ee9610cc7565b5b610ef685828601610e8a565b9250506020610f0785828601610d29565b9150509250929050565b5f60208284031215610f2657610f25610cc3565b5b5f610f3384828501610cf4565b91505092915050565b5f805f60608486031215610f5357610f52610cc3565b5b5f84013567ffffffffffffffff811115610f7057610f6f610cc7565b5b610f7c86828701610e8a565b9350506020610f8d86828701610d29565b9250506040610f9e86828701610cf4565b9150509250925092565b5f819050919050565b610fba81610fa8565b82525050565b5f602082019050610fd35f830184610fb1565b92915050565b5f8060408385031215610fef57610fee610cc3565b5b5f83013567ffffffffffffffff81111561100c5761100b610cc7565b5b61101885828601610e8a565b925050602083013567ffffffffffffffff81111561103957611038610cc7565b5b61104585828601610e8a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6110818261104f565b61108b8185611059565b935061109b818560208601611069565b6110a481610d83565b840191505092915050565b5f6020820190508181035f8301526110c78184611077565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61110682610c89565b915061111183610c89565b9250828201905080821115611129576111286110cf565b5b92915050565b5f61113982610c89565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361116b5761116a6110cf565b5b600182019050919050565b5f8151905061118481610d13565b92915050565b5f6020828403121561119f5761119e610cc3565b5b5f6111ac84828501611176565b91505092915050565b7f72657665727420726561736f6e2064756d6d792076616c756520666f722074655f8201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b5f61120f602283611059565b915061121a826111b5565b604082019050919050565b5f6020820190508181035f83015261123c81611203565b9050919050565b61124c81610ccb565b82525050565b5f6020820190506112655f830184611243565b92915050565b61127481610d08565b82525050565b61128381610ccb565b82525050565b604082015f82015161129d5f85018261126b565b5060208201516112b0602085018261127a565b50505050565b5f6060820190508181035f8301526112ce8185611077565b90506112dd6020830184611289565b9392505050565b6112ed81610d08565b82525050565b5f6040820190506113065f830185611243565b61131360208301846112e4565b9392505050565b5f6040820190508181035f8301526113328185611077565b905081810360208301526113468184611077565b90509392505050565b5f61136161135c84610e0b565b610df1565b90508281526020810184848401111561137d5761137c610d7f565b5b611388848285611069565b509392505050565b5f82601f8301126113a4576113a3610d7b565b5b81516113b484826020860161134f565b91505092915050565b5f602082840312156113d2576113d1610cc3565b5b5f82015167ffffffffffffffff8111156113ef576113ee610cc7565b5b6113fb84828501611390565b91505092915050565b5f61140e82610c89565b915061141983610c89565b9250828203905081811115611431576114306110cf565b5b92915050565b5f60408201905061144a5f830185610c92565b6114576020830184610c92565b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114878261145e565b9050919050565b6114978161147d565b82525050565b5f6020820190506114b05f83018461148e565b92915050565b5f6114c082610ccb565b91506114cb83610ccb565b9250828203905067ffffffffffffffff8111156114eb576114ea6110cf565b5b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f819050919050565b611536611531826114f1565b61151c565b82525050565b5f81519050919050565b5f81905092915050565b5f61155a8261153c565b6115648185611546565b9350611574818560208601611069565b80840191505092915050565b5f61158b8285611525565b60048201915061159b8284611550565b91508190509392505050565b5f81905092915050565b7f7b224074797065223a20222f6d696e6965766d2e65766d2e76312e4d736743615f8201527f6c6c222c00000000000000000000000000000000000000000000000000000000602082015250565b5f61160b6024836115a7565b9150611616826115b1565b602482019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f611655600b836115a7565b915061166082611621565b600b82019050919050565b5f6116758261104f565b61167f81856115a7565b935061168f818560208601611069565b80840191505092915050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6116cf6002836115a7565b91506116da8261169b565b600282019050919050565b7f22636f6e74726163745f61646472223a202200000000000000000000000000005f82015250565b5f6117196012836115a7565b9150611724826116e5565b601282019050919050565b7f22696e707574223a2022000000000000000000000000000000000000000000005f82015250565b5f611763600a836115a7565b915061176e8261172f565b600a82019050919050565b7f2276616c7565223a202230222c000000000000000000000000000000000000005f82015250565b5f6117ad600d836115a7565b91506117b882611779565b600d82019050919050565b7f226163636573735f6c697374223a205b5d7d00000000000000000000000000005f82015250565b5f6117f76012836115a7565b9150611802826117c3565b601282019050919050565b5f611817826115ff565b915061182282611649565b915061182e828661166b565b9150611839826116c3565b91506118448261170d565b9150611850828561166b565b915061185b826116c3565b915061186682611757565b9150611872828461166b565b915061187d826116c3565b9150611888826117a1565b9150611893826117eb565b9150819050949350505050565b5f6118aa82610c89565b91506118b583610c89565b92508282026118c381610c89565b915082820484148315176118da576118d96110cf565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61191882610c89565b91505f820361192a576119296110cf565b5b60018203905091905056fea2646970667358221220232e4a59c853984a75103129e9f3653dfa3c427f01a17f8e49f2ad464aa328d464736f6c63430008190033", } // CounterABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/erc20/ERC20.go b/x/evm/contracts/erc20/ERC20.go index 50bd081..a4c15da 100644 --- a/x/evm/contracts/erc20/ERC20.go +++ b/x/evm/contracts/erc20/ERC20.go @@ -31,8 +31,8 @@ var ( // Erc20MetaData contains all meta data concerning the Erc20 contract. var Erc20MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b506040516124f13803806124f183398181016040528101906100319190610235565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826003908161007f91906104ca565b50816004908161008f91906104ca565b508060055f6101000a81548160ff021916908360ff160217905550505050610599565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610111826100cb565b810181811067ffffffffffffffff821117156101305761012f6100db565b5b80604052505050565b5f6101426100b2565b905061014e8282610108565b919050565b5f67ffffffffffffffff82111561016d5761016c6100db565b5b610176826100cb565b9050602081019050919050565b8281835e5f83830152505050565b5f6101a361019e84610153565b610139565b9050828152602081018484840111156101bf576101be6100c7565b5b6101ca848285610183565b509392505050565b5f82601f8301126101e6576101e56100c3565b5b81516101f6848260208601610191565b91505092915050565b5f60ff82169050919050565b610214816101ff565b811461021e575f80fd5b50565b5f8151905061022f8161020b565b92915050565b5f805f6060848603121561024c5761024b6100bb565b5b5f84015167ffffffffffffffff811115610269576102686100bf565b5b610275868287016101d2565b935050602084015167ffffffffffffffff811115610296576102956100bf565b5b6102a2868287016101d2565b92505060406102b386828701610221565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061030b57607f821691505b60208210810361031e5761031d6102c7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610345565b61038a8683610345565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6103ce6103c96103c4846103a2565b6103ab565b6103a2565b9050919050565b5f819050919050565b6103e7836103b4565b6103fb6103f3826103d5565b848454610351565b825550505050565b5f90565b61040f610403565b61041a8184846103de565b505050565b5b8181101561043d576104325f82610407565b600181019050610420565b5050565b601f8211156104825761045381610324565b61045c84610336565b8101602085101561046b578190505b61047f61047785610336565b83018261041f565b50505b505050565b5f82821c905092915050565b5f6104a25f1984600802610487565b1980831691505092915050565b5f6104ba8383610493565b9150826002028217905092915050565b6104d3826102bd565b67ffffffffffffffff8111156104ec576104eb6100db565b5b6104f682546102f4565b610501828285610441565b5f60209050601f831160018114610532575f8415610520578287015190505b61052a85826104af565b865550610591565b601f19841661054086610324565b5f5b8281101561056757848901518255600182019150602085019450602081019050610542565b868310156105845784890151610580601f891682610493565b8355505b6001600288020188555050505b505050505050565b611f4b806105a65f395ff3fe608060405234801561000f575f80fd5b5060043610610114575f3560e01c806342966c68116100a057806395d89b411161006f57806395d89b41146102f0578063a9059cbb1461030e578063dd62ed3e1461033e578063f2fde38b1461036e578063fe1195ec1461038a57610114565b806342966c681461025657806370a082311461027257806379cc6790146102a25780638da5cb5b146102d257610114565b80631988513b116100e75780631988513b146101b457806323b872dd146101d05780632d688ca814610200578063313ce5671461021c57806340c10f191461023a57610114565b806301ffc9a71461011857806306fdde0314610148578063095ea7b31461016657806318160ddd14610196575b5f80fd5b610132600480360381019061012d91906116b1565b6103a6565b60405161013f91906116f6565b60405180910390f35b61015061041f565b60405161015d919061177f565b60405180910390f35b610180600480360381019061017b919061182c565b6104ab565b60405161018d91906116f6565b60405180910390f35b61019e610598565b6040516101ab9190611879565b60405180910390f35b6101ce60048036038101906101c99190611892565b61059e565b005b6101ea60048036038101906101e59190611892565b61061d565b6040516101f791906116f6565b60405180910390f35b61021a6004803603810190610215919061182c565b610838565b005b6102246108b5565b60405161023191906118fd565b60405180910390f35b610254600480360381019061024f919061182c565b6108c7565b005b610270600480360381019061026b9190611916565b6109e6565b005b61028c60048036038101906102879190611941565b610aae565b6040516102999190611879565b60405180910390f35b6102bc60048036038101906102b7919061182c565b610ac3565b6040516102c991906116f6565b60405180910390f35b6102da610cdc565b6040516102e7919061197b565b60405180910390f35b6102f8610cff565b604051610305919061177f565b60405180910390f35b6103286004803603810190610323919061182c565b610d8b565b60405161033591906116f6565b60405180910390f35b61035860048036038101906103539190611994565b610e5c565b6040516103659190611879565b60405180910390f35b61038860048036038101906103839190611941565b610e7c565b005b6103a4600480360381019061039f919061182c565b610fc4565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610418575061041782611041565b5b9050919050565b6003805461042c906119ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610458906119ff565b80156104a35780601f1061047a576101008083540402835291602001916104a3565b820191905f5260205f20905b81548152906001019060200180831161048657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105869190611879565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490611a79565b60405180910390fd5b6106188383836110aa565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610659919061197b565b602060405180830381865afa158015610674573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106989190611ac1565b156106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611b5c565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90611bea565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461081a9190611c35565b9250508190555061082c8585856110aa565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90611a79565b60405180910390fd5b6108b18282611335565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610902919061197b565b602060405180830381865afa15801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611ac1565b15610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890611cb2565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d7575f80fd5b6109e18383611335565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a21919061197b565b602060405180830381865afa158015610a3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a609190611ac1565b15610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790611d1a565b60405180910390fd5b610aaa3383611504565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610aff919061197b565b602060405180830381865afa158015610b1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e9190611ac1565b15610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590611d1a565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090611da8565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610cc09190611c35565b92505081905550610cd18484611504565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d0c906119ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610d38906119ff565b8015610d835780601f10610d5a57610100808354040283529160200191610d83565b820191905f5260205f20905b815481529060010190602001808311610d6657829003601f168201915b505050505081565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610dc7919061197b565b602060405180830381865afa158015610de2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e069190611ac1565b15610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90611b5c565b60405180910390fd5b610e513385856110aa565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed2575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f09575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90611a79565b60405180910390fd5b61103d8282611504565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016110e5919061197b565b602060405180830381865afa158015611100573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111249190611ac1565b6111a45760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b8152600401611162919061197b565b6020604051808303815f875af115801561117e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a29190611ac1565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90611e36565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112709190611c35565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112c39190611e54565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113279190611879565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b8152600401611370919061197b565b602060405180830381865afa15801561138b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113af9190611ac1565b61142f5760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113ed919061197b565b6020604051808303815f875af1158015611409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142d9190611ac1565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461147b9190611e54565b925050819055508160065f8282546114939190611e54565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114f79190611879565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90611ef7565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546115d09190611c35565b925050819055508060065f8282546115e89190611c35565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161164c9190611879565b60405180910390a35050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6116908161165c565b811461169a575f80fd5b50565b5f813590506116ab81611687565b92915050565b5f602082840312156116c6576116c5611658565b5b5f6116d38482850161169d565b91505092915050565b5f8115159050919050565b6116f0816116dc565b82525050565b5f6020820190506117095f8301846116e7565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6117518261170f565b61175b8185611719565b935061176b818560208601611729565b61177481611737565b840191505092915050565b5f6020820190508181035f8301526117978184611747565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117c88261179f565b9050919050565b6117d8816117be565b81146117e2575f80fd5b50565b5f813590506117f3816117cf565b92915050565b5f819050919050565b61180b816117f9565b8114611815575f80fd5b50565b5f8135905061182681611802565b92915050565b5f806040838503121561184257611841611658565b5b5f61184f858286016117e5565b925050602061186085828601611818565b9150509250929050565b611873816117f9565b82525050565b5f60208201905061188c5f83018461186a565b92915050565b5f805f606084860312156118a9576118a8611658565b5b5f6118b6868287016117e5565b93505060206118c7868287016117e5565b92505060406118d886828701611818565b9150509250925092565b5f60ff82169050919050565b6118f7816118e2565b82525050565b5f6020820190506119105f8301846118ee565b92915050565b5f6020828403121561192b5761192a611658565b5b5f61193884828501611818565b91505092915050565b5f6020828403121561195657611955611658565b5b5f611963848285016117e5565b91505092915050565b611975816117be565b82525050565b5f60208201905061198e5f83018461196c565b92915050565b5f80604083850312156119aa576119a9611658565b5b5f6119b7858286016117e5565b92505060206119c8858286016117e5565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a1657607f821691505b602082108103611a2957611a286119d2565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611a63601e83611719565b9150611a6e82611a2f565b602082019050919050565b5f6020820190508181035f830152611a9081611a57565b9050919050565b611aa0816116dc565b8114611aaa575f80fd5b50565b5f81519050611abb81611a97565b92915050565b5f60208284031215611ad657611ad5611658565b5b5f611ae384828501611aad565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611b46602283611719565b9150611b5182611aec565b604082019050919050565b5f6020820190508181035f830152611b7381611b3a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611bd4602883611719565b9150611bdf82611b7a565b604082019050919050565b5f6020820190508181035f830152611c0181611bc8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c3f826117f9565b9150611c4a836117f9565b9250828203905081811115611c6257611c61611c08565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f611c9c601e83611719565b9150611ca782611c68565b602082019050919050565b5f6020820190508181035f830152611cc981611c90565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f611d04601f83611719565b9150611d0f82611cd0565b602082019050919050565b5f6020820190508181035f830152611d3181611cf8565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f611d92602483611719565b9150611d9d82611d38565b604082019050919050565b5f6020820190508181035f830152611dbf81611d86565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611e20602683611719565b9150611e2b82611dc6565b604082019050919050565b5f6020820190508181035f830152611e4d81611e14565b9050919050565b5f611e5e826117f9565b9150611e69836117f9565b9250828201905080821115611e8157611e80611c08565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ee1602283611719565b9150611eec82611e87565b604082019050919050565b5f6020820190508181035f830152611f0e81611ed5565b905091905056fea2646970667358221220531dd3eb23837e3dacf88153213c51373be5ae3e9b5b3ca25450c866fb8833b464736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c67380380612c6783398181016040528101906100319190610285565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052e565b50826004908161008f919061052e565b508160055f6101000a81548160ff021916908360ff16021790555080600560016101000a81548160ff021916908315150217905550505050506105fd565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012c826100e6565b810181811067ffffffffffffffff8211171561014b5761014a6100f6565b5b80604052505050565b5f61015d6100cd565b90506101698282610123565b919050565b5f67ffffffffffffffff821115610188576101876100f6565b5b610191826100e6565b9050602081019050919050565b8281835e5f83830152505050565b5f6101be6101b98461016e565b610154565b9050828152602081018484840111156101da576101d96100e2565b5b6101e584828561019e565b509392505050565b5f82601f830112610201576102006100de565b5b81516102118482602086016101ac565b91505092915050565b5f60ff82169050919050565b61022f8161021a565b8114610239575f80fd5b50565b5f8151905061024a81610226565b92915050565b5f8115159050919050565b61026481610250565b811461026e575f80fd5b50565b5f8151905061027f8161025b565b92915050565b5f805f806080858703121561029d5761029c6100d6565b5b5f85015167ffffffffffffffff8111156102ba576102b96100da565b5b6102c6878288016101ed565b945050602085015167ffffffffffffffff8111156102e7576102e66100da565b5b6102f3878288016101ed565b93505060406103048782880161023c565b925050606061031587828801610271565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036f57607f821691505b6020821081036103825761038161032b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a9565b6103ee86836103a9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043261042d61042884610406565b61040f565b610406565b9050919050565b5f819050919050565b61044b83610418565b61045f61045782610439565b8484546103b5565b825550505050565b5f90565b610473610467565b61047e818484610442565b505050565b5b818110156104a1576104965f8261046b565b600181019050610484565b5050565b601f8211156104e6576104b781610388565b6104c08461039a565b810160208510156104cf578190505b6104e36104db8561039a565b830182610483565b50505b505050565b5f82821c905092915050565b5f6105065f19846008026104eb565b1980831691505092915050565b5f61051e83836104f7565b9150826002028217905092915050565b61053782610321565b67ffffffffffffffff8111156105505761054f6100f6565b5b61055a8254610358565b6105658282856104a5565b5f60209050601f831160018114610596575f8415610584578287015190505b61058e8582610513565b8655506105f5565b601f1984166105a486610388565b5f5b828110156105cb578489015182556001820191506020850194506020810190506105a6565b868310156105e857848901516105e4601f8916826104f7565b8355505b6001600288020188555050505b505050505050565b61265d8061060a5f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611883565b6103f6565b60405161015591906118c8565b60405180910390f35b61016661046f565b6040516101739190611951565b60405180910390f35b610196600480360381019061019191906119fe565b6104fb565b6040516101a391906118c8565b60405180910390f35b6101b46105e8565b6040516101c19190611a4b565b60405180910390f35b6101e460048036038101906101df9190611a64565b6105ee565b005b61020060048036038101906101fb9190611a64565b61066d565b60405161020d91906118c8565b60405180910390f35b610230600480360381019061022b91906119fe565b610888565b005b61023a610905565b6040516102479190611acf565b60405180910390f35b61026a600480360381019061026591906119fe565b610917565b005b61028660048036038101906102819190611ae8565b610a36565b005b6102a2600480360381019061029d9190611b13565b610afe565b6040516102af9190611a4b565b60405180910390f35b6102d260048036038101906102cd91906119fe565b610b13565b6040516102df91906118c8565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4d565b60405180910390f35b61030e610d4f565b60405161031b9190611951565b60405180910390f35b61033e60048036038101906103399190611cbc565b610ddb565b005b61035a600480360381019061035591906119fe565b610f3d565b60405161036791906118c8565b60405180910390f35b61038a60048036038101906103859190611d44565b61100e565b6040516103979190611a4b565b60405180910390f35b6103ba60048036038101906103b59190611b13565b61102e565b005b6103c4611176565b6040516103d191906118c8565b60405180910390f35b6103f460048036038101906103ef91906119fe565b611189565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611206565b5b9050919050565b6003805461047c90611daf565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611daf565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a4b565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e29565b60405180910390fd5b61066883838361126f565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4d565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e71565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f0c565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f9a565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe5565b9250508190555061087c85858561126f565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e29565b60405180910390fd5b61090182826114fa565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4d565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e71565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890612062565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114fa565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4d565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e71565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120ca565b60405180910390fd5b610afa33836116c9565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4d565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e71565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120ca565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612158565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe5565b92505081905550610d2184846116c9565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611daf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611daf565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4d565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e71565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e6565b60405180910390fd5b600560019054906101000a900460ff1615610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda9061224e565b60405180910390fd5b8260039081610ef29190612409565b508160049081610f029190612409565b508060055f6101000a81548160ff021916908360ff1602179055506001600560016101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f799190611b4d565b602060405180830381865afa158015610f94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb89190611e71565b15610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90611f0c565b60405180910390fd5b61100333858561126f565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611084575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110bb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560019054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90611e29565b60405180910390fd5b61120282826116c9565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112aa9190611b4d565b602060405180830381865afa1580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e99190611e71565b6113695760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113279190611b4d565b6020604051808303815f875af1158015611343573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113679190611e71565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090612548565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114359190611fe5565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114889190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114ec9190611a4b565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115359190611b4d565b602060405180830381865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190611e71565b6115f45760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115b29190611b4d565b6020604051808303815f875af11580156115ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f29190611e71565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546116409190612566565b925050819055508160065f8282546116589190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116bc9190611a4b565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090612609565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117959190611fe5565b925050819055508060065f8282546117ad9190611fe5565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118119190611a4b565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118628161182e565b811461186c575f80fd5b50565b5f8135905061187d81611859565b92915050565b5f6020828403121561189857611897611826565b5b5f6118a58482850161186f565b91505092915050565b5f8115159050919050565b6118c2816118ae565b82525050565b5f6020820190506118db5f8301846118b9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611923826118e1565b61192d81856118eb565b935061193d8185602086016118fb565b61194681611909565b840191505092915050565b5f6020820190508181035f8301526119698184611919565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61199a82611971565b9050919050565b6119aa81611990565b81146119b4575f80fd5b50565b5f813590506119c5816119a1565b92915050565b5f819050919050565b6119dd816119cb565b81146119e7575f80fd5b50565b5f813590506119f8816119d4565b92915050565b5f8060408385031215611a1457611a13611826565b5b5f611a21858286016119b7565b9250506020611a32858286016119ea565b9150509250929050565b611a45816119cb565b82525050565b5f602082019050611a5e5f830184611a3c565b92915050565b5f805f60608486031215611a7b57611a7a611826565b5b5f611a88868287016119b7565b9350506020611a99868287016119b7565b9250506040611aaa868287016119ea565b9150509250925092565b5f60ff82169050919050565b611ac981611ab4565b82525050565b5f602082019050611ae25f830184611ac0565b92915050565b5f60208284031215611afd57611afc611826565b5b5f611b0a848285016119ea565b91505092915050565b5f60208284031215611b2857611b27611826565b5b5f611b35848285016119b7565b91505092915050565b611b4781611990565b82525050565b5f602082019050611b605f830184611b3e565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba482611909565b810181811067ffffffffffffffff82111715611bc357611bc2611b6e565b5b80604052505050565b5f611bd561181d565b9050611be18282611b9b565b919050565b5f67ffffffffffffffff821115611c0057611bff611b6e565b5b611c0982611909565b9050602081019050919050565b828183375f83830152505050565b5f611c36611c3184611be6565b611bcc565b905082815260208101848484011115611c5257611c51611b6a565b5b611c5d848285611c16565b509392505050565b5f82601f830112611c7957611c78611b66565b5b8135611c89848260208601611c24565b91505092915050565b611c9b81611ab4565b8114611ca5575f80fd5b50565b5f81359050611cb681611c92565b92915050565b5f805f60608486031215611cd357611cd2611826565b5b5f84013567ffffffffffffffff811115611cf057611cef61182a565b5b611cfc86828701611c65565b935050602084013567ffffffffffffffff811115611d1d57611d1c61182a565b5b611d2986828701611c65565b9250506040611d3a86828701611ca8565b9150509250925092565b5f8060408385031215611d5a57611d59611826565b5b5f611d67858286016119b7565b9250506020611d78858286016119b7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc657607f821691505b602082108103611dd957611dd8611d82565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e13601e836118eb565b9150611e1e82611ddf565b602082019050919050565b5f6020820190508181035f830152611e4081611e07565b9050919050565b611e50816118ae565b8114611e5a575f80fd5b50565b5f81519050611e6b81611e47565b92915050565b5f60208284031215611e8657611e85611826565b5b5f611e9384828501611e5d565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef66022836118eb565b9150611f0182611e9c565b604082019050919050565b5f6020820190508181035f830152611f2381611eea565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f846028836118eb565b9150611f8f82611f2a565b604082019050919050565b5f6020820190508181035f830152611fb181611f78565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fef826119cb565b9150611ffa836119cb565b925082820390508181111561201257612011611fb8565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f61204c601e836118eb565b915061205782612018565b602082019050919050565b5f6020820190508181035f83015261207981612040565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b4601f836118eb565b91506120bf82612080565b602082019050919050565b5f6020820190508181035f8301526120e1816120a8565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f6121426024836118eb565b915061214d826120e8565b604082019050919050565b5f6020820190508181035f83015261216f81612136565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121d06022836118eb565b91506121db82612176565b604082019050919050565b5f6020820190508181035f8301526121fd816121c4565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122386016836118eb565b915061224382612204565b602082019050919050565b5f6020820190508181035f8301526122658161222c565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228d565b6122d2868361228d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230d612308612303846119cb565b6122ea565b6119cb565b9050919050565b5f819050919050565b612326836122f3565b61233a61233282612314565b848454612299565b825550505050565b5f90565b61234e612342565b61235981848461231d565b505050565b5b8181101561237c576123715f82612346565b60018101905061235f565b5050565b601f8211156123c1576123928161226c565b61239b8461227e565b810160208510156123aa578190505b6123be6123b68561227e565b83018261235e565b50505b505050565b5f82821c905092915050565b5f6123e15f19846008026123c6565b1980831691505092915050565b5f6123f983836123d2565b9150826002028217905092915050565b612412826118e1565b67ffffffffffffffff81111561242b5761242a611b6e565b5b6124358254611daf565b612440828285612380565b5f60209050601f831160018114612471575f841561245f578287015190505b61246985826123ee565b8655506124d0565b601f19841661247f8661226c565b5f5b828110156124a657848901518255600182019150602085019450602081019050612481565b868310156124c357848901516124bf601f8916826123d2565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6125326026836118eb565b915061253d826124d8565b604082019050919050565b5f6020820190508181035f83015261255f81612526565b9050919050565b5f612570826119cb565b915061257b836119cb565b925082820190508082111561259357612592611fb8565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f36022836118eb565b91506125fe82612599565b604082019050919050565b5f6020820190508181035f830152612620816125e7565b905091905056fea2646970667358221220e2cfc0097f51eca2b1fbd34739d93e3d63cce4e6c99115fdcecc1f57067f4d8764736f6c63430008190033", } // Erc20ABI is the input ABI used to generate the binding from. @@ -44,7 +44,7 @@ var Erc20ABI = Erc20MetaData.ABI var Erc20Bin = Erc20MetaData.Bin // DeployErc20 deploys a new Ethereum contract, binding an instance of Erc20 to it. -func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8) (common.Address, *types.Transaction, *Erc20, error) { +func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8, _metadataSealed bool) (common.Address, *types.Transaction, *Erc20, error) { parsed, err := Erc20MetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -53,7 +53,7 @@ func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name st return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend, _name, _symbol, _decimals) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend, _name, _symbol, _decimals, _metadataSealed) if err != nil { return common.Address{}, nil, nil, err } @@ -295,6 +295,37 @@ func (_Erc20 *Erc20CallerSession) Decimals() (uint8, error) { return _Erc20.Contract.Decimals(&_Erc20.CallOpts) } +// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. +// +// Solidity: function metadataSealed() view returns(bool) +func (_Erc20 *Erc20Caller) MetadataSealed(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "metadataSealed") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. +// +// Solidity: function metadataSealed() view returns(bool) +func (_Erc20 *Erc20Session) MetadataSealed() (bool, error) { + return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) +} + +// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. +// +// Solidity: function metadataSealed() view returns(bool) +func (_Erc20 *Erc20CallerSession) MetadataSealed() (bool, error) { + return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) +} + // Name is a free data retrieval call binding the contract method 0x06fdde03. // // Solidity: function name() view returns(string) @@ -660,6 +691,27 @@ func (_Erc20 *Erc20TransactorSession) TransferOwnership(newOwner common.Address) return _Erc20.Contract.TransferOwnership(&_Erc20.TransactOpts, newOwner) } +// UpdateMetadata is a paid mutator transaction binding the contract method 0x9f191484. +// +// Solidity: function updateMetadata(string _name, string _symbol, uint8 _decimals) returns() +func (_Erc20 *Erc20Transactor) UpdateMetadata(opts *bind.TransactOpts, _name string, _symbol string, _decimals uint8) (*types.Transaction, error) { + return _Erc20.contract.Transact(opts, "updateMetadata", _name, _symbol, _decimals) +} + +// UpdateMetadata is a paid mutator transaction binding the contract method 0x9f191484. +// +// Solidity: function updateMetadata(string _name, string _symbol, uint8 _decimals) returns() +func (_Erc20 *Erc20Session) UpdateMetadata(_name string, _symbol string, _decimals uint8) (*types.Transaction, error) { + return _Erc20.Contract.UpdateMetadata(&_Erc20.TransactOpts, _name, _symbol, _decimals) +} + +// UpdateMetadata is a paid mutator transaction binding the contract method 0x9f191484. +// +// Solidity: function updateMetadata(string _name, string _symbol, uint8 _decimals) returns() +func (_Erc20 *Erc20TransactorSession) UpdateMetadata(_name string, _symbol string, _decimals uint8) (*types.Transaction, error) { + return _Erc20.Contract.UpdateMetadata(&_Erc20.TransactOpts, _name, _symbol, _decimals) +} + // Erc20ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Erc20 contract. type Erc20ApprovalIterator struct { Event *Erc20Approval // Event containing the contract specifics and raw log diff --git a/x/evm/contracts/erc20/ERC20.sol b/x/evm/contracts/erc20/ERC20.sol index 03939a0..028a608 100644 --- a/x/evm/contracts/erc20/ERC20.sol +++ b/x/evm/contracts/erc20/ERC20.sol @@ -17,9 +17,13 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; + + // ERC20 Metadata string public name; string public symbol; uint8 public decimals; + bool public metadataSealed; + uint256 public totalSupply; /** @@ -34,10 +38,11 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { } // for custom erc20s, you should add `register_erc20` modifier to the constructor - constructor(string memory _name, string memory _symbol, uint8 _decimals) { + constructor(string memory _name, string memory _symbol, uint8 _decimals, bool _metadataSealed) { name = _name; symbol = _symbol; decimals = _decimals; + metadataSealed = _metadataSealed; } function _transfer( @@ -127,4 +132,23 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { function sudoBurn(address from, uint256 amount) external onlyChain { _burn(from, amount); } + + // + // ERC20 Metadata onetime setters only for authority(gov) + // + + function updateMetadata( + string memory _name, + string memory _symbol, + uint8 _decimals + ) external onlyAuthority { + require(!metadataSealed, "ERC20: metadata sealed"); + + name = _name; + symbol = _symbol; + decimals = _decimals; + + // seal the metadata to prevent further updates + metadataSealed = true; + } } diff --git a/x/evm/contracts/erc20_acl/ERC20ACL.go b/x/evm/contracts/erc20_acl/ERC20ACL.go index b450933..bb3e81a 100644 --- a/x/evm/contracts/erc20_acl/ERC20ACL.go +++ b/x/evm/contracts/erc20_acl/ERC20ACL.go @@ -32,7 +32,7 @@ var ( // Erc20AclMetaData contains all meta data concerning the Erc20Acl contract. var Erc20AclMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x6080604052348015600e575f80fd5b50603e80601a5f395ff3fe60806040525f80fdfea26469706673582212205d9c40df59ea8bf00869d11ef310df342c7e9e4c70430f7d6a5b145b859ee59064736f6c63430008190033", + Bin: "0x6080604052348015600e575f80fd5b50603e80601a5f395ff3fe60806040525f80fdfea2646970667358221220537b0282a8646014c6562fd7be2cc2d57ee98d24beeb825458dcf8f452e93c5564736f6c63430008190033", } // Erc20AclABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/erc20_acl/ERC20ACL.sol b/x/evm/contracts/erc20_acl/ERC20ACL.sol index a4e48a4..b5dcea1 100644 --- a/x/evm/contracts/erc20_acl/ERC20ACL.sol +++ b/x/evm/contracts/erc20_acl/ERC20ACL.sol @@ -15,6 +15,15 @@ contract ERC20ACL { _; } + modifier onlyAuthority() { + require( + COSMOS_CONTRACT.is_authority_address(msg.sender), + "ERC20: caller is not the authority" + ); + + _; + } + // check if the sender is a module address modifier burnable(address from) { require( diff --git a/x/evm/contracts/erc20_factory/ERC20Factory.go b/x/evm/contracts/erc20_factory/ERC20Factory.go index 3e456ca..a5aea52 100644 --- a/x/evm/contracts/erc20_factory/ERC20Factory.go +++ b/x/evm/contracts/erc20_factory/ERC20Factory.go @@ -32,7 +32,7 @@ var ( // Erc20FactoryMetaData contains all meta data concerning the Erc20Factory contract. var Erc20FactoryMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"erc20\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20Created\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createERC20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052348015600e575f80fd5b50612a858061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061036c565b61005d565b6040516100549190610433565b60405180910390f35b5f8084848460405161006e906101dc565b61007a939291906104bb565b604051809103905ff080158015610093573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016100d09190610433565b6020604051808303815f875af11580156100ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101109190610533565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161014a9190610433565b5f604051808303815f87803b158015610161575f80fd5b505af1158015610173573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b6124f18061055f83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61024882610202565b810181811067ffffffffffffffff8211171561026757610266610212565b5b80604052505050565b5f6102796101e9565b9050610285828261023f565b919050565b5f67ffffffffffffffff8211156102a4576102a3610212565b5b6102ad82610202565b9050602081019050919050565b828183375f83830152505050565b5f6102da6102d58461028a565b610270565b9050828152602081018484840111156102f6576102f56101fe565b5b6103018482856102ba565b509392505050565b5f82601f83011261031d5761031c6101fa565b5b813561032d8482602086016102c8565b91505092915050565b5f60ff82169050919050565b61034b81610336565b8114610355575f80fd5b50565b5f8135905061036681610342565b92915050565b5f805f60608486031215610383576103826101f2565b5b5f84013567ffffffffffffffff8111156103a05761039f6101f6565b5b6103ac86828701610309565b935050602084013567ffffffffffffffff8111156103cd576103cc6101f6565b5b6103d986828701610309565b92505060406103ea86828701610358565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61041d826103f4565b9050919050565b61042d81610413565b82525050565b5f6020820190506104465f830184610424565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61047e8261044c565b6104888185610456565b9350610498818560208601610466565b6104a181610202565b840191505092915050565b6104b581610336565b82525050565b5f6060820190508181035f8301526104d38186610474565b905081810360208301526104e78185610474565b90506104f660408301846104ac565b949350505050565b5f8115159050919050565b610512816104fe565b811461051c575f80fd5b50565b5f8151905061052d81610509565b92915050565b5f60208284031215610548576105476101f2565b5b5f6105558482850161051f565b9150509291505056fe608060405234801561000f575f80fd5b506040516124f13803806124f183398181016040528101906100319190610235565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826003908161007f91906104ca565b50816004908161008f91906104ca565b508060055f6101000a81548160ff021916908360ff160217905550505050610599565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610111826100cb565b810181811067ffffffffffffffff821117156101305761012f6100db565b5b80604052505050565b5f6101426100b2565b905061014e8282610108565b919050565b5f67ffffffffffffffff82111561016d5761016c6100db565b5b610176826100cb565b9050602081019050919050565b8281835e5f83830152505050565b5f6101a361019e84610153565b610139565b9050828152602081018484840111156101bf576101be6100c7565b5b6101ca848285610183565b509392505050565b5f82601f8301126101e6576101e56100c3565b5b81516101f6848260208601610191565b91505092915050565b5f60ff82169050919050565b610214816101ff565b811461021e575f80fd5b50565b5f8151905061022f8161020b565b92915050565b5f805f6060848603121561024c5761024b6100bb565b5b5f84015167ffffffffffffffff811115610269576102686100bf565b5b610275868287016101d2565b935050602084015167ffffffffffffffff811115610296576102956100bf565b5b6102a2868287016101d2565b92505060406102b386828701610221565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061030b57607f821691505b60208210810361031e5761031d6102c7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610345565b61038a8683610345565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6103ce6103c96103c4846103a2565b6103ab565b6103a2565b9050919050565b5f819050919050565b6103e7836103b4565b6103fb6103f3826103d5565b848454610351565b825550505050565b5f90565b61040f610403565b61041a8184846103de565b505050565b5b8181101561043d576104325f82610407565b600181019050610420565b5050565b601f8211156104825761045381610324565b61045c84610336565b8101602085101561046b578190505b61047f61047785610336565b83018261041f565b50505b505050565b5f82821c905092915050565b5f6104a25f1984600802610487565b1980831691505092915050565b5f6104ba8383610493565b9150826002028217905092915050565b6104d3826102bd565b67ffffffffffffffff8111156104ec576104eb6100db565b5b6104f682546102f4565b610501828285610441565b5f60209050601f831160018114610532575f8415610520578287015190505b61052a85826104af565b865550610591565b601f19841661054086610324565b5f5b8281101561056757848901518255600182019150602085019450602081019050610542565b868310156105845784890151610580601f891682610493565b8355505b6001600288020188555050505b505050505050565b611f4b806105a65f395ff3fe608060405234801561000f575f80fd5b5060043610610114575f3560e01c806342966c68116100a057806395d89b411161006f57806395d89b41146102f0578063a9059cbb1461030e578063dd62ed3e1461033e578063f2fde38b1461036e578063fe1195ec1461038a57610114565b806342966c681461025657806370a082311461027257806379cc6790146102a25780638da5cb5b146102d257610114565b80631988513b116100e75780631988513b146101b457806323b872dd146101d05780632d688ca814610200578063313ce5671461021c57806340c10f191461023a57610114565b806301ffc9a71461011857806306fdde0314610148578063095ea7b31461016657806318160ddd14610196575b5f80fd5b610132600480360381019061012d91906116b1565b6103a6565b60405161013f91906116f6565b60405180910390f35b61015061041f565b60405161015d919061177f565b60405180910390f35b610180600480360381019061017b919061182c565b6104ab565b60405161018d91906116f6565b60405180910390f35b61019e610598565b6040516101ab9190611879565b60405180910390f35b6101ce60048036038101906101c99190611892565b61059e565b005b6101ea60048036038101906101e59190611892565b61061d565b6040516101f791906116f6565b60405180910390f35b61021a6004803603810190610215919061182c565b610838565b005b6102246108b5565b60405161023191906118fd565b60405180910390f35b610254600480360381019061024f919061182c565b6108c7565b005b610270600480360381019061026b9190611916565b6109e6565b005b61028c60048036038101906102879190611941565b610aae565b6040516102999190611879565b60405180910390f35b6102bc60048036038101906102b7919061182c565b610ac3565b6040516102c991906116f6565b60405180910390f35b6102da610cdc565b6040516102e7919061197b565b60405180910390f35b6102f8610cff565b604051610305919061177f565b60405180910390f35b6103286004803603810190610323919061182c565b610d8b565b60405161033591906116f6565b60405180910390f35b61035860048036038101906103539190611994565b610e5c565b6040516103659190611879565b60405180910390f35b61038860048036038101906103839190611941565b610e7c565b005b6103a4600480360381019061039f919061182c565b610fc4565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610418575061041782611041565b5b9050919050565b6003805461042c906119ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610458906119ff565b80156104a35780601f1061047a576101008083540402835291602001916104a3565b820191905f5260205f20905b81548152906001019060200180831161048657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105869190611879565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461060d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060490611a79565b60405180910390fd5b6106188383836110aa565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610659919061197b565b602060405180830381865afa158015610674573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106989190611ac1565b156106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90611b5c565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90611bea565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461081a9190611c35565b9250508190555061082c8585856110aa565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e90611a79565b60405180910390fd5b6108b18282611335565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610902919061197b565b602060405180830381865afa15801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611ac1565b15610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890611cb2565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d7575f80fd5b6109e18383611335565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a21919061197b565b602060405180830381865afa158015610a3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a609190611ac1565b15610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790611d1a565b60405180910390fd5b610aaa3383611504565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610aff919061197b565b602060405180830381865afa158015610b1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e9190611ac1565b15610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590611d1a565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3090611da8565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610cc09190611c35565b92505081905550610cd18484611504565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d0c906119ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610d38906119ff565b8015610d835780601f10610d5a57610100808354040283529160200191610d83565b820191905f5260205f20905b815481529060010190602001808311610d6657829003601f168201915b505050505081565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610dc7919061197b565b602060405180830381865afa158015610de2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e069190611ac1565b15610e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3d90611b5c565b60405180910390fd5b610e513385856110aa565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed2575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f09575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90611a79565b60405180910390fd5b61103d8282611504565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016110e5919061197b565b602060405180830381865afa158015611100573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111249190611ac1565b6111a45760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b8152600401611162919061197b565b6020604051808303815f875af115801561117e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a29190611ac1565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90611e36565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112709190611c35565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546112c39190611e54565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113279190611879565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b8152600401611370919061197b565b602060405180830381865afa15801561138b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113af9190611ac1565b61142f5760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113ed919061197b565b6020604051808303815f875af1158015611409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142d9190611ac1565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461147b9190611e54565b925050819055508160065f8282546114939190611e54565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114f79190611879565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90611ef7565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546115d09190611c35565b925050819055508060065f8282546115e89190611c35565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161164c9190611879565b60405180910390a35050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6116908161165c565b811461169a575f80fd5b50565b5f813590506116ab81611687565b92915050565b5f602082840312156116c6576116c5611658565b5b5f6116d38482850161169d565b91505092915050565b5f8115159050919050565b6116f0816116dc565b82525050565b5f6020820190506117095f8301846116e7565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6117518261170f565b61175b8185611719565b935061176b818560208601611729565b61177481611737565b840191505092915050565b5f6020820190508181035f8301526117978184611747565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117c88261179f565b9050919050565b6117d8816117be565b81146117e2575f80fd5b50565b5f813590506117f3816117cf565b92915050565b5f819050919050565b61180b816117f9565b8114611815575f80fd5b50565b5f8135905061182681611802565b92915050565b5f806040838503121561184257611841611658565b5b5f61184f858286016117e5565b925050602061186085828601611818565b9150509250929050565b611873816117f9565b82525050565b5f60208201905061188c5f83018461186a565b92915050565b5f805f606084860312156118a9576118a8611658565b5b5f6118b6868287016117e5565b93505060206118c7868287016117e5565b92505060406118d886828701611818565b9150509250925092565b5f60ff82169050919050565b6118f7816118e2565b82525050565b5f6020820190506119105f8301846118ee565b92915050565b5f6020828403121561192b5761192a611658565b5b5f61193884828501611818565b91505092915050565b5f6020828403121561195657611955611658565b5b5f611963848285016117e5565b91505092915050565b611975816117be565b82525050565b5f60208201905061198e5f83018461196c565b92915050565b5f80604083850312156119aa576119a9611658565b5b5f6119b7858286016117e5565b92505060206119c8858286016117e5565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a1657607f821691505b602082108103611a2957611a286119d2565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611a63601e83611719565b9150611a6e82611a2f565b602082019050919050565b5f6020820190508181035f830152611a9081611a57565b9050919050565b611aa0816116dc565b8114611aaa575f80fd5b50565b5f81519050611abb81611a97565b92915050565b5f60208284031215611ad657611ad5611658565b5b5f611ae384828501611aad565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611b46602283611719565b9150611b5182611aec565b604082019050919050565b5f6020820190508181035f830152611b7381611b3a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611bd4602883611719565b9150611bdf82611b7a565b604082019050919050565b5f6020820190508181035f830152611c0181611bc8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c3f826117f9565b9150611c4a836117f9565b9250828203905081811115611c6257611c61611c08565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f611c9c601e83611719565b9150611ca782611c68565b602082019050919050565b5f6020820190508181035f830152611cc981611c90565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f611d04601f83611719565b9150611d0f82611cd0565b602082019050919050565b5f6020820190508181035f830152611d3181611cf8565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f611d92602483611719565b9150611d9d82611d38565b604082019050919050565b5f6020820190508181035f830152611dbf81611d86565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611e20602683611719565b9150611e2b82611dc6565b604082019050919050565b5f6020820190508181035f830152611e4d81611e14565b9050919050565b5f611e5e826117f9565b9150611e69836117f9565b9250828201905080821115611e8157611e80611c08565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ee1602283611719565b9150611eec82611e87565b604082019050919050565b5f6020820190508181035f830152611f0e81611ed5565b905091905056fea2646970667358221220531dd3eb23837e3dacf88153213c51373be5ae3e9b5b3ca25450c866fb8833b464736f6c63430008190033a2646970667358221220cb178b189e9eaa6748b6c371c29ff9527fdf46428f8800ca584625b51dbb964b64736f6c63430008190033", + Bin: "0x6080604052348015600e575f80fd5b5061324a8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612c67806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612c67380380612c6783398181016040528101906100319190610285565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052e565b50826004908161008f919061052e565b508160055f6101000a81548160ff021916908360ff16021790555080600560016101000a81548160ff021916908315150217905550505050506105fd565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012c826100e6565b810181811067ffffffffffffffff8211171561014b5761014a6100f6565b5b80604052505050565b5f61015d6100cd565b90506101698282610123565b919050565b5f67ffffffffffffffff821115610188576101876100f6565b5b610191826100e6565b9050602081019050919050565b8281835e5f83830152505050565b5f6101be6101b98461016e565b610154565b9050828152602081018484840111156101da576101d96100e2565b5b6101e584828561019e565b509392505050565b5f82601f830112610201576102006100de565b5b81516102118482602086016101ac565b91505092915050565b5f60ff82169050919050565b61022f8161021a565b8114610239575f80fd5b50565b5f8151905061024a81610226565b92915050565b5f8115159050919050565b61026481610250565b811461026e575f80fd5b50565b5f8151905061027f8161025b565b92915050565b5f805f806080858703121561029d5761029c6100d6565b5b5f85015167ffffffffffffffff8111156102ba576102b96100da565b5b6102c6878288016101ed565b945050602085015167ffffffffffffffff8111156102e7576102e66100da565b5b6102f3878288016101ed565b93505060406103048782880161023c565b925050606061031587828801610271565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036f57607f821691505b6020821081036103825761038161032b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a9565b6103ee86836103a9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043261042d61042884610406565b61040f565b610406565b9050919050565b5f819050919050565b61044b83610418565b61045f61045782610439565b8484546103b5565b825550505050565b5f90565b610473610467565b61047e818484610442565b505050565b5b818110156104a1576104965f8261046b565b600181019050610484565b5050565b601f8211156104e6576104b781610388565b6104c08461039a565b810160208510156104cf578190505b6104e36104db8561039a565b830182610483565b50505b505050565b5f82821c905092915050565b5f6105065f19846008026104eb565b1980831691505092915050565b5f61051e83836104f7565b9150826002028217905092915050565b61053782610321565b67ffffffffffffffff8111156105505761054f6100f6565b5b61055a8254610358565b6105658282856104a5565b5f60209050601f831160018114610596575f8415610584578287015190505b61058e8582610513565b8655506105f5565b601f1984166105a486610388565b5f5b828110156105cb578489015182556001820191506020850194506020810190506105a6565b868310156105e857848901516105e4601f8916826104f7565b8355505b6001600288020188555050505b505050505050565b61265d8061060a5f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611883565b6103f6565b60405161015591906118c8565b60405180910390f35b61016661046f565b6040516101739190611951565b60405180910390f35b610196600480360381019061019191906119fe565b6104fb565b6040516101a391906118c8565b60405180910390f35b6101b46105e8565b6040516101c19190611a4b565b60405180910390f35b6101e460048036038101906101df9190611a64565b6105ee565b005b61020060048036038101906101fb9190611a64565b61066d565b60405161020d91906118c8565b60405180910390f35b610230600480360381019061022b91906119fe565b610888565b005b61023a610905565b6040516102479190611acf565b60405180910390f35b61026a600480360381019061026591906119fe565b610917565b005b61028660048036038101906102819190611ae8565b610a36565b005b6102a2600480360381019061029d9190611b13565b610afe565b6040516102af9190611a4b565b60405180910390f35b6102d260048036038101906102cd91906119fe565b610b13565b6040516102df91906118c8565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4d565b60405180910390f35b61030e610d4f565b60405161031b9190611951565b60405180910390f35b61033e60048036038101906103399190611cbc565b610ddb565b005b61035a600480360381019061035591906119fe565b610f3d565b60405161036791906118c8565b60405180910390f35b61038a60048036038101906103859190611d44565b61100e565b6040516103979190611a4b565b60405180910390f35b6103ba60048036038101906103b59190611b13565b61102e565b005b6103c4611176565b6040516103d191906118c8565b60405180910390f35b6103f460048036038101906103ef91906119fe565b611189565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611206565b5b9050919050565b6003805461047c90611daf565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611daf565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a4b565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e29565b60405180910390fd5b61066883838361126f565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4d565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e71565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f0c565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f9a565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe5565b9250508190555061087c85858561126f565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e29565b60405180910390fd5b61090182826114fa565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4d565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e71565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890612062565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114fa565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4d565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e71565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120ca565b60405180910390fd5b610afa33836116c9565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4d565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e71565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120ca565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612158565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe5565b92505081905550610d2184846116c9565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611daf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611daf565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4d565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e71565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e6565b60405180910390fd5b600560019054906101000a900460ff1615610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda9061224e565b60405180910390fd5b8260039081610ef29190612409565b508160049081610f029190612409565b508060055f6101000a81548160ff021916908360ff1602179055506001600560016101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f799190611b4d565b602060405180830381865afa158015610f94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb89190611e71565b15610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90611f0c565b60405180910390fd5b61100333858561126f565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611084575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110bb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560019054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90611e29565b60405180910390fd5b61120282826116c9565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112aa9190611b4d565b602060405180830381865afa1580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e99190611e71565b6113695760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113279190611b4d565b6020604051808303815f875af1158015611343573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113679190611e71565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090612548565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114359190611fe5565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114889190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114ec9190611a4b565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115359190611b4d565b602060405180830381865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190611e71565b6115f45760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115b29190611b4d565b6020604051808303815f875af11580156115ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f29190611e71565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546116409190612566565b925050819055508160065f8282546116589190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116bc9190611a4b565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090612609565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117959190611fe5565b925050819055508060065f8282546117ad9190611fe5565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118119190611a4b565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118628161182e565b811461186c575f80fd5b50565b5f8135905061187d81611859565b92915050565b5f6020828403121561189857611897611826565b5b5f6118a58482850161186f565b91505092915050565b5f8115159050919050565b6118c2816118ae565b82525050565b5f6020820190506118db5f8301846118b9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611923826118e1565b61192d81856118eb565b935061193d8185602086016118fb565b61194681611909565b840191505092915050565b5f6020820190508181035f8301526119698184611919565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61199a82611971565b9050919050565b6119aa81611990565b81146119b4575f80fd5b50565b5f813590506119c5816119a1565b92915050565b5f819050919050565b6119dd816119cb565b81146119e7575f80fd5b50565b5f813590506119f8816119d4565b92915050565b5f8060408385031215611a1457611a13611826565b5b5f611a21858286016119b7565b9250506020611a32858286016119ea565b9150509250929050565b611a45816119cb565b82525050565b5f602082019050611a5e5f830184611a3c565b92915050565b5f805f60608486031215611a7b57611a7a611826565b5b5f611a88868287016119b7565b9350506020611a99868287016119b7565b9250506040611aaa868287016119ea565b9150509250925092565b5f60ff82169050919050565b611ac981611ab4565b82525050565b5f602082019050611ae25f830184611ac0565b92915050565b5f60208284031215611afd57611afc611826565b5b5f611b0a848285016119ea565b91505092915050565b5f60208284031215611b2857611b27611826565b5b5f611b35848285016119b7565b91505092915050565b611b4781611990565b82525050565b5f602082019050611b605f830184611b3e565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba482611909565b810181811067ffffffffffffffff82111715611bc357611bc2611b6e565b5b80604052505050565b5f611bd561181d565b9050611be18282611b9b565b919050565b5f67ffffffffffffffff821115611c0057611bff611b6e565b5b611c0982611909565b9050602081019050919050565b828183375f83830152505050565b5f611c36611c3184611be6565b611bcc565b905082815260208101848484011115611c5257611c51611b6a565b5b611c5d848285611c16565b509392505050565b5f82601f830112611c7957611c78611b66565b5b8135611c89848260208601611c24565b91505092915050565b611c9b81611ab4565b8114611ca5575f80fd5b50565b5f81359050611cb681611c92565b92915050565b5f805f60608486031215611cd357611cd2611826565b5b5f84013567ffffffffffffffff811115611cf057611cef61182a565b5b611cfc86828701611c65565b935050602084013567ffffffffffffffff811115611d1d57611d1c61182a565b5b611d2986828701611c65565b9250506040611d3a86828701611ca8565b9150509250925092565b5f8060408385031215611d5a57611d59611826565b5b5f611d67858286016119b7565b9250506020611d78858286016119b7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc657607f821691505b602082108103611dd957611dd8611d82565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e13601e836118eb565b9150611e1e82611ddf565b602082019050919050565b5f6020820190508181035f830152611e4081611e07565b9050919050565b611e50816118ae565b8114611e5a575f80fd5b50565b5f81519050611e6b81611e47565b92915050565b5f60208284031215611e8657611e85611826565b5b5f611e9384828501611e5d565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef66022836118eb565b9150611f0182611e9c565b604082019050919050565b5f6020820190508181035f830152611f2381611eea565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f846028836118eb565b9150611f8f82611f2a565b604082019050919050565b5f6020820190508181035f830152611fb181611f78565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fef826119cb565b9150611ffa836119cb565b925082820390508181111561201257612011611fb8565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f61204c601e836118eb565b915061205782612018565b602082019050919050565b5f6020820190508181035f83015261207981612040565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b4601f836118eb565b91506120bf82612080565b602082019050919050565b5f6020820190508181035f8301526120e1816120a8565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f6121426024836118eb565b915061214d826120e8565b604082019050919050565b5f6020820190508181035f83015261216f81612136565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121d06022836118eb565b91506121db82612176565b604082019050919050565b5f6020820190508181035f8301526121fd816121c4565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122386016836118eb565b915061224382612204565b602082019050919050565b5f6020820190508181035f8301526122658161222c565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228d565b6122d2868361228d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230d612308612303846119cb565b6122ea565b6119cb565b9050919050565b5f819050919050565b612326836122f3565b61233a61233282612314565b848454612299565b825550505050565b5f90565b61234e612342565b61235981848461231d565b505050565b5b8181101561237c576123715f82612346565b60018101905061235f565b5050565b601f8211156123c1576123928161226c565b61239b8461227e565b810160208510156123aa578190505b6123be6123b68561227e565b83018261235e565b50505b505050565b5f82821c905092915050565b5f6123e15f19846008026123c6565b1980831691505092915050565b5f6123f983836123d2565b9150826002028217905092915050565b612412826118e1565b67ffffffffffffffff81111561242b5761242a611b6e565b5b6124358254611daf565b612440828285612380565b5f60209050601f831160018114612471575f841561245f578287015190505b61246985826123ee565b8655506124d0565b601f19841661247f8661226c565b5f5b828110156124a657848901518255600182019150602085019450602081019050612481565b868310156124c357848901516124bf601f8916826123d2565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6125326026836118eb565b915061253d826124d8565b604082019050919050565b5f6020820190508181035f83015261255f81612526565b9050919050565b5f612570826119cb565b915061257b836119cb565b925082820190508082111561259357612592611fb8565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f36022836118eb565b91506125fe82612599565b604082019050919050565b5f6020820190508181035f830152612620816125e7565b905091905056fea2646970667358221220e2cfc0097f51eca2b1fbd34739d93e3d63cce4e6c99115fdcecc1f57067f4d8764736f6c63430008190033a2646970667358221220b846a7c42f7b0b9d00b3e74bc3863e61d625c42c48af2f26565db9c3e48d354164736f6c63430008190033", } // Erc20FactoryABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/erc20_factory/ERC20Factory.sol b/x/evm/contracts/erc20_factory/ERC20Factory.sol index 256e1b9..850df4d 100644 --- a/x/evm/contracts/erc20_factory/ERC20Factory.sol +++ b/x/evm/contracts/erc20_factory/ERC20Factory.sol @@ -12,7 +12,7 @@ contract ERC20Factory is ERC20Registry { string memory symbol, uint8 decimals ) external returns (address) { - ERC20 erc20 = new ERC20(name, symbol, decimals); + ERC20 erc20 = new ERC20(name, symbol, decimals, msg.sender != CHAIN_ADDRESS); // register the ERC20 contract with the ERC20 registry ERC20_REGISTRY_CONTRACT.register_erc20_from_factory(address(erc20)); diff --git a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go index 608631d..8d7636f 100644 --- a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go +++ b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go @@ -32,7 +32,7 @@ var ( // Erc20WrapperMetaData contains all meta data concerning the Erc20Wrapper contract. var Erc20WrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20Factory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contractERC20Factory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"ibc_ack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"name\":\"ibc_timeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"originToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wrappedAmt\",\"type\":\"uint256\"}],\"name\":\"unwrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"channel\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"wrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea2646970667358221220ccd74c9a245399d217d5469cc62fd2be22f8c19446bbf507e58a72f47cb20cbc64736f6c63430008190033", + Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea26469706673582212204030209c060e46e6d90ac0c849ab0755d7fe771f50feffcbadecc7f843a336a164736f6c63430008190033", } // Erc20WrapperABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/i_cosmos/ICosmos.go b/x/evm/contracts/i_cosmos/ICosmos.go index 3291a45..736f8ac 100644 --- a/x/evm/contracts/i_cosmos/ICosmos.go +++ b/x/evm/contracts/i_cosmos/ICosmos.go @@ -37,7 +37,7 @@ type ICosmosOptions struct { // ICosmosMetaData contains all meta data concerning the ICosmos contract. var ICosmosMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"msg\",\"type\":\"string\"}],\"name\":\"execute_cosmos\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"dummy\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"msg\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"allow_failure\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"internalType\":\"structICosmos.Options\",\"name\":\"options\",\"type\":\"tuple\"}],\"name\":\"execute_cosmos_with_options\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"dummy\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"is_blocked_address\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"blocked\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"is_module_address\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"module\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"path\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"req\",\"type\":\"string\"}],\"name\":\"query_cosmos\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"result\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"evm_address\",\"type\":\"address\"}],\"name\":\"to_cosmos_address\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cosmos_address\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20_address\",\"type\":\"address\"}],\"name\":\"to_denom\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"to_erc20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"erc20_address\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"cosmos_address\",\"type\":\"string\"}],\"name\":\"to_evm_address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"evm_address\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"msg\",\"type\":\"string\"}],\"name\":\"execute_cosmos\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"dummy\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"msg\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"allow_failure\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"internalType\":\"structICosmos.Options\",\"name\":\"options\",\"type\":\"tuple\"}],\"name\":\"execute_cosmos_with_options\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"dummy\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"is_authority_address\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"authority\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"is_blocked_address\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"blocked\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"is_module_address\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"module\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"path\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"req\",\"type\":\"string\"}],\"name\":\"query_cosmos\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"result\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"evm_address\",\"type\":\"address\"}],\"name\":\"to_cosmos_address\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cosmos_address\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20_address\",\"type\":\"address\"}],\"name\":\"to_denom\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"denom\",\"type\":\"string\"}],\"name\":\"to_erc20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"erc20_address\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"cosmos_address\",\"type\":\"string\"}],\"name\":\"to_evm_address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"evm_address\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // ICosmosABI is the input ABI used to generate the binding from. @@ -186,6 +186,37 @@ func (_ICosmos *ICosmosTransactorRaw) Transact(opts *bind.TransactOpts, method s return _ICosmos.Contract.contract.Transact(opts, method, params...) } +// IsAuthorityAddress is a free data retrieval call binding the contract method 0x01116078. +// +// Solidity: function is_authority_address(address account) view returns(bool authority) +func (_ICosmos *ICosmosCaller) IsAuthorityAddress(opts *bind.CallOpts, account common.Address) (bool, error) { + var out []interface{} + err := _ICosmos.contract.Call(opts, &out, "is_authority_address", account) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsAuthorityAddress is a free data retrieval call binding the contract method 0x01116078. +// +// Solidity: function is_authority_address(address account) view returns(bool authority) +func (_ICosmos *ICosmosSession) IsAuthorityAddress(account common.Address) (bool, error) { + return _ICosmos.Contract.IsAuthorityAddress(&_ICosmos.CallOpts, account) +} + +// IsAuthorityAddress is a free data retrieval call binding the contract method 0x01116078. +// +// Solidity: function is_authority_address(address account) view returns(bool authority) +func (_ICosmos *ICosmosCallerSession) IsAuthorityAddress(account common.Address) (bool, error) { + return _ICosmos.Contract.IsAuthorityAddress(&_ICosmos.CallOpts, account) +} + // IsBlockedAddress is a free data retrieval call binding the contract method 0xf2af9ac9. // // Solidity: function is_blocked_address(address account) view returns(bool blocked) diff --git a/x/evm/contracts/i_cosmos/ICosmos.sol b/x/evm/contracts/i_cosmos/ICosmos.sol index 4901755..0bff08f 100644 --- a/x/evm/contracts/i_cosmos/ICosmos.sol +++ b/x/evm/contracts/i_cosmos/ICosmos.sol @@ -18,6 +18,11 @@ interface ICosmos { address account ) external view returns (bool module); + // check if an address is a authority address + function is_authority_address( + address account + ) external view returns (bool authority); + // convert an EVM address to a Cosmos address function to_cosmos_address( address evm_address diff --git a/x/evm/contracts/initia_erc20/InitiaERC20.go b/x/evm/contracts/initia_erc20/InitiaERC20.go index 37f5657..f010adf 100644 --- a/x/evm/contracts/initia_erc20/InitiaERC20.go +++ b/x/evm/contracts/initia_erc20/InitiaERC20.go @@ -32,7 +32,7 @@ var ( // InitiaErc20MetaData contains all meta data concerning the InitiaErc20 contract. var InitiaErc20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612479380380612479833981810160405281019061003191906102a5565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060f273ffffffffffffffffffffffffffffffffffffffff16635e6c57596040518163ffffffff1660e01b81526004016020604051808303815f875af11580156100bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100df9190610362565b5082600390816100ef919061059a565b5081600490816100ff919061059a565b508060055f6101000a81548160ff021916908360ff160217905550505050610669565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6101818261013b565b810181811067ffffffffffffffff821117156101a05761019f61014b565b5b80604052505050565b5f6101b2610122565b90506101be8282610178565b919050565b5f67ffffffffffffffff8211156101dd576101dc61014b565b5b6101e68261013b565b9050602081019050919050565b8281835e5f83830152505050565b5f61021361020e846101c3565b6101a9565b90508281526020810184848401111561022f5761022e610137565b5b61023a8482856101f3565b509392505050565b5f82601f83011261025657610255610133565b5b8151610266848260208601610201565b91505092915050565b5f60ff82169050919050565b6102848161026f565b811461028e575f80fd5b50565b5f8151905061029f8161027b565b92915050565b5f805f606084860312156102bc576102bb61012b565b5b5f84015167ffffffffffffffff8111156102d9576102d861012f565b5b6102e586828701610242565b935050602084015167ffffffffffffffff8111156103065761030561012f565b5b61031286828701610242565b925050604061032386828701610291565b9150509250925092565b5f8115159050919050565b6103418161032d565b811461034b575f80fd5b50565b5f8151905061035c81610338565b92915050565b5f602082840312156103775761037661012b565b5b5f6103848482850161034e565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103db57607f821691505b6020821081036103ee576103ed610397565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610415565b61045a8683610415565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61049e61049961049484610472565b61047b565b610472565b9050919050565b5f819050919050565b6104b783610484565b6104cb6104c3826104a5565b848454610421565b825550505050565b5f90565b6104df6104d3565b6104ea8184846104ae565b505050565b5b8181101561050d576105025f826104d7565b6001810190506104f0565b5050565b601f82111561055257610523816103f4565b61052c84610406565b8101602085101561053b578190505b61054f61054785610406565b8301826104ef565b50505b505050565b5f82821c905092915050565b5f6105725f1984600802610557565b1980831691505092915050565b5f61058a8383610563565b9150826002028217905092915050565b6105a38261038d565b67ffffffffffffffff8111156105bc576105bb61014b565b5b6105c682546103c4565b6105d1828285610511565b5f60209050601f831160018114610602575f84156105f0578287015190505b6105fa858261057f565b865550610661565b601f198416610610866103f4565b5f5b8281101561063757848901518255600182019150602085019450602081019050610612565b868310156106545784890151610650601f891682610563565b8355505b6001600288020188555050505b505050505050565b611e03806106765f395ff3fe608060405234801561000f575f80fd5b50600436106100fe575f3560e01c806342966c681161009557806395d89b411161006457806395d89b41146102be578063a9059cbb146102dc578063dd62ed3e1461030c578063f2fde38b1461033c576100fe565b806342966c681461022457806370a082311461024057806379cc6790146102705780638da5cb5b146102a0576100fe565b80631988513b116100d15780631988513b1461019e57806323b872dd146101ba578063313ce567146101ea57806340c10f1914610208576100fe565b806301ffc9a71461010257806306fdde0314610132578063095ea7b31461015057806318160ddd14610180575b5f80fd5b61011c60048036038101906101179190611569565b610358565b60405161012991906115ae565b60405180910390f35b61013a6103d1565b6040516101479190611637565b60405180910390f35b61016a600480360381019061016591906116e4565b61045d565b60405161017791906115ae565b60405180910390f35b61018861054a565b6040516101959190611731565b60405180910390f35b6101b860048036038101906101b3919061174a565b610550565b005b6101d460048036038101906101cf919061174a565b6105cf565b6040516101e191906115ae565b60405180910390f35b6101f26107ea565b6040516101ff91906117b5565b60405180910390f35b610222600480360381019061021d91906116e4565b6107fc565b005b61023e600480360381019061023991906117ce565b61091b565b005b61025a600480360381019061025591906117f9565b6109e3565b6040516102679190611731565b60405180910390f35b61028a600480360381019061028591906116e4565b6109f8565b60405161029791906115ae565b60405180910390f35b6102a8610c11565b6040516102b59190611833565b60405180910390f35b6102c6610c34565b6040516102d39190611637565b60405180910390f35b6102f660048036038101906102f191906116e4565b610cc0565b60405161030391906115ae565b60405180910390f35b6103266004803603810190610321919061184c565b610d91565b6040516103339190611731565b60405180910390f35b610356600480360381019061035191906117f9565b610db1565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103ca57506103c982610ef9565b5b9050919050565b600380546103de906118b7565b80601f016020809104026020016040519081016040528092919081815260200182805461040a906118b7565b80156104555780601f1061042c57610100808354040283529160200191610455565b820191905f5260205f20905b81548152906001019060200180831161043857829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105389190611731565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b690611931565b60405180910390fd5b6105ca838383610f62565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b815260040161060b9190611833565b602060405180830381865afa158015610626573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a9190611979565b1561068a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068190611a14565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c90611aa2565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107cc9190611aed565b925050819055506107de858585610f62565b60019150509392505050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016108379190611833565b602060405180830381865afa158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190611979565b156108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90611b6a565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461090c575f80fd5b61091683836111ed565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b81526004016109569190611833565b602060405180830381865afa158015610971573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109959190611979565b156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90611bd2565b60405180910390fd5b6109df33836113bc565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a349190611833565b602060405180830381865afa158015610a4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a739190611979565b15610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90611bd2565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6590611c60565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bf59190611aed565b92505081905550610c0684846113bc565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610c41906118b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6d906118b7565b8015610cb85780601f10610c8f57610100808354040283529160200191610cb8565b820191905f5260205f20905b815481529060010190602001808311610c9b57829003601f168201915b505050505081565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610cfc9190611833565b602060405180830381865afa158015610d17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3b9190611979565b15610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290611a14565b60405180910390fd5b610d86338585610f62565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e07575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e3e575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b8152600401610f9d9190611833565b602060405180830381865afa158015610fb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdc9190611979565b61105c5760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b815260040161101a9190611833565b6020604051808303815f875af1158015611036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105a9190611979565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390611cee565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111289190611aed565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461117b9190611d0c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111df9190611731565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112289190611833565b602060405180830381865afa158015611243573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112679190611979565b6112e75760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016112a59190611833565b6020604051808303815f875af11580156112c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e59190611979565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113339190611d0c565b925050819055508160065f82825461134b9190611d0c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113af9190611731565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390611daf565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114889190611aed565b925050819055508060065f8282546114a09190611aed565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115049190611731565b60405180910390a35050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61154881611514565b8114611552575f80fd5b50565b5f813590506115638161153f565b92915050565b5f6020828403121561157e5761157d611510565b5b5f61158b84828501611555565b91505092915050565b5f8115159050919050565b6115a881611594565b82525050565b5f6020820190506115c15f83018461159f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611609826115c7565b61161381856115d1565b93506116238185602086016115e1565b61162c816115ef565b840191505092915050565b5f6020820190508181035f83015261164f81846115ff565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61168082611657565b9050919050565b61169081611676565b811461169a575f80fd5b50565b5f813590506116ab81611687565b92915050565b5f819050919050565b6116c3816116b1565b81146116cd575f80fd5b50565b5f813590506116de816116ba565b92915050565b5f80604083850312156116fa576116f9611510565b5b5f6117078582860161169d565b9250506020611718858286016116d0565b9150509250929050565b61172b816116b1565b82525050565b5f6020820190506117445f830184611722565b92915050565b5f805f6060848603121561176157611760611510565b5b5f61176e8682870161169d565b935050602061177f8682870161169d565b9250506040611790868287016116d0565b9150509250925092565b5f60ff82169050919050565b6117af8161179a565b82525050565b5f6020820190506117c85f8301846117a6565b92915050565b5f602082840312156117e3576117e2611510565b5b5f6117f0848285016116d0565b91505092915050565b5f6020828403121561180e5761180d611510565b5b5f61181b8482850161169d565b91505092915050565b61182d81611676565b82525050565b5f6020820190506118465f830184611824565b92915050565b5f806040838503121561186257611861611510565b5b5f61186f8582860161169d565b92505060206118808582860161169d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806118ce57607f821691505b6020821081036118e1576118e061188a565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f61191b601e836115d1565b9150611926826118e7565b602082019050919050565b5f6020820190508181035f8301526119488161190f565b9050919050565b61195881611594565b8114611962575f80fd5b50565b5f815190506119738161194f565b92915050565b5f6020828403121561198e5761198d611510565b5b5f61199b84828501611965565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6119fe6022836115d1565b9150611a09826119a4565b604082019050919050565b5f6020820190508181035f830152611a2b816119f2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611a8c6028836115d1565b9150611a9782611a32565b604082019050919050565b5f6020820190508181035f830152611ab981611a80565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611af7826116b1565b9150611b02836116b1565b9250828203905081811115611b1a57611b19611ac0565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f611b54601e836115d1565b9150611b5f82611b20565b602082019050919050565b5f6020820190508181035f830152611b8181611b48565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f611bbc601f836115d1565b9150611bc782611b88565b602082019050919050565b5f6020820190508181035f830152611be981611bb0565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f611c4a6024836115d1565b9150611c5582611bf0565b604082019050919050565b5f6020820190508181035f830152611c7781611c3e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611cd86026836115d1565b9150611ce382611c7e565b604082019050919050565b5f6020820190508181035f830152611d0581611ccc565b9050919050565b5f611d16826116b1565b9150611d21836116b1565b9250828201905080821115611d3957611d38611ac0565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f611d996022836115d1565b9150611da482611d3f565b604082019050919050565b5f6020820190508181035f830152611dc681611d8d565b905091905056fea26469706673582212208e695e22c57fc77c8a35298fbde961171443f2ef7110c65121b4a9310ca2aee664736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b50604051612479380380612479833981810160405281019061003191906102a5565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060f273ffffffffffffffffffffffffffffffffffffffff16635e6c57596040518163ffffffff1660e01b81526004016020604051808303815f875af11580156100bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100df9190610362565b5082600390816100ef919061059a565b5081600490816100ff919061059a565b508060055f6101000a81548160ff021916908360ff160217905550505050610669565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6101818261013b565b810181811067ffffffffffffffff821117156101a05761019f61014b565b5b80604052505050565b5f6101b2610122565b90506101be8282610178565b919050565b5f67ffffffffffffffff8211156101dd576101dc61014b565b5b6101e68261013b565b9050602081019050919050565b8281835e5f83830152505050565b5f61021361020e846101c3565b6101a9565b90508281526020810184848401111561022f5761022e610137565b5b61023a8482856101f3565b509392505050565b5f82601f83011261025657610255610133565b5b8151610266848260208601610201565b91505092915050565b5f60ff82169050919050565b6102848161026f565b811461028e575f80fd5b50565b5f8151905061029f8161027b565b92915050565b5f805f606084860312156102bc576102bb61012b565b5b5f84015167ffffffffffffffff8111156102d9576102d861012f565b5b6102e586828701610242565b935050602084015167ffffffffffffffff8111156103065761030561012f565b5b61031286828701610242565b925050604061032386828701610291565b9150509250925092565b5f8115159050919050565b6103418161032d565b811461034b575f80fd5b50565b5f8151905061035c81610338565b92915050565b5f602082840312156103775761037661012b565b5b5f6103848482850161034e565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103db57607f821691505b6020821081036103ee576103ed610397565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610415565b61045a8683610415565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61049e61049961049484610472565b61047b565b610472565b9050919050565b5f819050919050565b6104b783610484565b6104cb6104c3826104a5565b848454610421565b825550505050565b5f90565b6104df6104d3565b6104ea8184846104ae565b505050565b5b8181101561050d576105025f826104d7565b6001810190506104f0565b5050565b601f82111561055257610523816103f4565b61052c84610406565b8101602085101561053b578190505b61054f61054785610406565b8301826104ef565b50505b505050565b5f82821c905092915050565b5f6105725f1984600802610557565b1980831691505092915050565b5f61058a8383610563565b9150826002028217905092915050565b6105a38261038d565b67ffffffffffffffff8111156105bc576105bb61014b565b5b6105c682546103c4565b6105d1828285610511565b5f60209050601f831160018114610602575f84156105f0578287015190505b6105fa858261057f565b865550610661565b601f198416610610866103f4565b5f5b8281101561063757848901518255600182019150602085019450602081019050610612565b868310156106545784890151610650601f891682610563565b8355505b6001600288020188555050505b505050505050565b611e03806106765f395ff3fe608060405234801561000f575f80fd5b50600436106100fe575f3560e01c806342966c681161009557806395d89b411161006457806395d89b41146102be578063a9059cbb146102dc578063dd62ed3e1461030c578063f2fde38b1461033c576100fe565b806342966c681461022457806370a082311461024057806379cc6790146102705780638da5cb5b146102a0576100fe565b80631988513b116100d15780631988513b1461019e57806323b872dd146101ba578063313ce567146101ea57806340c10f1914610208576100fe565b806301ffc9a71461010257806306fdde0314610132578063095ea7b31461015057806318160ddd14610180575b5f80fd5b61011c60048036038101906101179190611569565b610358565b60405161012991906115ae565b60405180910390f35b61013a6103d1565b6040516101479190611637565b60405180910390f35b61016a600480360381019061016591906116e4565b61045d565b60405161017791906115ae565b60405180910390f35b61018861054a565b6040516101959190611731565b60405180910390f35b6101b860048036038101906101b3919061174a565b610550565b005b6101d460048036038101906101cf919061174a565b6105cf565b6040516101e191906115ae565b60405180910390f35b6101f26107ea565b6040516101ff91906117b5565b60405180910390f35b610222600480360381019061021d91906116e4565b6107fc565b005b61023e600480360381019061023991906117ce565b61091b565b005b61025a600480360381019061025591906117f9565b6109e3565b6040516102679190611731565b60405180910390f35b61028a600480360381019061028591906116e4565b6109f8565b60405161029791906115ae565b60405180910390f35b6102a8610c11565b6040516102b59190611833565b60405180910390f35b6102c6610c34565b6040516102d39190611637565b60405180910390f35b6102f660048036038101906102f191906116e4565b610cc0565b60405161030391906115ae565b60405180910390f35b6103266004803603810190610321919061184c565b610d91565b6040516103339190611731565b60405180910390f35b610356600480360381019061035191906117f9565b610db1565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103ca57506103c982610ef9565b5b9050919050565b600380546103de906118b7565b80601f016020809104026020016040519081016040528092919081815260200182805461040a906118b7565b80156104555780601f1061042c57610100808354040283529160200191610455565b820191905f5260205f20905b81548152906001019060200180831161043857829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105389190611731565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b690611931565b60405180910390fd5b6105ca838383610f62565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b815260040161060b9190611833565b602060405180830381865afa158015610626573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a9190611979565b1561068a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068190611a14565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c90611aa2565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107cc9190611aed565b925050819055506107de858585610f62565b60019150509392505050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016108379190611833565b602060405180830381865afa158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190611979565b156108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90611b6a565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461090c575f80fd5b61091683836111ed565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b81526004016109569190611833565b602060405180830381865afa158015610971573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109959190611979565b156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90611bd2565b60405180910390fd5b6109df33836113bc565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a349190611833565b602060405180830381865afa158015610a4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a739190611979565b15610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa90611bd2565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6590611c60565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bf59190611aed565b92505081905550610c0684846113bc565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610c41906118b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6d906118b7565b8015610cb85780601f10610c8f57610100808354040283529160200191610cb8565b820191905f5260205f20905b815481529060010190602001808311610c9b57829003601f168201915b505050505081565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610cfc9190611833565b602060405180830381865afa158015610d17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3b9190611979565b15610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7290611a14565b60405180910390fd5b610d86338585610f62565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e07575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e3e575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b8152600401610f9d9190611833565b602060405180830381865afa158015610fb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdc9190611979565b61105c5760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b815260040161101a9190611833565b6020604051808303815f875af1158015611036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105a9190611979565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390611cee565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111289190611aed565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461117b9190611d0c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111df9190611731565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112289190611833565b602060405180830381865afa158015611243573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112679190611979565b6112e75760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016112a59190611833565b6020604051808303815f875af11580156112c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e59190611979565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546113339190611d0c565b925050819055508160065f82825461134b9190611d0c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113af9190611731565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390611daf565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114889190611aed565b925050819055508060065f8282546114a09190611aed565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115049190611731565b60405180910390a35050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61154881611514565b8114611552575f80fd5b50565b5f813590506115638161153f565b92915050565b5f6020828403121561157e5761157d611510565b5b5f61158b84828501611555565b91505092915050565b5f8115159050919050565b6115a881611594565b82525050565b5f6020820190506115c15f83018461159f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611609826115c7565b61161381856115d1565b93506116238185602086016115e1565b61162c816115ef565b840191505092915050565b5f6020820190508181035f83015261164f81846115ff565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61168082611657565b9050919050565b61169081611676565b811461169a575f80fd5b50565b5f813590506116ab81611687565b92915050565b5f819050919050565b6116c3816116b1565b81146116cd575f80fd5b50565b5f813590506116de816116ba565b92915050565b5f80604083850312156116fa576116f9611510565b5b5f6117078582860161169d565b9250506020611718858286016116d0565b9150509250929050565b61172b816116b1565b82525050565b5f6020820190506117445f830184611722565b92915050565b5f805f6060848603121561176157611760611510565b5b5f61176e8682870161169d565b935050602061177f8682870161169d565b9250506040611790868287016116d0565b9150509250925092565b5f60ff82169050919050565b6117af8161179a565b82525050565b5f6020820190506117c85f8301846117a6565b92915050565b5f602082840312156117e3576117e2611510565b5b5f6117f0848285016116d0565b91505092915050565b5f6020828403121561180e5761180d611510565b5b5f61181b8482850161169d565b91505092915050565b61182d81611676565b82525050565b5f6020820190506118465f830184611824565b92915050565b5f806040838503121561186257611861611510565b5b5f61186f8582860161169d565b92505060206118808582860161169d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806118ce57607f821691505b6020821081036118e1576118e061188a565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f61191b601e836115d1565b9150611926826118e7565b602082019050919050565b5f6020820190508181035f8301526119488161190f565b9050919050565b61195881611594565b8114611962575f80fd5b50565b5f815190506119738161194f565b92915050565b5f6020828403121561198e5761198d611510565b5b5f61199b84828501611965565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6119fe6022836115d1565b9150611a09826119a4565b604082019050919050565b5f6020820190508181035f830152611a2b816119f2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611a8c6028836115d1565b9150611a9782611a32565b604082019050919050565b5f6020820190508181035f830152611ab981611a80565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611af7826116b1565b9150611b02836116b1565b9250828203905081811115611b1a57611b19611ac0565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f611b54601e836115d1565b9150611b5f82611b20565b602082019050919050565b5f6020820190508181035f830152611b8181611b48565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f611bbc601f836115d1565b9150611bc782611b88565b602082019050919050565b5f6020820190508181035f830152611be981611bb0565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f611c4a6024836115d1565b9150611c5582611bf0565b604082019050919050565b5f6020820190508181035f830152611c7781611c3e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611cd86026836115d1565b9150611ce382611c7e565b604082019050919050565b5f6020820190508181035f830152611d0581611ccc565b9050919050565b5f611d16826116b1565b9150611d21836116b1565b9250828201905080821115611d3957611d38611ac0565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f611d996022836115d1565b9150611da482611d3f565b604082019050919050565b5f6020820190508181035f830152611dc681611d8d565b905091905056fea2646970667358221220fa3217ffcb4c8bbe942f7e8d67ac5fdeaa7c2fe32acc54dfe0af067091f1474f64736f6c63430008190033", } // InitiaErc20ABI is the input ABI used to generate the binding from. diff --git a/x/evm/keeper/erc20.go b/x/evm/keeper/erc20.go index 813c143..aeee997 100644 --- a/x/evm/keeper/erc20.go +++ b/x/evm/keeper/erc20.go @@ -142,6 +142,13 @@ func (k ERC20Keeper) GetMetadata(ctx context.Context, denom string) (banktypes.M Denom: denom, Exponent: 0, }, + { + Denom: symbol, + Exponent: uint32(decimals), + }, + } + if denom == symbol { + denomUnits = denomUnits[1:] } base := denom diff --git a/x/evm/keeper/erc20_test.go b/x/evm/keeper/erc20_test.go index 0a2ebb1..3331f4c 100644 --- a/x/evm/keeper/erc20_test.go +++ b/x/evm/keeper/erc20_test.go @@ -17,11 +17,11 @@ import ( "github.com/initia-labs/minievm/x/evm/types" ) -func deployERC20(t *testing.T, ctx sdk.Context, input TestKeepers, caller common.Address, denom string) common.Address { +func deployERC20(t *testing.T, ctx sdk.Context, input TestKeepers, caller common.Address, symbol string) common.Address { abi, err := erc20_factory.Erc20FactoryMetaData.GetAbi() require.NoError(t, err) - inputBz, err := abi.Pack("createERC20", denom, denom, uint8(6)) + inputBz, err := abi.Pack("createERC20", symbol, symbol, uint8(6)) require.NoError(t, err) factoryAddr, err := input.EVMKeeper.GetERC20FactoryAddr(ctx) @@ -130,6 +130,20 @@ func transferFromERC20(t *testing.T, ctx sdk.Context, input TestKeepers, caller, } } +func updateMetadataERC20(t *testing.T, ctx sdk.Context, input TestKeepers, caller common.Address, denom, name, symbol string, decimals uint8) error { + abi, err := erc20.Erc20MetaData.GetAbi() + require.NoError(t, err) + + inputBz, err := abi.Pack("updateMetadata", name, symbol, decimals) + require.NoError(t, err) + + erc20ContractAddr, err := types.DenomToContractAddr(ctx, &input.EVMKeeper, denom) + require.NoError(t, err) + + _, _, err = input.EVMKeeper.EVMCall(ctx, caller, erc20ContractAddr, inputBz, nil, nil) + return err +} + func Test_BalanceOf(t *testing.T) { ctx, input := createDefaultTestInput(t) @@ -503,3 +517,44 @@ func Test_Approve(t *testing.T) { // should fail to transferFrom more than approved transferFromERC20(t, ctx, input, evmAddr2, evmAddr, evmAddr2, sdk.NewCoin(fooDenom, math.NewInt(50)), true) } + +func Test_ERC20MetadataUpdate(t *testing.T) { + ctx, input := createDefaultTestInput(t) + _, _, addr := keyPubAddr() + + evmAddr := common.BytesToAddress(addr.Bytes()) + authorityAddr, err := input.AccountKeeper.AddressCodec().StringToBytes(input.EVMKeeper.GetAuthority()) + require.NoError(t, err) + authorityEVMAddr := common.BytesToAddress(authorityAddr) + + erc20Keeper, err := keeper.NewERC20Keeper(&input.EVMKeeper) + require.NoError(t, err) + + // deploy erc20 contract + fooContractAddr := deployERC20(t, ctx, input, evmAddr, "foo") + fooDenom, err := types.ContractAddrToDenom(ctx, &input.EVMKeeper, fooContractAddr) + require.NoError(t, err) + require.Equal(t, "evm/"+fooContractAddr.Hex()[2:], fooDenom) + + // update metadata should fail because deployer is not 0x1 + err = updateMetadataERC20(t, ctx, input, authorityEVMAddr, fooDenom, "new name", "new symbol", 18) + require.Error(t, err) + + // create erc20 contract with deployer 0x1 + fooDenom = "foo" + err = input.EVMKeeper.ERC20Keeper().CreateERC20(ctx, fooDenom, 6) + require.NoError(t, err) + + // update metadata + err = updateMetadataERC20(t, ctx, input, authorityEVMAddr, fooDenom, "new name", "new symbol", 18) + require.NoError(t, err) + metadata, err := erc20Keeper.GetMetadata(ctx, fooDenom) + require.NoError(t, err) + require.Equal(t, "new name", metadata.Name) + require.Equal(t, "new symbol", metadata.Symbol) + require.Equal(t, uint32(18), metadata.DenomUnits[1].Exponent) + + // update metadata again should fail + err = updateMetadataERC20(t, ctx, input, authorityEVMAddr, fooDenom, "new name", "new symbol", 18) + require.Error(t, err) +} diff --git a/x/evm/keeper/precompiles.go b/x/evm/keeper/precompiles.go index a554fdb..b1afc76 100644 --- a/x/evm/keeper/precompiles.go +++ b/x/evm/keeper/precompiles.go @@ -26,6 +26,7 @@ func (k *Keeper) precompiles(rules params.Rules, stateDB types.StateDB) (vm.Prec k, k.grpcRouter, k.queryCosmosWhitelist, + k.authority, ) if err != nil { return nil, err diff --git a/x/evm/precompiles/cosmos/contract.go b/x/evm/precompiles/cosmos/contract.go index 0990e8e..55f7e96 100644 --- a/x/evm/precompiles/cosmos/contract.go +++ b/x/evm/precompiles/cosmos/contract.go @@ -48,6 +48,8 @@ type CosmosPrecompile struct { grpcRouter types.GRPCRouter queryWhitelist types.QueryCosmosWhitelist + + authorityAddr sdk.AccAddress } func NewCosmosPrecompile( @@ -59,7 +61,13 @@ func NewCosmosPrecompile( edk types.ERC20DenomKeeper, grpcRouter types.GRPCRouter, queryWhitelist types.QueryCosmosWhitelist, + authority string, ) (*CosmosPrecompile, error) { + authorityAddr, err := sdk.AccAddressFromBech32(authority) + if err != nil { + return nil, err + } + return &CosmosPrecompile{ ABI: erc20CosmosABI, cdc: cdc, @@ -70,6 +78,7 @@ func NewCosmosPrecompile( stateDB: stateDB, grpcRouter: grpcRouter, queryWhitelist: queryWhitelist, + authorityAddr: authorityAddr, }, nil } @@ -174,6 +183,28 @@ func (e *CosmosPrecompile) ExtendedRun(caller vm.ContractRef, input []byte, supp if err != nil { return nil, ctx.GasMeter().GasConsumedToLimit(), types.ErrPrecompileFailed.Wrap(err.Error()) } + case METHOD_IS_AUTHORITY_ADDRESS: + ctx.GasMeter().ConsumeGas(IS_AUTHORITY_ADDRESS_GAS, "is_authority_address") + + var isAuthorityAddressArguments IsAuthorityAddressArguments + if err := method.Inputs.Copy(&isAuthorityAddressArguments, args); err != nil { + return nil, ctx.GasMeter().GasConsumedToLimit(), types.ErrPrecompileFailed.Wrap(err.Error()) + } + + // convert shorthand account to original address + addr, err := e.originAddress(ctx, isAuthorityAddressArguments.Address.Bytes()) + if err != nil { + return nil, ctx.GasMeter().GasConsumedToLimit(), types.ErrPrecompileFailed.Wrap(err.Error()) + } + + // check if the address is the authority address + isAuthorityAddr := addr.Equals(e.authorityAddr) + + // abi encode the response + resBz, err = method.Outputs.Pack(isAuthorityAddr) + if err != nil { + return nil, ctx.GasMeter().GasConsumedToLimit(), types.ErrPrecompileFailed.Wrap(err.Error()) + } case METHOD_TO_COSMOS_ADDRESS: ctx.GasMeter().ConsumeGas(TO_COSMOS_ADDRESS_GAS, "to_cosmos_address") diff --git a/x/evm/precompiles/cosmos/contract_test.go b/x/evm/precompiles/cosmos/contract_test.go index c802322..65addae 100644 --- a/x/evm/precompiles/cosmos/contract_test.go +++ b/x/evm/precompiles/cosmos/contract_test.go @@ -25,6 +25,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/cosmos/gogoproto/proto" "github.com/ethereum/go-ethereum/common" @@ -62,9 +63,10 @@ func setup() (sdk.Context, codec.Codec, address.Codec, types.AccountKeeper, type func Test_CosmosPrecompile_IsBlockedAddress(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() stateDB := NewMockStateDB(ctx) - cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -106,9 +108,10 @@ func Test_CosmosPrecompile_IsBlockedAddress(t *testing.T) { func Test_CosmosPrecompile_IsModuleAddress(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() stateDB := NewMockStateDB(ctx) - cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -148,11 +151,54 @@ func Test_CosmosPrecompile_IsModuleAddress(t *testing.T) { require.True(t, ret[0].(bool)) } +func Test_CosmosPrecompile_IsAuthorityAddress(t *testing.T) { + ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() + + stateDB := NewMockStateDB(ctx) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) + require.NoError(t, err) + + evmAddr := common.HexToAddress("0x1") + require.NoError(t, err) + + abi, err := contracts.ICosmosMetaData.GetAbi() + require.NoError(t, err) + + // is authority address + inputBz, err := abi.Pack(precompiles.METHOD_IS_AUTHORITY_ADDRESS, evmAddr) + require.NoError(t, err) + + // out of gas error + _, _, err = cosmosPrecompile.ExtendedRun(vm.AccountRef(evmAddr), inputBz, precompiles.IS_AUTHORITY_ADDRESS_GAS-1, true) + require.ErrorIs(t, err, vm.ErrOutOfGas) + + retBz, _, err := cosmosPrecompile.ExtendedRun(vm.AccountRef(evmAddr), inputBz, precompiles.IS_AUTHORITY_ADDRESS_GAS+uint64(len(inputBz)), true) + require.NoError(t, err) + + ret, err := abi.Unpack(precompiles.METHOD_IS_AUTHORITY_ADDRESS, retBz) + require.NoError(t, err) + require.False(t, ret[0].(bool)) + + // update input to authority address + authorityEVMAddr := common.BytesToAddress(authtypes.NewModuleAddress(govtypes.ModuleName).Bytes()) + inputBz, err = abi.Pack(precompiles.METHOD_IS_AUTHORITY_ADDRESS, authorityEVMAddr) + require.NoError(t, err) + + retBz, _, err = cosmosPrecompile.ExtendedRun(vm.AccountRef(evmAddr), inputBz, precompiles.IS_AUTHORITY_ADDRESS_GAS+uint64(len(inputBz)), true) + require.NoError(t, err) + + ret, err = abi.Unpack(precompiles.METHOD_IS_AUTHORITY_ADDRESS, retBz) + require.NoError(t, err) + require.True(t, ret[0].(bool)) +} + func Test_CosmosPrecompile_ToCosmosAddress(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() stateDB := NewMockStateDB(ctx) - cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -180,9 +226,10 @@ func Test_CosmosPrecompile_ToCosmosAddress(t *testing.T) { func Test_CosmosPrecompile_ToEVMAddress(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() stateDB := NewMockStateDB(ctx) - cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -210,9 +257,10 @@ func Test_CosmosPrecompile_ToEVMAddress(t *testing.T) { func Test_ExecuteCosmos(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() stateDB := NewMockStateDB(ctx) - cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -283,8 +331,10 @@ func Test_ExecuteCosmos(t *testing.T) { func Test_ExecuteCosmosWithOptions(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() + stateDB := NewMockStateDB(ctx) - cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil) + cosmosPrecompile, err := precompiles.NewCosmosPrecompile(stateDB, cdc, ac, ak, bk, nil, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -356,6 +406,7 @@ func Test_ExecuteCosmosWithOptions(t *testing.T) { func Test_QueryCosmos(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() queryPath := "/connect.oracle.v2.Query/Prices" expectedRet := oracletypes.GetPricesResponse{ @@ -390,7 +441,7 @@ func Test_QueryCosmos(t *testing.T) { Request: &oracletypes.GetPricesRequest{}, Response: &oracletypes.GetPricesResponse{}, }, - }) + }, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -423,6 +474,7 @@ func Test_QueryCosmos(t *testing.T) { func Test_ToDenom(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() erc20Addr := common.HexToAddress("0x123") denom := "evm/0000000000000000000000000000000000000123" @@ -435,7 +487,7 @@ func Test_ToDenom(t *testing.T) { addrMap: map[common.Address]string{ erc20Addr: denom, }, - }, nil, nil) + }, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") @@ -463,6 +515,7 @@ func Test_ToDenom(t *testing.T) { func Test_ToErc20(t *testing.T) { ctx, cdc, ac, ak, bk := setup() + authorityAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() erc20Addr := common.HexToAddress("0x123") denom := "evm/0000000000000000000000000000000000000123" @@ -475,7 +528,7 @@ func Test_ToErc20(t *testing.T) { addrMap: map[common.Address]string{ erc20Addr: denom, }, - }, nil, nil) + }, nil, nil, authorityAddr) require.NoError(t, err) evmAddr := common.HexToAddress("0x1") diff --git a/x/evm/precompiles/cosmos/types.go b/x/evm/precompiles/cosmos/types.go index c5c654d..db16529 100644 --- a/x/evm/precompiles/cosmos/types.go +++ b/x/evm/precompiles/cosmos/types.go @@ -16,6 +16,11 @@ type IsModuleAddressArguments struct { Address common.Address `abi:"address"` } +// IsAuthorityAddressArguments is the arguments for the is_authority_address method. +type IsAuthorityAddressArguments struct { + Address common.Address `abi:"address"` +} + // ToCosmosAddressArguments is the arguments for the to_cosmos_address method. type ToCosmosAddressArguments struct { EVMAddress common.Address `abi:"evm_address"` @@ -53,8 +58,9 @@ type ToERC20Arguments struct { } const ( - IS_BLOCKED_ADDRESS_GAS storetypes.Gas = 100 - IS_MODULE_ADDRESS_GAS storetypes.Gas = 200 + IS_BLOCKED_ADDRESS_GAS storetypes.Gas = 100 + IS_MODULE_ADDRESS_GAS storetypes.Gas = 200 + IS_AUTHORITY_ADDRESS_GAS storetypes.Gas = 200 TO_COSMOS_ADDRESS_GAS storetypes.Gas = 200 TO_EVM_ADDRESS_GAS storetypes.Gas = 200 @@ -69,8 +75,9 @@ const ( ) const ( - METHOD_IS_BLOCKED_ADDRESS = "is_blocked_address" - METHOD_IS_MODULE_ADDRESS = "is_module_address" + METHOD_IS_BLOCKED_ADDRESS = "is_blocked_address" + METHOD_IS_MODULE_ADDRESS = "is_module_address" + METHOD_IS_AUTHORITY_ADDRESS = "is_authority_address" METHOD_TO_COSMOS_ADDRESS = "to_cosmos_address" METHOD_TO_EVM_ADDRESS = "to_evm_address" From 6a9ea9795996fafe2c6a86ae08ad61b99152388d Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 18:23:58 +0900 Subject: [PATCH 2/9] wip --- app/upgrade.go | 67 +++++++++++++++++- x/evm/contracts/erc20/ERC20.go | 70 +++++++++---------- x/evm/contracts/erc20/ERC20.sol | 5 +- x/evm/contracts/erc20_factory/ERC20Factory.go | 2 +- x/evm/contracts/erc20_wrapper/ERC20Wrapper.go | 2 +- 5 files changed, 106 insertions(+), 40 deletions(-) diff --git a/app/upgrade.go b/app/upgrade.go index 688214c..04fe3d9 100644 --- a/app/upgrade.go +++ b/app/upgrade.go @@ -1,22 +1,39 @@ package app import ( + "bytes" "context" + "encoding/binary" + "fmt" "strings" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/initia-labs/minievm/x/evm/contracts/erc20" + "github.com/initia-labs/minievm/x/evm/state" + evmtypes "github.com/initia-labs/minievm/x/evm/types" ) -const upgradeName = "0.6.3" +const upgradeName = "0.6.4" // RegisterUpgradeHandlers returns upgrade handlers func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { app.UpgradeKeeper.SetUpgradeHandler( upgradeName, func(ctx context.Context, _ upgradetypes.Plan, versionMap module.VersionMap) (module.VersionMap, error) { + // deploy and store erc20 wrapper contract address + if err := app.EVMKeeper.DeployERC20Factory(ctx); err != nil && + // ignore contract address collision error (contract already deployed) + !strings.Contains(err.Error(), vm.ErrContractAddressCollision.Error()) { + return nil, err + } + // deploy and store erc20 wrapper contract address if err := app.EVMKeeper.DeployERC20Wrapper(ctx); err != nil && // ignore contract address collision error (contract already deployed) @@ -24,7 +41,55 @@ func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { return nil, err } + code := hexutil.MustDecode(erc20.Erc20MetaData.Bin) + + // runtime code + initCodeOP := common.Hex2Bytes("5ff3fe") + initCodePos := bytes.Index(code, initCodeOP) + code = code[initCodePos:] + + // code hash + codeHash := crypto.Keccak256Hash(code).Bytes() + + // iterate all erc20 contracts and replace contract code to new version + app.EVMKeeper.ERC20s.Walk(ctx, nil, func(contractAddr []byte) (bool, error) { + acc := app.AccountKeeper.GetAccount(ctx, contractAddr) + if acc == nil { + return true, fmt.Errorf("account not found for contract address %s", contractAddr) + } + + contractAcc, ok := acc.(*evmtypes.ContractAccount) + if !ok { + return true, fmt.Errorf("account is not a contract account for contract address %s", contractAddr) + } + + contractAcc.CodeHash = codeHash + app.AccountKeeper.SetAccount(ctx, contractAcc) + + // set code + codeKey := append(contractAddr, append(state.CodeKeyPrefix, codeHash...)...) + err := app.EVMKeeper.VMStore.Set(ctx, codeKey, code) + if err != nil { + return true, err + } + + // set code size + codeSizeKey := append(contractAddr, append(state.CodeSizeKeyPrefix, codeHash...)...) + err = app.EVMKeeper.VMStore.Set(ctx, codeSizeKey, uint64ToBytes(uint64(len(code)))) + if err != nil { + return true, err + } + + return false, nil + }) + return versionMap, nil }, ) } + +func uint64ToBytes(v uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, v) + return bz +} diff --git a/x/evm/contracts/erc20/ERC20.go b/x/evm/contracts/erc20/ERC20.go index a4c15da..ee2741f 100644 --- a/x/evm/contracts/erc20/ERC20.go +++ b/x/evm/contracts/erc20/ERC20.go @@ -31,8 +31,8 @@ var ( // Erc20MetaData contains all meta data concerning the Erc20 contract. var Erc20MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c67380380612c6783398181016040528101906100319190610285565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052e565b50826004908161008f919061052e565b508160055f6101000a81548160ff021916908360ff16021790555080600560016101000a81548160ff021916908315150217905550505050506105fd565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012c826100e6565b810181811067ffffffffffffffff8211171561014b5761014a6100f6565b5b80604052505050565b5f61015d6100cd565b90506101698282610123565b919050565b5f67ffffffffffffffff821115610188576101876100f6565b5b610191826100e6565b9050602081019050919050565b8281835e5f83830152505050565b5f6101be6101b98461016e565b610154565b9050828152602081018484840111156101da576101d96100e2565b5b6101e584828561019e565b509392505050565b5f82601f830112610201576102006100de565b5b81516102118482602086016101ac565b91505092915050565b5f60ff82169050919050565b61022f8161021a565b8114610239575f80fd5b50565b5f8151905061024a81610226565b92915050565b5f8115159050919050565b61026481610250565b811461026e575f80fd5b50565b5f8151905061027f8161025b565b92915050565b5f805f806080858703121561029d5761029c6100d6565b5b5f85015167ffffffffffffffff8111156102ba576102b96100da565b5b6102c6878288016101ed565b945050602085015167ffffffffffffffff8111156102e7576102e66100da565b5b6102f3878288016101ed565b93505060406103048782880161023c565b925050606061031587828801610271565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036f57607f821691505b6020821081036103825761038161032b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a9565b6103ee86836103a9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043261042d61042884610406565b61040f565b610406565b9050919050565b5f819050919050565b61044b83610418565b61045f61045782610439565b8484546103b5565b825550505050565b5f90565b610473610467565b61047e818484610442565b505050565b5b818110156104a1576104965f8261046b565b600181019050610484565b5050565b601f8211156104e6576104b781610388565b6104c08461039a565b810160208510156104cf578190505b6104e36104db8561039a565b830182610483565b50505b505050565b5f82821c905092915050565b5f6105065f19846008026104eb565b1980831691505092915050565b5f61051e83836104f7565b9150826002028217905092915050565b61053782610321565b67ffffffffffffffff8111156105505761054f6100f6565b5b61055a8254610358565b6105658282856104a5565b5f60209050601f831160018114610596575f8415610584578287015190505b61058e8582610513565b8655506105f5565b601f1984166105a486610388565b5f5b828110156105cb578489015182556001820191506020850194506020810190506105a6565b868310156105e857848901516105e4601f8916826104f7565b8355505b6001600288020188555050505b505050505050565b61265d8061060a5f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611883565b6103f6565b60405161015591906118c8565b60405180910390f35b61016661046f565b6040516101739190611951565b60405180910390f35b610196600480360381019061019191906119fe565b6104fb565b6040516101a391906118c8565b60405180910390f35b6101b46105e8565b6040516101c19190611a4b565b60405180910390f35b6101e460048036038101906101df9190611a64565b6105ee565b005b61020060048036038101906101fb9190611a64565b61066d565b60405161020d91906118c8565b60405180910390f35b610230600480360381019061022b91906119fe565b610888565b005b61023a610905565b6040516102479190611acf565b60405180910390f35b61026a600480360381019061026591906119fe565b610917565b005b61028660048036038101906102819190611ae8565b610a36565b005b6102a2600480360381019061029d9190611b13565b610afe565b6040516102af9190611a4b565b60405180910390f35b6102d260048036038101906102cd91906119fe565b610b13565b6040516102df91906118c8565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4d565b60405180910390f35b61030e610d4f565b60405161031b9190611951565b60405180910390f35b61033e60048036038101906103399190611cbc565b610ddb565b005b61035a600480360381019061035591906119fe565b610f3d565b60405161036791906118c8565b60405180910390f35b61038a60048036038101906103859190611d44565b61100e565b6040516103979190611a4b565b60405180910390f35b6103ba60048036038101906103b59190611b13565b61102e565b005b6103c4611176565b6040516103d191906118c8565b60405180910390f35b6103f460048036038101906103ef91906119fe565b611189565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611206565b5b9050919050565b6003805461047c90611daf565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611daf565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a4b565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e29565b60405180910390fd5b61066883838361126f565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4d565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e71565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f0c565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f9a565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe5565b9250508190555061087c85858561126f565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e29565b60405180910390fd5b61090182826114fa565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4d565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e71565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890612062565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114fa565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4d565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e71565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120ca565b60405180910390fd5b610afa33836116c9565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4d565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e71565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120ca565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612158565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe5565b92505081905550610d2184846116c9565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611daf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611daf565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4d565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e71565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e6565b60405180910390fd5b600560019054906101000a900460ff1615610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda9061224e565b60405180910390fd5b8260039081610ef29190612409565b508160049081610f029190612409565b508060055f6101000a81548160ff021916908360ff1602179055506001600560016101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f799190611b4d565b602060405180830381865afa158015610f94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb89190611e71565b15610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90611f0c565b60405180910390fd5b61100333858561126f565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611084575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110bb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560019054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90611e29565b60405180910390fd5b61120282826116c9565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112aa9190611b4d565b602060405180830381865afa1580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e99190611e71565b6113695760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113279190611b4d565b6020604051808303815f875af1158015611343573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113679190611e71565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090612548565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114359190611fe5565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114889190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114ec9190611a4b565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115359190611b4d565b602060405180830381865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190611e71565b6115f45760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115b29190611b4d565b6020604051808303815f875af11580156115ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f29190611e71565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546116409190612566565b925050819055508160065f8282546116589190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116bc9190611a4b565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090612609565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117959190611fe5565b925050819055508060065f8282546117ad9190611fe5565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118119190611a4b565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118628161182e565b811461186c575f80fd5b50565b5f8135905061187d81611859565b92915050565b5f6020828403121561189857611897611826565b5b5f6118a58482850161186f565b91505092915050565b5f8115159050919050565b6118c2816118ae565b82525050565b5f6020820190506118db5f8301846118b9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611923826118e1565b61192d81856118eb565b935061193d8185602086016118fb565b61194681611909565b840191505092915050565b5f6020820190508181035f8301526119698184611919565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61199a82611971565b9050919050565b6119aa81611990565b81146119b4575f80fd5b50565b5f813590506119c5816119a1565b92915050565b5f819050919050565b6119dd816119cb565b81146119e7575f80fd5b50565b5f813590506119f8816119d4565b92915050565b5f8060408385031215611a1457611a13611826565b5b5f611a21858286016119b7565b9250506020611a32858286016119ea565b9150509250929050565b611a45816119cb565b82525050565b5f602082019050611a5e5f830184611a3c565b92915050565b5f805f60608486031215611a7b57611a7a611826565b5b5f611a88868287016119b7565b9350506020611a99868287016119b7565b9250506040611aaa868287016119ea565b9150509250925092565b5f60ff82169050919050565b611ac981611ab4565b82525050565b5f602082019050611ae25f830184611ac0565b92915050565b5f60208284031215611afd57611afc611826565b5b5f611b0a848285016119ea565b91505092915050565b5f60208284031215611b2857611b27611826565b5b5f611b35848285016119b7565b91505092915050565b611b4781611990565b82525050565b5f602082019050611b605f830184611b3e565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba482611909565b810181811067ffffffffffffffff82111715611bc357611bc2611b6e565b5b80604052505050565b5f611bd561181d565b9050611be18282611b9b565b919050565b5f67ffffffffffffffff821115611c0057611bff611b6e565b5b611c0982611909565b9050602081019050919050565b828183375f83830152505050565b5f611c36611c3184611be6565b611bcc565b905082815260208101848484011115611c5257611c51611b6a565b5b611c5d848285611c16565b509392505050565b5f82601f830112611c7957611c78611b66565b5b8135611c89848260208601611c24565b91505092915050565b611c9b81611ab4565b8114611ca5575f80fd5b50565b5f81359050611cb681611c92565b92915050565b5f805f60608486031215611cd357611cd2611826565b5b5f84013567ffffffffffffffff811115611cf057611cef61182a565b5b611cfc86828701611c65565b935050602084013567ffffffffffffffff811115611d1d57611d1c61182a565b5b611d2986828701611c65565b9250506040611d3a86828701611ca8565b9150509250925092565b5f8060408385031215611d5a57611d59611826565b5b5f611d67858286016119b7565b9250506020611d78858286016119b7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc657607f821691505b602082108103611dd957611dd8611d82565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e13601e836118eb565b9150611e1e82611ddf565b602082019050919050565b5f6020820190508181035f830152611e4081611e07565b9050919050565b611e50816118ae565b8114611e5a575f80fd5b50565b5f81519050611e6b81611e47565b92915050565b5f60208284031215611e8657611e85611826565b5b5f611e9384828501611e5d565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef66022836118eb565b9150611f0182611e9c565b604082019050919050565b5f6020820190508181035f830152611f2381611eea565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f846028836118eb565b9150611f8f82611f2a565b604082019050919050565b5f6020820190508181035f830152611fb181611f78565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fef826119cb565b9150611ffa836119cb565b925082820390508181111561201257612011611fb8565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f61204c601e836118eb565b915061205782612018565b602082019050919050565b5f6020820190508181035f83015261207981612040565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b4601f836118eb565b91506120bf82612080565b602082019050919050565b5f6020820190508181035f8301526120e1816120a8565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f6121426024836118eb565b915061214d826120e8565b604082019050919050565b5f6020820190508181035f83015261216f81612136565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121d06022836118eb565b91506121db82612176565b604082019050919050565b5f6020820190508181035f8301526121fd816121c4565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122386016836118eb565b915061224382612204565b602082019050919050565b5f6020820190508181035f8301526122658161222c565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228d565b6122d2868361228d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230d612308612303846119cb565b6122ea565b6119cb565b9050919050565b5f819050919050565b612326836122f3565b61233a61233282612314565b848454612299565b825550505050565b5f90565b61234e612342565b61235981848461231d565b505050565b5b8181101561237c576123715f82612346565b60018101905061235f565b5050565b601f8211156123c1576123928161226c565b61239b8461227e565b810160208510156123aa578190505b6123be6123b68561227e565b83018261235e565b50505b505050565b5f82821c905092915050565b5f6123e15f19846008026123c6565b1980831691505092915050565b5f6123f983836123d2565b9150826002028217905092915050565b612412826118e1565b67ffffffffffffffff81111561242b5761242a611b6e565b5b6124358254611daf565b612440828285612380565b5f60209050601f831160018114612471575f841561245f578287015190505b61246985826123ee565b8655506124d0565b601f19841661247f8661226c565b5f5b828110156124a657848901518255600182019150602085019450602081019050612481565b868310156124c357848901516124bf601f8916826123d2565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6125326026836118eb565b915061253d826124d8565b604082019050919050565b5f6020820190508181035f83015261255f81612526565b9050919050565b5f612570826119cb565b915061257b836119cb565b925082820190508082111561259357612592611fb8565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f36022836118eb565b91506125fe82612599565b604082019050919050565b5f6020820190508181035f830152612620816125e7565b905091905056fea2646970667358221220e2cfc0097f51eca2b1fbd34739d93e3d63cce4e6c99115fdcecc1f57067f4d8764736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"_metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c80636312013f116100ab5780639f1914841161006f5780639f19148414610342578063a9059cbb1461035e578063dd62ed3e1461038e578063f2fde38b146103be578063fe1195ec146103da5761012a565b80636312013f1461028857806370a08231146102a657806379cc6790146102d65780638da5cb5b1461030657806395d89b41146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b610290610afe565b60405161029d91906118c5565b60405180910390f35b6102c060048036038101906102bb9190611b10565b610b10565b6040516102cd9190611a48565b60405180910390f35b6102f060048036038101906102eb91906119fb565b610b25565b6040516102fd91906118c5565b60405180910390f35b61030e610d3e565b60405161031b9190611b4a565b60405180910390f35b61032c610d61565b604051610339919061194e565b60405180910390f35b61035c60048036038101906103579190611cb9565b610ded565b005b610378600480360381019061037391906119fb565b610f4d565b60405161038591906118c5565b60405180910390f35b6103a860048036038101906103a39190611d41565b61101e565b6040516103b59190611a48565b60405180910390f35b6103d860048036038101906103d39190611b10565b61103e565b005b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b60075f9054906101000a900460ff1681565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b619190611b4a565b602060405180830381865afa158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611e6e565b15610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d229190611fe2565b92505081905550610d3384846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d6e90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90611dac565b8015610de55780601f10610dbc57610100808354040283529160200191610de5565b820191905f5260205f20905b815481529060010190602001808311610dc857829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e279190611b4a565b602060405180830381865afa158015610e42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e669190611e6e565b610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb9061224b565b60405180910390fd5b8260039081610f039190612406565b508160049081610f139190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f899190611b4a565b602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc89190611e6e565b15611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90611f09565b60405180910390fd5b61101333858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611094575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110cb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea264697066735822122052cf15d32a984b09e97731db92fec90f8955cbb2a6d66c568f7e9f5043fdfa8864736f6c63430008190033", } // Erc20ABI is the input ABI used to generate the binding from. @@ -44,7 +44,7 @@ var Erc20ABI = Erc20MetaData.ABI var Erc20Bin = Erc20MetaData.Bin // DeployErc20 deploys a new Ethereum contract, binding an instance of Erc20 to it. -func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8, _metadataSealed bool) (common.Address, *types.Transaction, *Erc20, error) { +func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8, metadataSealed bool) (common.Address, *types.Transaction, *Erc20, error) { parsed, err := Erc20MetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -53,7 +53,7 @@ func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name st return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend, _name, _symbol, _decimals, _metadataSealed) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend, _name, _symbol, _decimals, metadataSealed) if err != nil { return common.Address{}, nil, nil, err } @@ -202,6 +202,37 @@ func (_Erc20 *Erc20TransactorRaw) Transact(opts *bind.TransactOpts, method strin return _Erc20.Contract.contract.Transact(opts, method, params...) } +// MetadataSealed is a free data retrieval call binding the contract method 0x6312013f. +// +// Solidity: function _metadataSealed() view returns(bool) +func (_Erc20 *Erc20Caller) MetadataSealed(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "_metadataSealed") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// MetadataSealed is a free data retrieval call binding the contract method 0x6312013f. +// +// Solidity: function _metadataSealed() view returns(bool) +func (_Erc20 *Erc20Session) MetadataSealed() (bool, error) { + return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) +} + +// MetadataSealed is a free data retrieval call binding the contract method 0x6312013f. +// +// Solidity: function _metadataSealed() view returns(bool) +func (_Erc20 *Erc20CallerSession) MetadataSealed() (bool, error) { + return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) +} + // Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. // // Solidity: function allowance(address , address ) view returns(uint256) @@ -295,37 +326,6 @@ func (_Erc20 *Erc20CallerSession) Decimals() (uint8, error) { return _Erc20.Contract.Decimals(&_Erc20.CallOpts) } -// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. -// -// Solidity: function metadataSealed() view returns(bool) -func (_Erc20 *Erc20Caller) MetadataSealed(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _Erc20.contract.Call(opts, &out, "metadataSealed") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. -// -// Solidity: function metadataSealed() view returns(bool) -func (_Erc20 *Erc20Session) MetadataSealed() (bool, error) { - return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) -} - -// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. -// -// Solidity: function metadataSealed() view returns(bool) -func (_Erc20 *Erc20CallerSession) MetadataSealed() (bool, error) { - return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) -} - // Name is a free data retrieval call binding the contract method 0x06fdde03. // // Solidity: function name() view returns(string) diff --git a/x/evm/contracts/erc20/ERC20.sol b/x/evm/contracts/erc20/ERC20.sol index 028a608..861464b 100644 --- a/x/evm/contracts/erc20/ERC20.sol +++ b/x/evm/contracts/erc20/ERC20.sol @@ -22,10 +22,11 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { string public name; string public symbol; uint8 public decimals; - bool public metadataSealed; - uint256 public totalSupply; + // metadataSealed is set to true after metadata is sealed + bool public metadataSealed; + /** * @dev See {IERC165-supportsInterface}. */ diff --git a/x/evm/contracts/erc20_factory/ERC20Factory.go b/x/evm/contracts/erc20_factory/ERC20Factory.go index a5aea52..52275ad 100644 --- a/x/evm/contracts/erc20_factory/ERC20Factory.go +++ b/x/evm/contracts/erc20_factory/ERC20Factory.go @@ -32,7 +32,7 @@ var ( // Erc20FactoryMetaData contains all meta data concerning the Erc20Factory contract. var Erc20FactoryMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"erc20\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20Created\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createERC20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052348015600e575f80fd5b5061324a8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612c67806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612c67380380612c6783398181016040528101906100319190610285565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052e565b50826004908161008f919061052e565b508160055f6101000a81548160ff021916908360ff16021790555080600560016101000a81548160ff021916908315150217905550505050506105fd565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012c826100e6565b810181811067ffffffffffffffff8211171561014b5761014a6100f6565b5b80604052505050565b5f61015d6100cd565b90506101698282610123565b919050565b5f67ffffffffffffffff821115610188576101876100f6565b5b610191826100e6565b9050602081019050919050565b8281835e5f83830152505050565b5f6101be6101b98461016e565b610154565b9050828152602081018484840111156101da576101d96100e2565b5b6101e584828561019e565b509392505050565b5f82601f830112610201576102006100de565b5b81516102118482602086016101ac565b91505092915050565b5f60ff82169050919050565b61022f8161021a565b8114610239575f80fd5b50565b5f8151905061024a81610226565b92915050565b5f8115159050919050565b61026481610250565b811461026e575f80fd5b50565b5f8151905061027f8161025b565b92915050565b5f805f806080858703121561029d5761029c6100d6565b5b5f85015167ffffffffffffffff8111156102ba576102b96100da565b5b6102c6878288016101ed565b945050602085015167ffffffffffffffff8111156102e7576102e66100da565b5b6102f3878288016101ed565b93505060406103048782880161023c565b925050606061031587828801610271565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036f57607f821691505b6020821081036103825761038161032b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a9565b6103ee86836103a9565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043261042d61042884610406565b61040f565b610406565b9050919050565b5f819050919050565b61044b83610418565b61045f61045782610439565b8484546103b5565b825550505050565b5f90565b610473610467565b61047e818484610442565b505050565b5b818110156104a1576104965f8261046b565b600181019050610484565b5050565b601f8211156104e6576104b781610388565b6104c08461039a565b810160208510156104cf578190505b6104e36104db8561039a565b830182610483565b50505b505050565b5f82821c905092915050565b5f6105065f19846008026104eb565b1980831691505092915050565b5f61051e83836104f7565b9150826002028217905092915050565b61053782610321565b67ffffffffffffffff8111156105505761054f6100f6565b5b61055a8254610358565b6105658282856104a5565b5f60209050601f831160018114610596575f8415610584578287015190505b61058e8582610513565b8655506105f5565b601f1984166105a486610388565b5f5b828110156105cb578489015182556001820191506020850194506020810190506105a6565b868310156105e857848901516105e4601f8916826104f7565b8355505b6001600288020188555050505b505050505050565b61265d8061060a5f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611883565b6103f6565b60405161015591906118c8565b60405180910390f35b61016661046f565b6040516101739190611951565b60405180910390f35b610196600480360381019061019191906119fe565b6104fb565b6040516101a391906118c8565b60405180910390f35b6101b46105e8565b6040516101c19190611a4b565b60405180910390f35b6101e460048036038101906101df9190611a64565b6105ee565b005b61020060048036038101906101fb9190611a64565b61066d565b60405161020d91906118c8565b60405180910390f35b610230600480360381019061022b91906119fe565b610888565b005b61023a610905565b6040516102479190611acf565b60405180910390f35b61026a600480360381019061026591906119fe565b610917565b005b61028660048036038101906102819190611ae8565b610a36565b005b6102a2600480360381019061029d9190611b13565b610afe565b6040516102af9190611a4b565b60405180910390f35b6102d260048036038101906102cd91906119fe565b610b13565b6040516102df91906118c8565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4d565b60405180910390f35b61030e610d4f565b60405161031b9190611951565b60405180910390f35b61033e60048036038101906103399190611cbc565b610ddb565b005b61035a600480360381019061035591906119fe565b610f3d565b60405161036791906118c8565b60405180910390f35b61038a60048036038101906103859190611d44565b61100e565b6040516103979190611a4b565b60405180910390f35b6103ba60048036038101906103b59190611b13565b61102e565b005b6103c4611176565b6040516103d191906118c8565b60405180910390f35b6103f460048036038101906103ef91906119fe565b611189565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611206565b5b9050919050565b6003805461047c90611daf565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611daf565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a4b565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e29565b60405180910390fd5b61066883838361126f565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4d565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e71565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f0c565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f9a565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe5565b9250508190555061087c85858561126f565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e29565b60405180910390fd5b61090182826114fa565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4d565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e71565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890612062565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114fa565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4d565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e71565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120ca565b60405180910390fd5b610afa33836116c9565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4d565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e71565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120ca565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612158565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe5565b92505081905550610d2184846116c9565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611daf565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611daf565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4d565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e71565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e6565b60405180910390fd5b600560019054906101000a900460ff1615610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda9061224e565b60405180910390fd5b8260039081610ef29190612409565b508160049081610f029190612409565b508060055f6101000a81548160ff021916908360ff1602179055506001600560016101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f799190611b4d565b602060405180830381865afa158015610f94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb89190611e71565b15610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90611f0c565b60405180910390fd5b61100333858561126f565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611084575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110bb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560019054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90611e29565b60405180910390fd5b61120282826116c9565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112aa9190611b4d565b602060405180830381865afa1580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e99190611e71565b6113695760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113279190611b4d565b6020604051808303815f875af1158015611343573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113679190611e71565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090612548565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114359190611fe5565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114889190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114ec9190611a4b565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115359190611b4d565b602060405180830381865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190611e71565b6115f45760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115b29190611b4d565b6020604051808303815f875af11580156115ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f29190611e71565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546116409190612566565b925050819055508160065f8282546116589190612566565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116bc9190611a4b565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090612609565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117959190611fe5565b925050819055508060065f8282546117ad9190611fe5565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118119190611a4b565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118628161182e565b811461186c575f80fd5b50565b5f8135905061187d81611859565b92915050565b5f6020828403121561189857611897611826565b5b5f6118a58482850161186f565b91505092915050565b5f8115159050919050565b6118c2816118ae565b82525050565b5f6020820190506118db5f8301846118b9565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611923826118e1565b61192d81856118eb565b935061193d8185602086016118fb565b61194681611909565b840191505092915050565b5f6020820190508181035f8301526119698184611919565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61199a82611971565b9050919050565b6119aa81611990565b81146119b4575f80fd5b50565b5f813590506119c5816119a1565b92915050565b5f819050919050565b6119dd816119cb565b81146119e7575f80fd5b50565b5f813590506119f8816119d4565b92915050565b5f8060408385031215611a1457611a13611826565b5b5f611a21858286016119b7565b9250506020611a32858286016119ea565b9150509250929050565b611a45816119cb565b82525050565b5f602082019050611a5e5f830184611a3c565b92915050565b5f805f60608486031215611a7b57611a7a611826565b5b5f611a88868287016119b7565b9350506020611a99868287016119b7565b9250506040611aaa868287016119ea565b9150509250925092565b5f60ff82169050919050565b611ac981611ab4565b82525050565b5f602082019050611ae25f830184611ac0565b92915050565b5f60208284031215611afd57611afc611826565b5b5f611b0a848285016119ea565b91505092915050565b5f60208284031215611b2857611b27611826565b5b5f611b35848285016119b7565b91505092915050565b611b4781611990565b82525050565b5f602082019050611b605f830184611b3e565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba482611909565b810181811067ffffffffffffffff82111715611bc357611bc2611b6e565b5b80604052505050565b5f611bd561181d565b9050611be18282611b9b565b919050565b5f67ffffffffffffffff821115611c0057611bff611b6e565b5b611c0982611909565b9050602081019050919050565b828183375f83830152505050565b5f611c36611c3184611be6565b611bcc565b905082815260208101848484011115611c5257611c51611b6a565b5b611c5d848285611c16565b509392505050565b5f82601f830112611c7957611c78611b66565b5b8135611c89848260208601611c24565b91505092915050565b611c9b81611ab4565b8114611ca5575f80fd5b50565b5f81359050611cb681611c92565b92915050565b5f805f60608486031215611cd357611cd2611826565b5b5f84013567ffffffffffffffff811115611cf057611cef61182a565b5b611cfc86828701611c65565b935050602084013567ffffffffffffffff811115611d1d57611d1c61182a565b5b611d2986828701611c65565b9250506040611d3a86828701611ca8565b9150509250925092565b5f8060408385031215611d5a57611d59611826565b5b5f611d67858286016119b7565b9250506020611d78858286016119b7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc657607f821691505b602082108103611dd957611dd8611d82565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e13601e836118eb565b9150611e1e82611ddf565b602082019050919050565b5f6020820190508181035f830152611e4081611e07565b9050919050565b611e50816118ae565b8114611e5a575f80fd5b50565b5f81519050611e6b81611e47565b92915050565b5f60208284031215611e8657611e85611826565b5b5f611e9384828501611e5d565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef66022836118eb565b9150611f0182611e9c565b604082019050919050565b5f6020820190508181035f830152611f2381611eea565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f846028836118eb565b9150611f8f82611f2a565b604082019050919050565b5f6020820190508181035f830152611fb181611f78565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fef826119cb565b9150611ffa836119cb565b925082820390508181111561201257612011611fb8565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f61204c601e836118eb565b915061205782612018565b602082019050919050565b5f6020820190508181035f83015261207981612040565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b4601f836118eb565b91506120bf82612080565b602082019050919050565b5f6020820190508181035f8301526120e1816120a8565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f6121426024836118eb565b915061214d826120e8565b604082019050919050565b5f6020820190508181035f83015261216f81612136565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121d06022836118eb565b91506121db82612176565b604082019050919050565b5f6020820190508181035f8301526121fd816121c4565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122386016836118eb565b915061224382612204565b602082019050919050565b5f6020820190508181035f8301526122658161222c565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228d565b6122d2868361228d565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230d612308612303846119cb565b6122ea565b6119cb565b9050919050565b5f819050919050565b612326836122f3565b61233a61233282612314565b848454612299565b825550505050565b5f90565b61234e612342565b61235981848461231d565b505050565b5b8181101561237c576123715f82612346565b60018101905061235f565b5050565b601f8211156123c1576123928161226c565b61239b8461227e565b810160208510156123aa578190505b6123be6123b68561227e565b83018261235e565b50505b505050565b5f82821c905092915050565b5f6123e15f19846008026123c6565b1980831691505092915050565b5f6123f983836123d2565b9150826002028217905092915050565b612412826118e1565b67ffffffffffffffff81111561242b5761242a611b6e565b5b6124358254611daf565b612440828285612380565b5f60209050601f831160018114612471575f841561245f578287015190505b61246985826123ee565b8655506124d0565b601f19841661247f8661226c565b5f5b828110156124a657848901518255600182019150602085019450602081019050612481565b868310156124c357848901516124bf601f8916826123d2565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6125326026836118eb565b915061253d826124d8565b604082019050919050565b5f6020820190508181035f83015261255f81612526565b9050919050565b5f612570826119cb565b915061257b836119cb565b925082820190508082111561259357612592611fb8565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f36022836118eb565b91506125fe82612599565b604082019050919050565b5f6020820190508181035f830152612620816125e7565b905091905056fea2646970667358221220e2cfc0097f51eca2b1fbd34739d93e3d63cce4e6c99115fdcecc1f57067f4d8764736f6c63430008190033a2646970667358221220b846a7c42f7b0b9d00b3e74bc3863e61d625c42c48af2f26565db9c3e48d354164736f6c63430008190033", + Bin: "0x6080604052348015600e575f80fd5b506132468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612c63806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c80636312013f116100ab5780639f1914841161006f5780639f19148414610342578063a9059cbb1461035e578063dd62ed3e1461038e578063f2fde38b146103be578063fe1195ec146103da5761012a565b80636312013f1461028857806370a08231146102a657806379cc6790146102d65780638da5cb5b1461030657806395d89b41146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b610290610afe565b60405161029d91906118c5565b60405180910390f35b6102c060048036038101906102bb9190611b10565b610b10565b6040516102cd9190611a48565b60405180910390f35b6102f060048036038101906102eb91906119fb565b610b25565b6040516102fd91906118c5565b60405180910390f35b61030e610d3e565b60405161031b9190611b4a565b60405180910390f35b61032c610d61565b604051610339919061194e565b60405180910390f35b61035c60048036038101906103579190611cb9565b610ded565b005b610378600480360381019061037391906119fb565b610f4d565b60405161038591906118c5565b60405180910390f35b6103a860048036038101906103a39190611d41565b61101e565b6040516103b59190611a48565b60405180910390f35b6103d860048036038101906103d39190611b10565b61103e565b005b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b60075f9054906101000a900460ff1681565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b619190611b4a565b602060405180830381865afa158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611e6e565b15610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d229190611fe2565b92505081905550610d3384846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d6e90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90611dac565b8015610de55780601f10610dbc57610100808354040283529160200191610de5565b820191905f5260205f20905b815481529060010190602001808311610dc857829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e279190611b4a565b602060405180830381865afa158015610e42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e669190611e6e565b610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb9061224b565b60405180910390fd5b8260039081610f039190612406565b508160049081610f139190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f899190611b4a565b602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc89190611e6e565b15611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90611f09565b60405180910390fd5b61101333858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611094575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110cb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea264697066735822122052cf15d32a984b09e97731db92fec90f8955cbb2a6d66c568f7e9f5043fdfa8864736f6c63430008190033a264697066735822122028aa0fe676dbb2c596a0a4d1f043737bc03c04e744345c2088575c50ad9a74e464736f6c63430008190033", } // Erc20FactoryABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go index 8d7636f..a4c3951 100644 --- a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go +++ b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go @@ -32,7 +32,7 @@ var ( // Erc20WrapperMetaData contains all meta data concerning the Erc20Wrapper contract. var Erc20WrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20Factory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contractERC20Factory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"ibc_ack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"name\":\"ibc_timeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"originToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wrappedAmt\",\"type\":\"uint256\"}],\"name\":\"unwrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"channel\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"wrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea26469706673582212204030209c060e46e6d90ac0c849ab0755d7fe771f50feffcbadecc7f843a336a164736f6c63430008190033", + Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea264697066735822122074041009f25a7a7bd90773db2908687563d68664e74bcdb3ddaa3f6db64e1c5564736f6c63430008190033", } // Erc20WrapperABI is the input ABI used to generate the binding from. From f4602a624f1c0c924437d397911ed0fd53df0738 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 20:27:37 +0900 Subject: [PATCH 3/9] update upgrade name --- app/upgrade.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/upgrade.go b/app/upgrade.go index 04fe3d9..ec6f7dc 100644 --- a/app/upgrade.go +++ b/app/upgrade.go @@ -20,7 +20,7 @@ import ( evmtypes "github.com/initia-labs/minievm/x/evm/types" ) -const upgradeName = "0.6.4" +const upgradeName = "0.6.5" // RegisterUpgradeHandlers returns upgrade handlers func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { From c1c870bc630ca9f43f436c2e61be6d20ac866587 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 20:29:28 +0900 Subject: [PATCH 4/9] fix merge --- app/upgrade.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/upgrade.go b/app/upgrade.go index d4d2d9e..7ad7ad3 100644 --- a/app/upgrade.go +++ b/app/upgrade.go @@ -29,6 +29,8 @@ func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { app.UpgradeKeeper.SetUpgradeHandler( upgradeName, func(ctx context.Context, _ upgradetypes.Plan, versionMap module.VersionMap) (module.VersionMap, error) { + //////////////////////////// OPINIT //////////////////////////////////// + // opchild params update params, err := app.OPChildKeeper.GetParams(ctx) if err != nil { @@ -43,14 +45,9 @@ func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { return nil, err } - // deploy and store erc20 factory contract address - if err := app.EVMKeeper.DeployERC20Factory(ctx); err != nil && - // ignore contract address collision error (contract already deployed) - !strings.Contains(err.Error(), vm.ErrContractAddressCollision.Error()) { - return nil, err - } + //////////////////////////// MINIEVM /////////////////////////////////// - // deploy and store erc20 wrapper contract address + // deploy and store erc20 factory contract address if err := app.EVMKeeper.DeployERC20Factory(ctx); err != nil && // ignore contract address collision error (contract already deployed) !strings.Contains(err.Error(), vm.ErrContractAddressCollision.Error()) { From 9f5460a359ae789cf50fcc086abebe34f38b1de1 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 21:32:32 +0900 Subject: [PATCH 5/9] wip --- app/upgrade.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/upgrade.go b/app/upgrade.go index 7ad7ad3..a7fd646 100644 --- a/app/upgrade.go +++ b/app/upgrade.go @@ -66,7 +66,7 @@ func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { // runtime code initCodeOP := common.Hex2Bytes("5ff3fe") initCodePos := bytes.Index(code, initCodeOP) - code = code[initCodePos:] + code = code[initCodePos+3:] // code hash codeHash := crypto.Keccak256Hash(code).Bytes() From 552ecb85db94b42b7689c92f9c58d4ec160e996e Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 21:40:07 +0900 Subject: [PATCH 6/9] fix upgrade --- x/evm/contracts/erc20/ERC20.go | 70 +++++++++---------- x/evm/contracts/erc20_factory/ERC20Factory.go | 2 +- x/evm/contracts/erc20_wrapper/ERC20Wrapper.go | 2 +- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/x/evm/contracts/erc20/ERC20.go b/x/evm/contracts/erc20/ERC20.go index ee2741f..fd0f578 100644 --- a/x/evm/contracts/erc20/ERC20.go +++ b/x/evm/contracts/erc20/ERC20.go @@ -31,8 +31,8 @@ var ( // Erc20MetaData contains all meta data concerning the Erc20 contract. var Erc20MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"_metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c80636312013f116100ab5780639f1914841161006f5780639f19148414610342578063a9059cbb1461035e578063dd62ed3e1461038e578063f2fde38b146103be578063fe1195ec146103da5761012a565b80636312013f1461028857806370a08231146102a657806379cc6790146102d65780638da5cb5b1461030657806395d89b41146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b610290610afe565b60405161029d91906118c5565b60405180910390f35b6102c060048036038101906102bb9190611b10565b610b10565b6040516102cd9190611a48565b60405180910390f35b6102f060048036038101906102eb91906119fb565b610b25565b6040516102fd91906118c5565b60405180910390f35b61030e610d3e565b60405161031b9190611b4a565b60405180910390f35b61032c610d61565b604051610339919061194e565b60405180910390f35b61035c60048036038101906103579190611cb9565b610ded565b005b610378600480360381019061037391906119fb565b610f4d565b60405161038591906118c5565b60405180910390f35b6103a860048036038101906103a39190611d41565b61101e565b6040516103b59190611a48565b60405180910390f35b6103d860048036038101906103d39190611b10565b61103e565b005b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b60075f9054906101000a900460ff1681565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b619190611b4a565b602060405180830381865afa158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611e6e565b15610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d229190611fe2565b92505081905550610d3384846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d6e90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90611dac565b8015610de55780601f10610dbc57610100808354040283529160200191610de5565b820191905f5260205f20905b815481529060010190602001808311610dc857829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e279190611b4a565b602060405180830381865afa158015610e42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e669190611e6e565b610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb9061224b565b60405180910390fd5b8260039081610f039190612406565b508160049081610f139190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f899190611b4a565b602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc89190611e6e565b15611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90611f09565b60405180910390fd5b61101333858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611094575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110cb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea264697066735822122052cf15d32a984b09e97731db92fec90f8955cbb2a6d66c568f7e9f5043fdfa8864736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b6102a2600480360381019061029d9190611b10565b610afe565b6040516102af9190611a48565b60405180910390f35b6102d260048036038101906102cd91906119fb565b610b13565b6040516102df91906118c5565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4a565b60405180910390f35b61030e610d4f565b60405161031b919061194e565b60405180910390f35b61033e60048036038101906103399190611cb9565b610ddb565b005b61035a600480360381019061035591906119fb565b610f3b565b60405161036791906118c5565b60405180910390f35b61038a60048036038101906103859190611d41565b61100c565b6040516103979190611a48565b60405180910390f35b6103ba60048036038101906103b59190611b10565b61102c565b005b6103c4611174565b6040516103d191906118c5565b60405180910390f35b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4a565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e6e565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe2565b92505081905550610d2184846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611dac565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4a565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e6e565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed99061224b565b60405180910390fd5b8260039081610ef19190612406565b508160049081610f019190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f779190611b4a565b602060405180830381865afa158015610f92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611e6e565b15610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90611f09565b60405180910390fd5b61100133858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611082575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110b9575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075f9054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea2646970667358221220a8c6f2a48c1cd1f65560869388d6004ad6733f5d21b0ba53ca1e18211043321b64736f6c63430008190033", } // Erc20ABI is the input ABI used to generate the binding from. @@ -44,7 +44,7 @@ var Erc20ABI = Erc20MetaData.ABI var Erc20Bin = Erc20MetaData.Bin // DeployErc20 deploys a new Ethereum contract, binding an instance of Erc20 to it. -func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8, metadataSealed bool) (common.Address, *types.Transaction, *Erc20, error) { +func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8, _metadataSealed bool) (common.Address, *types.Transaction, *Erc20, error) { parsed, err := Erc20MetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -53,7 +53,7 @@ func DeployErc20(auth *bind.TransactOpts, backend bind.ContractBackend, _name st return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend, _name, _symbol, _decimals, metadataSealed) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc20Bin), backend, _name, _symbol, _decimals, _metadataSealed) if err != nil { return common.Address{}, nil, nil, err } @@ -202,37 +202,6 @@ func (_Erc20 *Erc20TransactorRaw) Transact(opts *bind.TransactOpts, method strin return _Erc20.Contract.contract.Transact(opts, method, params...) } -// MetadataSealed is a free data retrieval call binding the contract method 0x6312013f. -// -// Solidity: function _metadataSealed() view returns(bool) -func (_Erc20 *Erc20Caller) MetadataSealed(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _Erc20.contract.Call(opts, &out, "_metadataSealed") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// MetadataSealed is a free data retrieval call binding the contract method 0x6312013f. -// -// Solidity: function _metadataSealed() view returns(bool) -func (_Erc20 *Erc20Session) MetadataSealed() (bool, error) { - return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) -} - -// MetadataSealed is a free data retrieval call binding the contract method 0x6312013f. -// -// Solidity: function _metadataSealed() view returns(bool) -func (_Erc20 *Erc20CallerSession) MetadataSealed() (bool, error) { - return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) -} - // Allowance is a free data retrieval call binding the contract method 0xdd62ed3e. // // Solidity: function allowance(address , address ) view returns(uint256) @@ -326,6 +295,37 @@ func (_Erc20 *Erc20CallerSession) Decimals() (uint8, error) { return _Erc20.Contract.Decimals(&_Erc20.CallOpts) } +// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. +// +// Solidity: function metadataSealed() view returns(bool) +func (_Erc20 *Erc20Caller) MetadataSealed(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Erc20.contract.Call(opts, &out, "metadataSealed") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. +// +// Solidity: function metadataSealed() view returns(bool) +func (_Erc20 *Erc20Session) MetadataSealed() (bool, error) { + return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) +} + +// MetadataSealed is a free data retrieval call binding the contract method 0xf5daf8ff. +// +// Solidity: function metadataSealed() view returns(bool) +func (_Erc20 *Erc20CallerSession) MetadataSealed() (bool, error) { + return _Erc20.Contract.MetadataSealed(&_Erc20.CallOpts) +} + // Name is a free data retrieval call binding the contract method 0x06fdde03. // // Solidity: function name() view returns(string) diff --git a/x/evm/contracts/erc20_factory/ERC20Factory.go b/x/evm/contracts/erc20_factory/ERC20Factory.go index 52275ad..2516d7e 100644 --- a/x/evm/contracts/erc20_factory/ERC20Factory.go +++ b/x/evm/contracts/erc20_factory/ERC20Factory.go @@ -32,7 +32,7 @@ var ( // Erc20FactoryMetaData contains all meta data concerning the Erc20Factory contract. var Erc20FactoryMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"erc20\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20Created\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createERC20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052348015600e575f80fd5b506132468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612c63806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c80636312013f116100ab5780639f1914841161006f5780639f19148414610342578063a9059cbb1461035e578063dd62ed3e1461038e578063f2fde38b146103be578063fe1195ec146103da5761012a565b80636312013f1461028857806370a08231146102a657806379cc6790146102d65780638da5cb5b1461030657806395d89b41146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b610290610afe565b60405161029d91906118c5565b60405180910390f35b6102c060048036038101906102bb9190611b10565b610b10565b6040516102cd9190611a48565b60405180910390f35b6102f060048036038101906102eb91906119fb565b610b25565b6040516102fd91906118c5565b60405180910390f35b61030e610d3e565b60405161031b9190611b4a565b60405180910390f35b61032c610d61565b604051610339919061194e565b60405180910390f35b61035c60048036038101906103579190611cb9565b610ded565b005b610378600480360381019061037391906119fb565b610f4d565b60405161038591906118c5565b60405180910390f35b6103a860048036038101906103a39190611d41565b61101e565b6040516103b59190611a48565b60405180910390f35b6103d860048036038101906103d39190611b10565b61103e565b005b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b60075f9054906101000a900460ff1681565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b619190611b4a565b602060405180830381865afa158015610b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611e6e565b15610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd7906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d229190611fe2565b92505081905550610d3384846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d6e90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90611dac565b8015610de55780601f10610dbc57610100808354040283529160200191610de5565b820191905f5260205f20905b815481529060010190602001808311610dc857829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e279190611b4a565b602060405180830381865afa158015610e42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e669190611e6e565b610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb9061224b565b60405180910390fd5b8260039081610f039190612406565b508160049081610f139190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f899190611b4a565b602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc89190611e6e565b15611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90611f09565b60405180910390fd5b61101333858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611094575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110cb575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea264697066735822122052cf15d32a984b09e97731db92fec90f8955cbb2a6d66c568f7e9f5043fdfa8864736f6c63430008190033a264697066735822122028aa0fe676dbb2c596a0a4d1f043737bc03c04e744345c2088575c50ad9a74e464736f6c63430008190033", + Bin: "0x6080604052348015600e575f80fd5b506132468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612c63806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b6102a2600480360381019061029d9190611b10565b610afe565b6040516102af9190611a48565b60405180910390f35b6102d260048036038101906102cd91906119fb565b610b13565b6040516102df91906118c5565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4a565b60405180910390f35b61030e610d4f565b60405161031b919061194e565b60405180910390f35b61033e60048036038101906103399190611cb9565b610ddb565b005b61035a600480360381019061035591906119fb565b610f3b565b60405161036791906118c5565b60405180910390f35b61038a60048036038101906103859190611d41565b61100c565b6040516103979190611a48565b60405180910390f35b6103ba60048036038101906103b59190611b10565b61102c565b005b6103c4611174565b6040516103d191906118c5565b60405180910390f35b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4a565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e6e565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe2565b92505081905550610d2184846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611dac565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4a565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e6e565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed99061224b565b60405180910390fd5b8260039081610ef19190612406565b508160049081610f019190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f779190611b4a565b602060405180830381865afa158015610f92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611e6e565b15610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90611f09565b60405180910390fd5b61100133858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611082575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110b9575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075f9054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea2646970667358221220a8c6f2a48c1cd1f65560869388d6004ad6733f5d21b0ba53ca1e18211043321b64736f6c63430008190033a264697066735822122063b20a0ed96d729ed2493dd3d39e577251ffee68dcb1ca1dbc5413dcb3c5006e64736f6c63430008190033", } // Erc20FactoryABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go index a4c3951..6e68493 100644 --- a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go +++ b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go @@ -32,7 +32,7 @@ var ( // Erc20WrapperMetaData contains all meta data concerning the Erc20Wrapper contract. var Erc20WrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20Factory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contractERC20Factory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"ibc_ack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"name\":\"ibc_timeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"originToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wrappedAmt\",\"type\":\"uint256\"}],\"name\":\"unwrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"channel\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"wrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea264697066735822122074041009f25a7a7bd90773db2908687563d68664e74bcdb3ddaa3f6db64e1c5564736f6c63430008190033", + Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea2646970667358221220d103039d204e43b370e928a286653a17efd833afe3cacd01f6f8b918b0be85e764736f6c63430008190033", } // Erc20WrapperABI is the input ABI used to generate the binding from. From b41305e473179ce4a5636ab8b4506eaaf029073c Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 21:49:47 +0900 Subject: [PATCH 7/9] fix golangci-lint --- .golangci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 49393d0..5c0e0b1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -5,11 +5,16 @@ linters: - varnamelen - tagliatelle - wrapcheck + - typecheck + errcheck: + exclude-functions: + - fmt:.* + - io/ioutil:^Read.* + - github.com/spf13/cobra:MarkFlagRequired + - github.com/spf13/viper:BindPFlag linters-settings: gocyclo: min-complexity: 11 - errcheck: - ignore: fmt:.*,io/ioutil:^Read.*,github.com/spf13/cobra:MarkFlagRequired,github.com/spf13/viper:BindPFlag golint: min-confidence: 1.1 issues: From 7abdd7ccf8353137bb81bcec9143c64da68e3e7e Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 21:55:54 +0900 Subject: [PATCH 8/9] enhance contract descriptions --- x/evm/contracts/erc20/ERC20.go | 140 +++++++++++++++++- x/evm/contracts/erc20/ERC20.sol | 48 ++++-- x/evm/contracts/erc20_factory/ERC20Factory.go | 2 +- x/evm/contracts/erc20_wrapper/ERC20Wrapper.go | 2 +- 4 files changed, 177 insertions(+), 15 deletions(-) diff --git a/x/evm/contracts/erc20/ERC20.go b/x/evm/contracts/erc20/ERC20.go index fd0f578..179eccd 100644 --- a/x/evm/contracts/erc20/ERC20.go +++ b/x/evm/contracts/erc20/ERC20.go @@ -31,8 +31,8 @@ var ( // Erc20MetaData contains all meta data concerning the Erc20 contract. var Erc20MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b6102a2600480360381019061029d9190611b10565b610afe565b6040516102af9190611a48565b60405180910390f35b6102d260048036038101906102cd91906119fb565b610b13565b6040516102df91906118c5565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4a565b60405180910390f35b61030e610d4f565b60405161031b919061194e565b60405180910390f35b61033e60048036038101906103399190611cb9565b610ddb565b005b61035a600480360381019061035591906119fb565b610f3b565b60405161036791906118c5565b60405180910390f35b61038a60048036038101906103859190611d41565b61100c565b6040516103979190611a48565b60405180910390f35b6103ba60048036038101906103b59190611b10565b61102c565b005b6103c4611174565b6040516103d191906118c5565b60405180910390f35b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4a565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e6e565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe2565b92505081905550610d2184846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611dac565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4a565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e6e565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed99061224b565b60405180910390fd5b8260039081610ef19190612406565b508160049081610f019190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f779190611b4a565b602060405180830381865afa158015610f92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611e6e565b15610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90611f09565b60405180910390fd5b61100133858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611082575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110b9575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075f9054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea2646970667358221220a8c6f2a48c1cd1f65560869388d6004ad6733f5d21b0ba53ca1e18211043321b64736f6c63430008190033", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_metadataSealed\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"MetadataUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataSealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"sudoTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"name\":\"updateMetadata\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612ef6380380612ef683398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b6128ed806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611998565b6103f6565b60405161015591906119dd565b60405180910390f35b61016661046f565b6040516101739190611a66565b60405180910390f35b61019660048036038101906101919190611b13565b6104fb565b6040516101a391906119dd565b60405180910390f35b6101b46105e8565b6040516101c19190611b60565b60405180910390f35b6101e460048036038101906101df9190611b79565b6105ee565b005b61020060048036038101906101fb9190611b79565b61066d565b60405161020d91906119dd565b60405180910390f35b610230600480360381019061022b9190611b13565b610888565b005b61023a610905565b6040516102479190611be4565b60405180910390f35b61026a60048036038101906102659190611b13565b610917565b005b61028660048036038101906102819190611bfd565b610a36565b005b6102a2600480360381019061029d9190611c28565b610afe565b6040516102af9190611b60565b60405180910390f35b6102d260048036038101906102cd9190611b13565b610b13565b6040516102df91906119dd565b60405180910390f35b6102f0610d2c565b6040516102fd9190611c62565b60405180910390f35b61030e610d4f565b60405161031b9190611a66565b60405180910390f35b61033e60048036038101906103399190611dd1565b610ddb565b005b61035a60048036038101906103559190611b13565b611053565b60405161036791906119dd565b60405180910390f35b61038a60048036038101906103859190611e59565b611124565b6040516103979190611b60565b60405180910390f35b6103ba60048036038101906103b59190611c28565b611144565b005b6103c461128c565b6040516103d191906119dd565b60405180910390f35b6103f460048036038101906103ef9190611b13565b61129e565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061046857506104678261131b565b5b9050919050565b6003805461047c90611ec4565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611ec4565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611b60565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611f3e565b60405180910390fd5b610668838383611384565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611c62565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611f86565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612021565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da906120af565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a91906120fa565b9250508190555061087c858585611384565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611f3e565b60405180910390fd5b610901828261160f565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611c62565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611f86565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890612177565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a31838361160f565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611c62565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611f86565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906121df565b60405180910390fd5b610afa33836117de565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611c62565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611f86565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906121df565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061226d565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d1091906120fa565b92505081905550610d2184846117de565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611ec4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611ec4565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611c62565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611f86565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906122fb565b60405180910390fd5b60075f9054906101000a900460ff1615610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990612363565b60405180910390fd5b5f835111610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906123cb565b60405180910390fd5b5f825111610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90612433565b60405180910390fd5b60128160ff161115610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa69061249b565b60405180910390fd5b82828260035f60045f60055f8691906101000a81548160ff021916908360ff160217905550859190509081610fe49190612656565b50849190509081610ff59190612656565b50505050600160075f6101000a81548160ff0219169083151502179055507f3c16037886713f9479597685e40515c99616fa75e3c2003b658c4e5457695d7d83838360405161104693929190612725565b60405180910390a1505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b815260040161108f9190611c62565b602060405180830381865afa1580156110aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ce9190611f86565b1561110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590612021565b60405180910390fd5b611119338585611384565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461119a575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111d1575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075f9054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490611f3e565b60405180910390fd5b61131782826117de565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016113bf9190611c62565b602060405180830381865afa1580156113da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fe9190611f86565b61147e5760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b815260040161143c9190611c62565b6020604051808303815f875af1158015611458573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147c9190611f86565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906127d8565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461154a91906120fa565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461159d91906127f6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116019190611b60565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b815260040161164a9190611c62565b602060405180830381865afa158015611665573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116899190611f86565b6117095760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016116c79190611c62565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190611f86565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461175591906127f6565b925050819055508160065f82825461176d91906127f6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117d19190611b60565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590612899565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546118aa91906120fa565b925050819055508060065f8282546118c291906120fa565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119269190611b60565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61197781611943565b8114611981575f80fd5b50565b5f813590506119928161196e565b92915050565b5f602082840312156119ad576119ac61193b565b5b5f6119ba84828501611984565b91505092915050565b5f8115159050919050565b6119d7816119c3565b82525050565b5f6020820190506119f05f8301846119ce565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611a38826119f6565b611a428185611a00565b9350611a52818560208601611a10565b611a5b81611a1e565b840191505092915050565b5f6020820190508181035f830152611a7e8184611a2e565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611aaf82611a86565b9050919050565b611abf81611aa5565b8114611ac9575f80fd5b50565b5f81359050611ada81611ab6565b92915050565b5f819050919050565b611af281611ae0565b8114611afc575f80fd5b50565b5f81359050611b0d81611ae9565b92915050565b5f8060408385031215611b2957611b2861193b565b5b5f611b3685828601611acc565b9250506020611b4785828601611aff565b9150509250929050565b611b5a81611ae0565b82525050565b5f602082019050611b735f830184611b51565b92915050565b5f805f60608486031215611b9057611b8f61193b565b5b5f611b9d86828701611acc565b9350506020611bae86828701611acc565b9250506040611bbf86828701611aff565b9150509250925092565b5f60ff82169050919050565b611bde81611bc9565b82525050565b5f602082019050611bf75f830184611bd5565b92915050565b5f60208284031215611c1257611c1161193b565b5b5f611c1f84828501611aff565b91505092915050565b5f60208284031215611c3d57611c3c61193b565b5b5f611c4a84828501611acc565b91505092915050565b611c5c81611aa5565b82525050565b5f602082019050611c755f830184611c53565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611cb982611a1e565b810181811067ffffffffffffffff82111715611cd857611cd7611c83565b5b80604052505050565b5f611cea611932565b9050611cf68282611cb0565b919050565b5f67ffffffffffffffff821115611d1557611d14611c83565b5b611d1e82611a1e565b9050602081019050919050565b828183375f83830152505050565b5f611d4b611d4684611cfb565b611ce1565b905082815260208101848484011115611d6757611d66611c7f565b5b611d72848285611d2b565b509392505050565b5f82601f830112611d8e57611d8d611c7b565b5b8135611d9e848260208601611d39565b91505092915050565b611db081611bc9565b8114611dba575f80fd5b50565b5f81359050611dcb81611da7565b92915050565b5f805f60608486031215611de857611de761193b565b5b5f84013567ffffffffffffffff811115611e0557611e0461193f565b5b611e1186828701611d7a565b935050602084013567ffffffffffffffff811115611e3257611e3161193f565b5b611e3e86828701611d7a565b9250506040611e4f86828701611dbd565b9150509250925092565b5f8060408385031215611e6f57611e6e61193b565b5b5f611e7c85828601611acc565b9250506020611e8d85828601611acc565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611edb57607f821691505b602082108103611eee57611eed611e97565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611f28601e83611a00565b9150611f3382611ef4565b602082019050919050565b5f6020820190508181035f830152611f5581611f1c565b9050919050565b611f65816119c3565b8114611f6f575f80fd5b50565b5f81519050611f8081611f5c565b92915050565b5f60208284031215611f9b57611f9a61193b565b5b5f611fa884828501611f72565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61200b602283611a00565b915061201682611fb1565b604082019050919050565b5f6020820190508181035f83015261203881611fff565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f612099602883611a00565b91506120a48261203f565b604082019050919050565b5f6020820190508181035f8301526120c68161208d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61210482611ae0565b915061210f83611ae0565b9250828203905081811115612127576121266120cd565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612161601e83611a00565b915061216c8261212d565b602082019050919050565b5f6020820190508181035f83015261218e81612155565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6121c9601f83611a00565b91506121d482612195565b602082019050919050565b5f6020820190508181035f8301526121f6816121bd565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f612257602483611a00565b9150612262826121fd565b604082019050919050565b5f6020820190508181035f8301526122848161224b565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6122e5602283611a00565b91506122f08261228b565b604082019050919050565b5f6020820190508181035f830152612312816122d9565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f61234d601683611a00565b915061235882612319565b602082019050919050565b5f6020820190508181035f83015261237a81612341565b9050919050565b7f45524332303a20656d707479206e616d650000000000000000000000000000005f82015250565b5f6123b5601183611a00565b91506123c082612381565b602082019050919050565b5f6020820190508181035f8301526123e2816123a9565b9050919050565b7f45524332303a20656d7074792073796d626f6c000000000000000000000000005f82015250565b5f61241d601383611a00565b9150612428826123e9565b602082019050919050565b5f6020820190508181035f83015261244a81612411565b9050919050565b7f45524332303a20696e76616c696420646563696d616c730000000000000000005f82015250565b5f612485601783611a00565b915061249082612451565b602082019050919050565b5f6020820190508181035f8301526124b281612479565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026125157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826124da565b61251f86836124da565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61255a61255561255084611ae0565b612537565b611ae0565b9050919050565b5f819050919050565b61257383612540565b61258761257f82612561565b8484546124e6565b825550505050565b5f90565b61259b61258f565b6125a681848461256a565b505050565b5b818110156125c9576125be5f82612593565b6001810190506125ac565b5050565b601f82111561260e576125df816124b9565b6125e8846124cb565b810160208510156125f7578190505b61260b612603856124cb565b8301826125ab565b50505b505050565b5f82821c905092915050565b5f61262e5f1984600802612613565b1980831691505092915050565b5f612646838361261f565b9150826002028217905092915050565b61265f826119f6565b67ffffffffffffffff81111561267857612677611c83565b5b6126828254611ec4565b61268d8282856125cd565b5f60209050601f8311600181146126be575f84156126ac578287015190505b6126b6858261263b565b86555061271d565b601f1984166126cc866124b9565b5f5b828110156126f3578489015182556001820191506020850194506020810190506126ce565b86831015612710578489015161270c601f89168261261f565b8355505b6001600288020188555050505b505050505050565b5f6060820190508181035f83015261273d8186611a2e565b905081810360208301526127518185611a2e565b90506127606040830184611bd5565b949350505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6127c2602683611a00565b91506127cd82612768565b604082019050919050565b5f6020820190508181035f8301526127ef816127b6565b9050919050565b5f61280082611ae0565b915061280b83611ae0565b9250828201905080821115612823576128226120cd565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612883602283611a00565b915061288e82612829565b604082019050919050565b5f6020820190508181035f8301526128b081612877565b905091905056fea2646970667358221220f22bfbc448609bcd136785670890864ceedf5d114befddf5bb844bf11a1cc3be64736f6c63430008190033", } // Erc20ABI is the input ABI used to generate the binding from. @@ -866,6 +866,142 @@ func (_Erc20 *Erc20Filterer) ParseApproval(log types.Log) (*Erc20Approval, error return event, nil } +// Erc20MetadataUpdatedIterator is returned from FilterMetadataUpdated and is used to iterate over the raw logs and unpacked data for MetadataUpdated events raised by the Erc20 contract. +type Erc20MetadataUpdatedIterator struct { + Event *Erc20MetadataUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc20MetadataUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc20MetadataUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc20MetadataUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc20MetadataUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc20MetadataUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc20MetadataUpdated represents a MetadataUpdated event raised by the Erc20 contract. +type Erc20MetadataUpdated struct { + Name string + Symbol string + Decimals uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterMetadataUpdated is a free log retrieval operation binding the contract event 0x3c16037886713f9479597685e40515c99616fa75e3c2003b658c4e5457695d7d. +// +// Solidity: event MetadataUpdated(string name, string symbol, uint8 decimals) +func (_Erc20 *Erc20Filterer) FilterMetadataUpdated(opts *bind.FilterOpts) (*Erc20MetadataUpdatedIterator, error) { + + logs, sub, err := _Erc20.contract.FilterLogs(opts, "MetadataUpdated") + if err != nil { + return nil, err + } + return &Erc20MetadataUpdatedIterator{contract: _Erc20.contract, event: "MetadataUpdated", logs: logs, sub: sub}, nil +} + +// WatchMetadataUpdated is a free log subscription operation binding the contract event 0x3c16037886713f9479597685e40515c99616fa75e3c2003b658c4e5457695d7d. +// +// Solidity: event MetadataUpdated(string name, string symbol, uint8 decimals) +func (_Erc20 *Erc20Filterer) WatchMetadataUpdated(opts *bind.WatchOpts, sink chan<- *Erc20MetadataUpdated) (event.Subscription, error) { + + logs, sub, err := _Erc20.contract.WatchLogs(opts, "MetadataUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc20MetadataUpdated) + if err := _Erc20.contract.UnpackLog(event, "MetadataUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseMetadataUpdated is a log parse operation binding the contract event 0x3c16037886713f9479597685e40515c99616fa75e3c2003b658c4e5457695d7d. +// +// Solidity: event MetadataUpdated(string name, string symbol, uint8 decimals) +func (_Erc20 *Erc20Filterer) ParseMetadataUpdated(log types.Log) (*Erc20MetadataUpdated, error) { + event := new(Erc20MetadataUpdated) + if err := _Erc20.contract.UnpackLog(event, "MetadataUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // Erc20OwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Erc20 contract. type Erc20OwnershipTransferredIterator struct { Event *Erc20OwnershipTransferred // Event containing the contract specifics and raw log diff --git a/x/evm/contracts/erc20/ERC20.sol b/x/evm/contracts/erc20/ERC20.sol index 861464b..3ce5d83 100644 --- a/x/evm/contracts/erc20/ERC20.sol +++ b/x/evm/contracts/erc20/ERC20.sol @@ -39,7 +39,12 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { } // for custom erc20s, you should add `register_erc20` modifier to the constructor - constructor(string memory _name, string memory _symbol, uint8 _decimals, bool _metadataSealed) { + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals, + bool _metadataSealed + ) { name = _name; symbol = _symbol; decimals = _decimals; @@ -51,7 +56,10 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { address recipient, uint256 amount ) internal register_erc20_store(recipient) { - require(balanceOf[sender] >= amount, "ERC20: transfer amount exceeds balance"); + require( + balanceOf[sender] >= amount, + "ERC20: transfer amount exceeds balance" + ); balanceOf[sender] -= amount; balanceOf[recipient] += amount; emit Transfer(sender, recipient, amount); @@ -67,7 +75,10 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { } function _burn(address from, uint256 amount) internal { - require(balanceOf[from] >= amount, "ERC20: burn amount exceeds balance"); + require( + balanceOf[from] >= amount, + "ERC20: burn amount exceeds balance" + ); balanceOf[from] -= amount; totalSupply -= amount; emit Transfer(from, address(0), amount); @@ -92,7 +103,10 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { address recipient, uint256 amount ) external transferable(recipient) returns (bool) { - require(allowance[sender][msg.sender] >= amount, "ERC20: transfer amount exceeds allowance"); + require( + allowance[sender][msg.sender] >= amount, + "ERC20: transfer amount exceeds allowance" + ); allowance[sender][msg.sender] -= amount; _transfer(sender, recipient, amount); return true; @@ -102,9 +116,7 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { _mint(to, amount); } - function burn( - uint256 amount - ) external burnable(msg.sender) { + function burn(uint256 amount) external burnable(msg.sender) { _burn(msg.sender, amount); } @@ -112,7 +124,10 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { address from, uint256 amount ) external burnable(from) returns (bool) { - require(allowance[from][msg.sender] >= amount, "ERC20: burn amount exceeds allowance"); + require( + allowance[from][msg.sender] >= amount, + "ERC20: burn amount exceeds allowance" + ); allowance[from][msg.sender] -= amount; _burn(from, amount); return true; @@ -138,18 +153,29 @@ contract ERC20 is IERC20, Ownable, ERC20Registry, ERC165, ERC20ACL { // ERC20 Metadata onetime setters only for authority(gov) // + event MetadataUpdated(string name, string symbol, uint8 decimals); + + /// @notice Allows one-time update of token metadata by authority + /// @dev Only callable when metadata is not sealed and by authority + /// @param _name New token name + /// @param _symbol New token symbol + /// @param _decimals New decimal places function updateMetadata( string memory _name, string memory _symbol, uint8 _decimals ) external onlyAuthority { require(!metadataSealed, "ERC20: metadata sealed"); + require(bytes(_name).length > 0, "ERC20: empty name"); + require(bytes(_symbol).length > 0, "ERC20: empty symbol"); + require(_decimals <= 18, "ERC20: invalid decimals"); - name = _name; - symbol = _symbol; - decimals = _decimals; + // Update all fields at once to save gas + (name, symbol, decimals) = (_name, _symbol, _decimals); // seal the metadata to prevent further updates metadataSealed = true; + + emit MetadataUpdated(_name, _symbol, _decimals); } } diff --git a/x/evm/contracts/erc20_factory/ERC20Factory.go b/x/evm/contracts/erc20_factory/ERC20Factory.go index 2516d7e..e152b0b 100644 --- a/x/evm/contracts/erc20_factory/ERC20Factory.go +++ b/x/evm/contracts/erc20_factory/ERC20Factory.go @@ -32,7 +32,7 @@ var ( // Erc20FactoryMetaData contains all meta data concerning the Erc20Factory contract. var Erc20FactoryMetaData = &bind.MetaData{ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"erc20\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC20Created\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createERC20\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052348015600e575f80fd5b506132468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612c63806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612c63380380612c6383398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b61265a806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611880565b6103f6565b60405161015591906118c5565b60405180910390f35b61016661046f565b604051610173919061194e565b60405180910390f35b610196600480360381019061019191906119fb565b6104fb565b6040516101a391906118c5565b60405180910390f35b6101b46105e8565b6040516101c19190611a48565b60405180910390f35b6101e460048036038101906101df9190611a61565b6105ee565b005b61020060048036038101906101fb9190611a61565b61066d565b60405161020d91906118c5565b60405180910390f35b610230600480360381019061022b91906119fb565b610888565b005b61023a610905565b6040516102479190611acc565b60405180910390f35b61026a600480360381019061026591906119fb565b610917565b005b61028660048036038101906102819190611ae5565b610a36565b005b6102a2600480360381019061029d9190611b10565b610afe565b6040516102af9190611a48565b60405180910390f35b6102d260048036038101906102cd91906119fb565b610b13565b6040516102df91906118c5565b60405180910390f35b6102f0610d2c565b6040516102fd9190611b4a565b60405180910390f35b61030e610d4f565b60405161031b919061194e565b60405180910390f35b61033e60048036038101906103399190611cb9565b610ddb565b005b61035a600480360381019061035591906119fb565b610f3b565b60405161036791906118c5565b60405180910390f35b61038a60048036038101906103859190611d41565b61100c565b6040516103979190611a48565b60405180910390f35b6103ba60048036038101906103b59190611b10565b61102c565b005b6103c4611174565b6040516103d191906118c5565b60405180910390f35b6103f460048036038101906103ef91906119fb565b611186565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610468575061046782611203565b5b9050919050565b6003805461047c90611dac565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611dac565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611a48565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611e26565b60405180910390fd5b61066883838361126c565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611b4a565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611e6e565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90611f09565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da90611f97565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a9190611fe2565b9250508190555061087c85858561126c565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611e26565b60405180910390fd5b61090182826114f7565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611b4a565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611e6e565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c89061205f565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a3183836114f7565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611b4a565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611e6e565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906120c7565b60405180910390fd5b610afa33836116c6565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611b4a565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611e6e565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906120c7565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612155565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d109190611fe2565b92505081905550610d2184846116c6565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611dac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611dac565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611b4a565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611e6e565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906121e3565b60405180910390fd5b60075f9054906101000a900460ff1615610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed99061224b565b60405180910390fd5b8260039081610ef19190612406565b508160049081610f019190612406565b508060055f6101000a81548160ff021916908360ff160217905550600160075f6101000a81548160ff021916908315150217905550505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b8152600401610f779190611b4a565b602060405180830381865afa158015610f92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb69190611e6e565b15610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed90611f09565b60405180910390fd5b61100133858561126c565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611082575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110b9575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075f9054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90611e26565b60405180910390fd5b6111ff82826116c6565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016112a79190611b4a565b602060405180830381865afa1580156112c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e69190611e6e565b6113665760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016113249190611b4a565b6020604051808303815f875af1158015611340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113649190611e6e565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612545565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114329190611fe2565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546114859190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e99190611a48565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016115329190611b4a565b602060405180830381865afa15801561154d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115719190611e6e565b6115f15760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016115af9190611b4a565b6020604051808303815f875af11580156115cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ef9190611e6e565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461163d9190612563565b925050819055508160065f8282546116559190612563565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116b99190611a48565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d90612606565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117929190611fe2565b925050819055508060065f8282546117aa9190611fe2565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161180e9190611a48565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61185f8161182b565b8114611869575f80fd5b50565b5f8135905061187a81611856565b92915050565b5f6020828403121561189557611894611823565b5b5f6118a28482850161186c565b91505092915050565b5f8115159050919050565b6118bf816118ab565b82525050565b5f6020820190506118d85f8301846118b6565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611920826118de565b61192a81856118e8565b935061193a8185602086016118f8565b61194381611906565b840191505092915050565b5f6020820190508181035f8301526119668184611916565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119978261196e565b9050919050565b6119a78161198d565b81146119b1575f80fd5b50565b5f813590506119c28161199e565b92915050565b5f819050919050565b6119da816119c8565b81146119e4575f80fd5b50565b5f813590506119f5816119d1565b92915050565b5f8060408385031215611a1157611a10611823565b5b5f611a1e858286016119b4565b9250506020611a2f858286016119e7565b9150509250929050565b611a42816119c8565b82525050565b5f602082019050611a5b5f830184611a39565b92915050565b5f805f60608486031215611a7857611a77611823565b5b5f611a85868287016119b4565b9350506020611a96868287016119b4565b9250506040611aa7868287016119e7565b9150509250925092565b5f60ff82169050919050565b611ac681611ab1565b82525050565b5f602082019050611adf5f830184611abd565b92915050565b5f60208284031215611afa57611af9611823565b5b5f611b07848285016119e7565b91505092915050565b5f60208284031215611b2557611b24611823565b5b5f611b32848285016119b4565b91505092915050565b611b448161198d565b82525050565b5f602082019050611b5d5f830184611b3b565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611ba182611906565b810181811067ffffffffffffffff82111715611bc057611bbf611b6b565b5b80604052505050565b5f611bd261181a565b9050611bde8282611b98565b919050565b5f67ffffffffffffffff821115611bfd57611bfc611b6b565b5b611c0682611906565b9050602081019050919050565b828183375f83830152505050565b5f611c33611c2e84611be3565b611bc9565b905082815260208101848484011115611c4f57611c4e611b67565b5b611c5a848285611c13565b509392505050565b5f82601f830112611c7657611c75611b63565b5b8135611c86848260208601611c21565b91505092915050565b611c9881611ab1565b8114611ca2575f80fd5b50565b5f81359050611cb381611c8f565b92915050565b5f805f60608486031215611cd057611ccf611823565b5b5f84013567ffffffffffffffff811115611ced57611cec611827565b5b611cf986828701611c62565b935050602084013567ffffffffffffffff811115611d1a57611d19611827565b5b611d2686828701611c62565b9250506040611d3786828701611ca5565b9150509250925092565b5f8060408385031215611d5757611d56611823565b5b5f611d64858286016119b4565b9250506020611d75858286016119b4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611dc357607f821691505b602082108103611dd657611dd5611d7f565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611e10601e836118e8565b9150611e1b82611ddc565b602082019050919050565b5f6020820190508181035f830152611e3d81611e04565b9050919050565b611e4d816118ab565b8114611e57575f80fd5b50565b5f81519050611e6881611e44565b92915050565b5f60208284031215611e8357611e82611823565b5b5f611e9084828501611e5a565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611ef36022836118e8565b9150611efe82611e99565b604082019050919050565b5f6020820190508181035f830152611f2081611ee7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f611f816028836118e8565b9150611f8c82611f27565b604082019050919050565b5f6020820190508181035f830152611fae81611f75565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fec826119c8565b9150611ff7836119c8565b925082820390508181111561200f5761200e611fb5565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612049601e836118e8565b915061205482612015565b602082019050919050565b5f6020820190508181035f8301526120768161203d565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6120b1601f836118e8565b91506120bc8261207d565b602082019050919050565b5f6020820190508181035f8301526120de816120a5565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f61213f6024836118e8565b915061214a826120e5565b604082019050919050565b5f6020820190508181035f83015261216c81612133565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121cd6022836118e8565b91506121d882612173565b604082019050919050565b5f6020820190508181035f8301526121fa816121c1565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f6122356016836118e8565b915061224082612201565b602082019050919050565b5f6020820190508181035f83015261226281612229565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261228a565b6122cf868361228a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61230a612305612300846119c8565b6122e7565b6119c8565b9050919050565b5f819050919050565b612323836122f0565b61233761232f82612311565b848454612296565b825550505050565b5f90565b61234b61233f565b61235681848461231a565b505050565b5b818110156123795761236e5f82612343565b60018101905061235c565b5050565b601f8211156123be5761238f81612269565b6123988461227b565b810160208510156123a7578190505b6123bb6123b38561227b565b83018261235b565b50505b505050565b5f82821c905092915050565b5f6123de5f19846008026123c3565b1980831691505092915050565b5f6123f683836123cf565b9150826002028217905092915050565b61240f826118de565b67ffffffffffffffff81111561242857612427611b6b565b5b6124328254611dac565b61243d82828561237d565b5f60209050601f83116001811461246e575f841561245c578287015190505b61246685826123eb565b8655506124cd565b601f19841661247c86612269565b5f5b828110156124a35784890151825560018201915060208501945060208101905061247e565b868310156124c057848901516124bc601f8916826123cf565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f61252f6026836118e8565b915061253a826124d5565b604082019050919050565b5f6020820190508181035f83015261255c81612523565b9050919050565b5f61256d826119c8565b9150612578836119c8565b92508282019050808211156125905761258f611fb5565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6125f06022836118e8565b91506125fb82612596565b604082019050919050565b5f6020820190508181035f83015261261d816125e4565b905091905056fea2646970667358221220a8c6f2a48c1cd1f65560869388d6004ad6733f5d21b0ba53ca1e18211043321b64736f6c63430008190033a264697066735822122063b20a0ed96d729ed2493dd3d39e577251ffee68dcb1ca1dbc5413dcb3c5006e64736f6c63430008190033", + Bin: "0x6080604052348015600e575f80fd5b506134d98061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c806306ef1a861461002d575b5f80fd5b6100476004803603810190610042919061039e565b61005d565b6040516100549190610465565b60405180910390f35b5f80848484600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141560405161009f9061020e565b6100ac9493929190610507565b604051809103905ff0801580156100c5573d5f803e3d5ffd5b50905060f273ffffffffffffffffffffffffffffffffffffffff1663d126274a826040518263ffffffff1660e01b81526004016101029190610465565b6020604051808303815f875af115801561011e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610582565b508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b336040518263ffffffff1660e01b815260040161017c9190610465565b5f604051808303815f87803b158015610193575f80fd5b505af11580156101a5573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f85e892981b234101136bc30081e0a5c44345bebc0940193230c20a43b279e2d160405160405180910390a3809150509392505050565b612ef6806105ae83390190565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027a82610234565b810181811067ffffffffffffffff8211171561029957610298610244565b5b80604052505050565b5f6102ab61021b565b90506102b78282610271565b919050565b5f67ffffffffffffffff8211156102d6576102d5610244565b5b6102df82610234565b9050602081019050919050565b828183375f83830152505050565b5f61030c610307846102bc565b6102a2565b90508281526020810184848401111561032857610327610230565b5b6103338482856102ec565b509392505050565b5f82601f83011261034f5761034e61022c565b5b813561035f8482602086016102fa565b91505092915050565b5f60ff82169050919050565b61037d81610368565b8114610387575f80fd5b50565b5f8135905061039881610374565b92915050565b5f805f606084860312156103b5576103b4610224565b5b5f84013567ffffffffffffffff8111156103d2576103d1610228565b5b6103de8682870161033b565b935050602084013567ffffffffffffffff8111156103ff576103fe610228565b5b61040b8682870161033b565b925050604061041c8682870161038a565b9150509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61044f82610426565b9050919050565b61045f81610445565b82525050565b5f6020820190506104785f830184610456565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6104b08261047e565b6104ba8185610488565b93506104ca818560208601610498565b6104d381610234565b840191505092915050565b6104e781610368565b82525050565b5f8115159050919050565b610501816104ed565b82525050565b5f6080820190508181035f83015261051f81876104a6565b9050818103602083015261053381866104a6565b905061054260408301856104de565b61054f60608301846104f8565b95945050505050565b610561816104ed565b811461056b575f80fd5b50565b5f8151905061057c81610558565b92915050565b5f6020828403121561059757610596610224565b5b5f6105a48482850161056e565b9150509291505056fe608060405234801561000f575f80fd5b50604051612ef6380380612ef683398181016040528101906100319190610284565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836003908161007f919061052d565b50826004908161008f919061052d565b508160055f6101000a81548160ff021916908360ff1602179055508060075f6101000a81548160ff021916908315150217905550505050506105fc565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61012b826100e5565b810181811067ffffffffffffffff8211171561014a576101496100f5565b5b80604052505050565b5f61015c6100cc565b90506101688282610122565b919050565b5f67ffffffffffffffff821115610187576101866100f5565b5b610190826100e5565b9050602081019050919050565b8281835e5f83830152505050565b5f6101bd6101b88461016d565b610153565b9050828152602081018484840111156101d9576101d86100e1565b5b6101e484828561019d565b509392505050565b5f82601f830112610200576101ff6100dd565b5b81516102108482602086016101ab565b91505092915050565b5f60ff82169050919050565b61022e81610219565b8114610238575f80fd5b50565b5f8151905061024981610225565b92915050565b5f8115159050919050565b6102638161024f565b811461026d575f80fd5b50565b5f8151905061027e8161025a565b92915050565b5f805f806080858703121561029c5761029b6100d5565b5b5f85015167ffffffffffffffff8111156102b9576102b86100d9565b5b6102c5878288016101ec565b945050602085015167ffffffffffffffff8111156102e6576102e56100d9565b5b6102f2878288016101ec565b93505060406103038782880161023b565b925050606061031487828801610270565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061036e57607f821691505b6020821081036103815761038061032a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103a8565b6103ed86836103a8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61043161042c61042784610405565b61040e565b610405565b9050919050565b5f819050919050565b61044a83610417565b61045e61045682610438565b8484546103b4565b825550505050565b5f90565b610472610466565b61047d818484610441565b505050565b5b818110156104a0576104955f8261046a565b600181019050610483565b5050565b601f8211156104e5576104b681610387565b6104bf84610399565b810160208510156104ce578190505b6104e26104da85610399565b830182610482565b50505b505050565b5f82821c905092915050565b5f6105055f19846008026104ea565b1980831691505092915050565b5f61051d83836104f6565b9150826002028217905092915050565b61053682610320565b67ffffffffffffffff81111561054f5761054e6100f5565b5b6105598254610357565b6105648282856104a4565b5f60209050601f831160018114610595575f8415610583578287015190505b61058d8582610512565b8655506105f4565b601f1984166105a386610387565b5f5b828110156105ca578489015182556001820191506020850194506020810190506105a5565b868310156105e757848901516105e3601f8916826104f6565b8355505b6001600288020188555050505b505050505050565b6128ed806106095f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a9059cbb1161006f578063a9059cbb14610340578063dd62ed3e14610370578063f2fde38b146103a0578063f5daf8ff146103bc578063fe1195ec146103da5761012a565b806370a082311461028857806379cc6790146102b85780638da5cb5b146102e857806395d89b41146103065780639f191484146103245761012a565b806323b872dd116100f257806323b872dd146101e65780632d688ca814610216578063313ce5671461023257806340c10f191461025057806342966c681461026c5761012a565b806301ffc9a71461012e57806306fdde031461015e578063095ea7b31461017c57806318160ddd146101ac5780631988513b146101ca575b5f80fd5b61014860048036038101906101439190611998565b6103f6565b60405161015591906119dd565b60405180910390f35b61016661046f565b6040516101739190611a66565b60405180910390f35b61019660048036038101906101919190611b13565b6104fb565b6040516101a391906119dd565b60405180910390f35b6101b46105e8565b6040516101c19190611b60565b60405180910390f35b6101e460048036038101906101df9190611b79565b6105ee565b005b61020060048036038101906101fb9190611b79565b61066d565b60405161020d91906119dd565b60405180910390f35b610230600480360381019061022b9190611b13565b610888565b005b61023a610905565b6040516102479190611be4565b60405180910390f35b61026a60048036038101906102659190611b13565b610917565b005b61028660048036038101906102819190611bfd565b610a36565b005b6102a2600480360381019061029d9190611c28565b610afe565b6040516102af9190611b60565b60405180910390f35b6102d260048036038101906102cd9190611b13565b610b13565b6040516102df91906119dd565b60405180910390f35b6102f0610d2c565b6040516102fd9190611c62565b60405180910390f35b61030e610d4f565b60405161031b9190611a66565b60405180910390f35b61033e60048036038101906103399190611dd1565b610ddb565b005b61035a60048036038101906103559190611b13565b611053565b60405161036791906119dd565b60405180910390f35b61038a60048036038101906103859190611e59565b611124565b6040516103979190611b60565b60405180910390f35b6103ba60048036038101906103b59190611c28565b611144565b005b6103c461128c565b6040516103d191906119dd565b60405180910390f35b6103f460048036038101906103ef9190611b13565b61129e565b005b5f7f8da6da19000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061046857506104678261131b565b5b9050919050565b6003805461047c90611ec4565b80601f01602080910402602001604051908101604052809291908181526020018280546104a890611ec4565b80156104f35780601f106104ca576101008083540402835291602001916104f3565b820191905f5260205f20905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105d69190611b60565b60405180910390a36001905092915050565b60065481565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461065d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065490611f3e565b60405180910390fd5b610668838383611384565b505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016106a99190611c62565b602060405180830381865afa1580156106c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e89190611f86565b15610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612021565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156107e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107da906120af565b60405180910390fd5b8260025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461086a91906120fa565b9250508190555061087c858585611384565b60019150509392505050565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90611f3e565b60405180910390fd5b610901828261160f565b5050565b60055f9054906101000a900460ff1681565b8160f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b81526004016109529190611c62565b602060405180830381865afa15801561096d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109919190611f86565b156109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c890612177565b60405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a27575f80fd5b610a31838361160f565b505050565b3360f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610a719190611c62565b602060405180830381865afa158015610a8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190611f86565b15610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906121df565b60405180910390fd5b610afa33836117de565b5050565b6001602052805f5260405f205f915090505481565b5f8260f173ffffffffffffffffffffffffffffffffffffffff166360dc402f826040518263ffffffff1660e01b8152600401610b4f9190611c62565b602060405180830381865afa158015610b6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8e9190611f86565b15610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906121df565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061226d565b60405180910390fd5b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d1091906120fa565b92505081905550610d2184846117de565b600191505092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60048054610d5c90611ec4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8890611ec4565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b505050505081565b60f173ffffffffffffffffffffffffffffffffffffffff166301116078336040518263ffffffff1660e01b8152600401610e159190611c62565b602060405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e549190611f86565b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a906122fb565b60405180910390fd5b60075f9054906101000a900460ff1615610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990612363565b60405180910390fd5b5f835111610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906123cb565b60405180910390fd5b5f825111610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90612433565b60405180910390fd5b60128160ff161115610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa69061249b565b60405180910390fd5b82828260035f60045f60055f8691906101000a81548160ff021916908360ff160217905550859190509081610fe49190612656565b50849190509081610ff59190612656565b50505050600160075f6101000a81548160ff0219169083151502179055507f3c16037886713f9479597685e40515c99616fa75e3c2003b658c4e5457695d7d83838360405161104693929190612725565b60405180910390a1505050565b5f8260f173ffffffffffffffffffffffffffffffffffffffff1663f2af9ac9826040518263ffffffff1660e01b815260040161108f9190611c62565b602060405180830381865afa1580156110aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ce9190611f86565b1561110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590612021565b60405180910390fd5b611119338585611384565b600191505092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461119a575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111d1575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075f9054906101000a900460ff1681565b600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490611f3e565b60405180910390fd5b61131782826117de565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b81526004016113bf9190611c62565b602060405180830381865afa1580156113da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fe9190611f86565b61147e5760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b815260040161143c9190611c62565b6020604051808303815f875af1158015611458573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147c9190611f86565b505b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906127d8565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461154a91906120fa565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461159d91906127f6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116019190611b60565b60405180910390a350505050565b8160f273ffffffffffffffffffffffffffffffffffffffff16634e25ab64826040518263ffffffff1660e01b815260040161164a9190611c62565b602060405180830381865afa158015611665573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116899190611f86565b6117095760f273ffffffffffffffffffffffffffffffffffffffff1663ceeae52a826040518263ffffffff1660e01b81526004016116c79190611c62565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190611f86565b505b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461175591906127f6565b925050819055508160065f82825461176d91906127f6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117d19190611b60565b60405180910390a3505050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590612899565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546118aa91906120fa565b925050819055508060065f8282546118c291906120fa565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119269190611b60565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61197781611943565b8114611981575f80fd5b50565b5f813590506119928161196e565b92915050565b5f602082840312156119ad576119ac61193b565b5b5f6119ba84828501611984565b91505092915050565b5f8115159050919050565b6119d7816119c3565b82525050565b5f6020820190506119f05f8301846119ce565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611a38826119f6565b611a428185611a00565b9350611a52818560208601611a10565b611a5b81611a1e565b840191505092915050565b5f6020820190508181035f830152611a7e8184611a2e565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611aaf82611a86565b9050919050565b611abf81611aa5565b8114611ac9575f80fd5b50565b5f81359050611ada81611ab6565b92915050565b5f819050919050565b611af281611ae0565b8114611afc575f80fd5b50565b5f81359050611b0d81611ae9565b92915050565b5f8060408385031215611b2957611b2861193b565b5b5f611b3685828601611acc565b9250506020611b4785828601611aff565b9150509250929050565b611b5a81611ae0565b82525050565b5f602082019050611b735f830184611b51565b92915050565b5f805f60608486031215611b9057611b8f61193b565b5b5f611b9d86828701611acc565b9350506020611bae86828701611acc565b9250506040611bbf86828701611aff565b9150509250925092565b5f60ff82169050919050565b611bde81611bc9565b82525050565b5f602082019050611bf75f830184611bd5565b92915050565b5f60208284031215611c1257611c1161193b565b5b5f611c1f84828501611aff565b91505092915050565b5f60208284031215611c3d57611c3c61193b565b5b5f611c4a84828501611acc565b91505092915050565b611c5c81611aa5565b82525050565b5f602082019050611c755f830184611c53565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611cb982611a1e565b810181811067ffffffffffffffff82111715611cd857611cd7611c83565b5b80604052505050565b5f611cea611932565b9050611cf68282611cb0565b919050565b5f67ffffffffffffffff821115611d1557611d14611c83565b5b611d1e82611a1e565b9050602081019050919050565b828183375f83830152505050565b5f611d4b611d4684611cfb565b611ce1565b905082815260208101848484011115611d6757611d66611c7f565b5b611d72848285611d2b565b509392505050565b5f82601f830112611d8e57611d8d611c7b565b5b8135611d9e848260208601611d39565b91505092915050565b611db081611bc9565b8114611dba575f80fd5b50565b5f81359050611dcb81611da7565b92915050565b5f805f60608486031215611de857611de761193b565b5b5f84013567ffffffffffffffff811115611e0557611e0461193f565b5b611e1186828701611d7a565b935050602084013567ffffffffffffffff811115611e3257611e3161193f565b5b611e3e86828701611d7a565b9250506040611e4f86828701611dbd565b9150509250925092565b5f8060408385031215611e6f57611e6e61193b565b5b5f611e7c85828601611acc565b9250506020611e8d85828601611acc565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611edb57607f821691505b602082108103611eee57611eed611e97565b5b50919050565b7f45524332303a2063616c6c6572206973206e6f742074686520636861696e00005f82015250565b5f611f28601e83611a00565b9150611f3382611ef4565b602082019050919050565b5f6020820190508181035f830152611f5581611f1c565b9050919050565b611f65816119c3565b8114611f6f575f80fd5b50565b5f81519050611f8081611f5c565b92915050565b5f60208284031215611f9b57611f9a61193b565b5b5f611fa884828501611f72565b91505092915050565b7f45524332303a207472616e7366657220746f20626c6f636b65642061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61200b602283611a00565b915061201682611fb1565b604082019050919050565b5f6020820190508181035f83015261203881611fff565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f612099602883611a00565b91506120a48261203f565b604082019050919050565b5f6020820190508181035f8301526120c68161208d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61210482611ae0565b915061210f83611ae0565b9250828203905081811115612127576121266120cd565b5b92915050565b7f45524332303a206d696e7420746f20626c6f636b6564206164647265737300005f82015250565b5f612161601e83611a00565b915061216c8261212d565b602082019050919050565b5f6020820190508181035f83015261218e81612155565b9050919050565b7f45524332303a206275726e2066726f6d206d6f64756c652061646472657373005f82015250565b5f6121c9601f83611a00565b91506121d482612195565b602082019050919050565b5f6020820190508181035f8301526121f6816121bd565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f612257602483611a00565b9150612262826121fd565b604082019050919050565b5f6020820190508181035f8301526122848161224b565b9050919050565b7f45524332303a2063616c6c6572206973206e6f742074686520617574686f72695f8201527f7479000000000000000000000000000000000000000000000000000000000000602082015250565b5f6122e5602283611a00565b91506122f08261228b565b604082019050919050565b5f6020820190508181035f830152612312816122d9565b9050919050565b7f45524332303a206d65746164617461207365616c6564000000000000000000005f82015250565b5f61234d601683611a00565b915061235882612319565b602082019050919050565b5f6020820190508181035f83015261237a81612341565b9050919050565b7f45524332303a20656d707479206e616d650000000000000000000000000000005f82015250565b5f6123b5601183611a00565b91506123c082612381565b602082019050919050565b5f6020820190508181035f8301526123e2816123a9565b9050919050565b7f45524332303a20656d7074792073796d626f6c000000000000000000000000005f82015250565b5f61241d601383611a00565b9150612428826123e9565b602082019050919050565b5f6020820190508181035f83015261244a81612411565b9050919050565b7f45524332303a20696e76616c696420646563696d616c730000000000000000005f82015250565b5f612485601783611a00565b915061249082612451565b602082019050919050565b5f6020820190508181035f8301526124b281612479565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026125157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826124da565b61251f86836124da565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61255a61255561255084611ae0565b612537565b611ae0565b9050919050565b5f819050919050565b61257383612540565b61258761257f82612561565b8484546124e6565b825550505050565b5f90565b61259b61258f565b6125a681848461256a565b505050565b5b818110156125c9576125be5f82612593565b6001810190506125ac565b5050565b601f82111561260e576125df816124b9565b6125e8846124cb565b810160208510156125f7578190505b61260b612603856124cb565b8301826125ab565b50505b505050565b5f82821c905092915050565b5f61262e5f1984600802612613565b1980831691505092915050565b5f612646838361261f565b9150826002028217905092915050565b61265f826119f6565b67ffffffffffffffff81111561267857612677611c83565b5b6126828254611ec4565b61268d8282856125cd565b5f60209050601f8311600181146126be575f84156126ac578287015190505b6126b6858261263b565b86555061271d565b601f1984166126cc866124b9565b5f5b828110156126f3578489015182556001820191506020850194506020810190506126ce565b86831015612710578489015161270c601f89168261261f565b8355505b6001600288020188555050505b505050505050565b5f6060820190508181035f83015261273d8186611a2e565b905081810360208301526127518185611a2e565b90506127606040830184611bd5565b949350505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6127c2602683611a00565b91506127cd82612768565b604082019050919050565b5f6020820190508181035f8301526127ef816127b6565b9050919050565b5f61280082611ae0565b915061280b83611ae0565b9250828201905080821115612823576128226120cd565b5b92915050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612883602283611a00565b915061288e82612829565b604082019050919050565b5f6020820190508181035f8301526128b081612877565b905091905056fea2646970667358221220f22bfbc448609bcd136785670890864ceedf5d114befddf5bb844bf11a1cc3be64736f6c63430008190033a26469706673582212203d9e7c8dfa1f153ff1f24ffc566813a6c8b71a7049eba493e4f9c90223c32aa864736f6c63430008190033", } // Erc20FactoryABI is the input ABI used to generate the binding from. diff --git a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go index 6e68493..22a9b95 100644 --- a/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go +++ b/x/evm/contracts/erc20_wrapper/ERC20Wrapper.go @@ -32,7 +32,7 @@ var ( // Erc20WrapperMetaData contains all meta data concerning the Erc20Wrapper contract. var Erc20WrapperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"erc20Factory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"StringsInsufficientHexLength\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contractERC20Factory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"ibc_ack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"callback_id\",\"type\":\"uint64\"}],\"name\":\"ibc_timeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"originToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wrappedAmt\",\"type\":\"uint256\"}],\"name\":\"unwrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"channel\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"wrap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea2646970667358221220d103039d204e43b370e928a286653a17efd833afe3cacd01f6f8b918b0be85e764736f6c63430008190033", + Bin: "0x60a06040525f8060146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550348015610037575f80fd5b50604051612d24380380612d2483398181016040528101906100599190610130565b335f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505061015b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ff826100d6565b9050919050565b61010f816100f5565b8114610119575f80fd5b50565b5f8151905061012a81610106565b92915050565b5f60208284031215610145576101446100d2565b5b5f6101528482850161011c565b91505092915050565b608051612baa61017a5f395f81816109a70152610fd00152612baa5ff3fe608060405234801561000f575f80fd5b5060043610610091575f3560e01c80638da5cb5b116100645780638da5cb5b146101195780639a11143214610137578063c45a015514610153578063d5c6b50414610171578063f2fde38b146101a157610091565b806301ffc9a7146100955780630d4f1f9d146100c557806331a503f0146100e15780638cc7104f146100fd575b5f80fd5b6100af60048036038101906100aa91906118d6565b6101bd565b6040516100bc919061191b565b60405180910390f35b6100df60048036038101906100da919061199b565b610226565b005b6100fb60048036038101906100f691906119d9565b6102a7565b005b61011760048036038101906101129190611a91565b610321565b005b610121610569565b60405161012e9190611af0565b60405180910390f35b610151600480360381019061014c9190611c45565b61058c565b005b61015b6109a5565b6040516101689190611d4f565b60405180910390f35b61018b60048036038101906101869190611d68565b6109c9565b6040516101989190611af0565b60405180910390f35b6101bb60048036038101906101b69190611d68565b6109f9565b005b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b90611e13565b60405180910390fd5b806102a3576102a282610b41565b5b5050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030c90611e13565b60405180910390fd5b61031e81610b41565b50565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166379cc679033846040518363ffffffff1660e01b815260040161042a929190611ea8565b6020604051808303815f875af1158015610446573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046a9190611ee3565b505f6104e48360068773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104df9190611f44565b610e6f565b90508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610521929190611ea8565b6020604051808303815f875af115801561053d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105619190611ee3565b505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61059584610f3e565b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016105d293929190611f6f565b6020604051808303815f875af11580156105ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106129190611ee3565b505f61068c838673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106859190611f44565b6006610e6f565b905060015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401610725929190611ea8565b5f604051808303815f87803b15801561073c575f80fd5b505af115801561074e573d5f803e3d5ffd5b5050505060015f60148282829054906101000a900467ffffffffffffffff166107779190611fd1565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018281525060025f8060149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050505f61091f8760015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848689611278565b905060f173ffffffffffffffffffffffffffffffffffffffff1663d46f64e6826040518263ffffffff1660e01b815260040161095b919061205c565b6020604051808303815f875af1158015610977573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099b9190611ee3565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a4f575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a86575f80fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60025f8367ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152505090505f60015f836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090611e7b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342966c6883604001516040518263ffffffff1660e01b8152600401610d36919061207c565b5f604051808303815f87803b158015610d4d575f80fd5b505af1158015610d5f573d5f803e3d5ffd5b505050505f610de483604001516006856020015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddf9190611f44565b610e6f565b9050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb845f0151836040518363ffffffff1660e01b8152600401610e28929190611ea8565b6020604051808303815f875af1158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611ee3565b5050505050565b5f8160ff168360ff161115610eb0575f8284610e8b9190612095565b60ff16600a610e9a91906121f8565b90508085610ea8919061226f565b915050610ef5565b8160ff168360ff161015610ef0575f8383610ecb9190612095565b60ff16600a610eda91906121f8565b90508085610ee8919061229f565b915050610ef4565b8390505b5b5f8103610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061232a565b60405180910390fd5b9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff1660015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611275575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306ef1a866040518060400160405280600781526020017f57726170706564000000000000000000000000000000000000000000000000008152508473ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110b091906123b6565b6040516020016110c1929190612437565b6040516020818303038152906040526040518060400160405280600181526020017f57000000000000000000000000000000000000000000000000000000000000008152508573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561114e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061117691906123b6565b604051602001611187929190612437565b60405160208183030381529060405260066040518463ffffffff1660e01b81526004016111b693929190612469565b6020604051808303815f875af11580156111d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f691906124c0565b90508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50565b60608560f173ffffffffffffffffffffffffffffffffffffffff166381cf0f6a876040518263ffffffff1660e01b81526004016112b59190611af0565b5f604051808303815f875af11580156112d0573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112f891906123b6565b611301866113ea565b60f173ffffffffffffffffffffffffffffffffffffffff16636af32a55306040518263ffffffff1660e01b815260040161133b9190611af0565b5f604051808303815f875af1158015611356573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061137e91906123b6565b85611388886113ea565b6113b05f60149054906101000a900467ffffffffffffffff1667ffffffffffffffff166113ea565b6113b9306114b4565b6040516020016113d098979695949392919061298f565b604051602081830303815290604052905095945050505050565b60605f60016113f8846114e1565b0190505f8167ffffffffffffffff81111561141657611415611b21565b5b6040519080825280601f01601f1916602001820160405280156114485781602001600182028036833780820191505090505b5090505f82602001820190505b6001156114a9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161149e5761149d612242565b5b0494505f8503611455575b819350505050919050565b60606114da8273ffffffffffffffffffffffffffffffffffffffff16601460ff16611632565b9050919050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061153d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161153357611532612242565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061157a576d04ee2d6d415b85acef810000000083816115705761156f612242565b5b0492506020810190505b662386f26fc1000083106115a957662386f26fc10000838161159f5761159e612242565b5b0492506010810190505b6305f5e10083106115d2576305f5e10083816115c8576115c7612242565b5b0492506008810190505b61271083106115f75761271083816115ed576115ec612242565b5b0492506004810190505b6064831061161a57606483816116105761160f612242565b5b0492506002810190505b600a8310611629576001810190505b80915050919050565b60605f8390505f6002846002611648919061229f565b6116529190612ac6565b67ffffffffffffffff81111561166b5761166a611b21565b5b6040519080825280601f01601f19166020018201604052801561169d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106116d4576116d3612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061173757611736612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001856002611775919061229f565b61177f9190612ac6565b90505b600181111561181e577f3031323334353637383961626364656600000000000000000000000000000000600f8416601081106117c1576117c0612af9565b5b1a60f81b8282815181106117d8576117d7612af9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600483901c92508061181790612b26565b9050611782565b505f82146118655784846040517fe22e27eb00000000000000000000000000000000000000000000000000000000815260040161185c929190612b4d565b60405180910390fd5b809250505092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b581611881565b81146118bf575f80fd5b50565b5f813590506118d0816118ac565b92915050565b5f602082840312156118eb576118ea611879565b5b5f6118f8848285016118c2565b91505092915050565b5f8115159050919050565b61191581611901565b82525050565b5f60208201905061192e5f83018461190c565b92915050565b5f67ffffffffffffffff82169050919050565b61195081611934565b811461195a575f80fd5b50565b5f8135905061196b81611947565b92915050565b61197a81611901565b8114611984575f80fd5b50565b5f8135905061199581611971565b92915050565b5f80604083850312156119b1576119b0611879565b5b5f6119be8582860161195d565b92505060206119cf85828601611987565b9150509250929050565b5f602082840312156119ee576119ed611879565b5b5f6119fb8482850161195d565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a2d82611a04565b9050919050565b611a3d81611a23565b8114611a47575f80fd5b50565b5f81359050611a5881611a34565b92915050565b5f819050919050565b611a7081611a5e565b8114611a7a575f80fd5b50565b5f81359050611a8b81611a67565b92915050565b5f805f60608486031215611aa857611aa7611879565b5b5f611ab586828701611a4a565b9350506020611ac686828701611a4a565b9250506040611ad786828701611a7d565b9150509250925092565b611aea81611a23565b82525050565b5f602082019050611b035f830184611ae1565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b5782611b11565b810181811067ffffffffffffffff82111715611b7657611b75611b21565b5b80604052505050565b5f611b88611870565b9050611b948282611b4e565b919050565b5f67ffffffffffffffff821115611bb357611bb2611b21565b5b611bbc82611b11565b9050602081019050919050565b828183375f83830152505050565b5f611be9611be484611b99565b611b7f565b905082815260208101848484011115611c0557611c04611b0d565b5b611c10848285611bc9565b509392505050565b5f82601f830112611c2c57611c2b611b09565b5b8135611c3c848260208601611bd7565b91505092915050565b5f805f805f60a08688031215611c5e57611c5d611879565b5b5f86013567ffffffffffffffff811115611c7b57611c7a61187d565b5b611c8788828901611c18565b9550506020611c9888828901611a4a565b945050604086013567ffffffffffffffff811115611cb957611cb861187d565b5b611cc588828901611c18565b9350506060611cd688828901611a7d565b9250506080611ce788828901611a7d565b9150509295509295909350565b5f819050919050565b5f611d17611d12611d0d84611a04565b611cf4565b611a04565b9050919050565b5f611d2882611cfd565b9050919050565b5f611d3982611d1e565b9050919050565b611d4981611d2f565b82525050565b5f602082019050611d625f830184611d40565b92915050565b5f60208284031215611d7d57611d7c611879565b5b5f611d8a84828501611a4a565b91505092915050565b5f82825260208201905092915050565b7f6f6e6c792074686520636f6e747261637420697473656c662063616e2063616c5f8201527f6c20746869732066756e6374696f6e0000000000000000000000000000000000602082015250565b5f611dfd602f83611d93565b9150611e0882611da3565b604082019050919050565b5f6020820190508181035f830152611e2a81611df1565b9050919050565b7f7772617070656420746f6b656e20646f65736e277420657869737400000000005f82015250565b5f611e65601b83611d93565b9150611e7082611e31565b602082019050919050565b5f6020820190508181035f830152611e9281611e59565b9050919050565b611ea281611a5e565b82525050565b5f604082019050611ebb5f830185611ae1565b611ec86020830184611e99565b9392505050565b5f81519050611edd81611971565b92915050565b5f60208284031215611ef857611ef7611879565b5b5f611f0584828501611ecf565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b8114611f2d575f80fd5b50565b5f81519050611f3e81611f1a565b92915050565b5f60208284031215611f5957611f58611879565b5b5f611f6684828501611f30565b91505092915050565b5f606082019050611f825f830186611ae1565b611f8f6020830185611ae1565b611f9c6040830184611e99565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611fdb82611934565b9150611fe683611934565b9250828201905067ffffffffffffffff81111561200657612005611fa4565b5b92915050565b5f81519050919050565b8281835e5f83830152505050565b5f61202e8261200c565b6120388185611d93565b9350612048818560208601612016565b61205181611b11565b840191505092915050565b5f6020820190508181035f8301526120748184612024565b905092915050565b5f60208201905061208f5f830184611e99565b92915050565b5f61209f82611f0e565b91506120aa83611f0e565b9250828203905060ff8111156120c3576120c2611fa4565b5b92915050565b5f8160011c9050919050565b5f808291508390505b600185111561211e578086048111156120fa576120f9611fa4565b5b60018516156121095780820291505b8081029050612117856120c9565b94506120de565b94509492505050565b5f8261213657600190506121f1565b81612143575f90506121f1565b8160018114612159576002811461216357612192565b60019150506121f1565b60ff84111561217557612174611fa4565b5b8360020a91508482111561218c5761218b611fa4565b5b506121f1565b5060208310610133831016604e8410600b84101617156121c75782820a9050838111156121c2576121c1611fa4565b5b6121f1565b6121d484848460016120d5565b925090508184048111156121eb576121ea611fa4565b5b81810290505b9392505050565b5f61220282611a5e565b915061220d83611a5e565b925061223a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612127565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61227982611a5e565b915061228483611a5e565b92508261229457612293612242565b5b828204905092915050565b5f6122a982611a5e565b91506122b483611a5e565b92508282026122c281611a5e565b915082820484148315176122d9576122d8611fa4565b5b5092915050565b7f636f6e76657274656420616d6f756e74206973207a65726f00000000000000005f82015250565b5f612314601883611d93565b915061231f826122e0565b602082019050919050565b5f6020820190508181035f83015261234181612308565b9050919050565b5f61235a61235584611b99565b611b7f565b90508281526020810184848401111561237657612375611b0d565b5b612381848285612016565b509392505050565b5f82601f83011261239d5761239c611b09565b5b81516123ad848260208601612348565b91505092915050565b5f602082840312156123cb576123ca611879565b5b5f82015167ffffffffffffffff8111156123e8576123e761187d565b5b6123f484828501612389565b91505092915050565b5f81905092915050565b5f6124118261200c565b61241b81856123fd565b935061242b818560208601612016565b80840191505092915050565b5f6124428285612407565b915061244e8284612407565b91508190509392505050565b61246381611f0e565b82525050565b5f6060820190508181035f8301526124818186612024565b905081810360208301526124958185612024565b90506124a4604083018461245a565b949350505050565b5f815190506124ba81611a34565b92915050565b5f602082840312156124d5576124d4611879565b5b5f6124e2848285016124ac565b91505092915050565b7f7b224074797065223a20222f6962632e6170706c69636174696f6e732e7472615f8201527f6e736665722e76312e4d73675472616e73666572222c00000000000000000000602082015250565b5f6125456036836123fd565b9150612550826124eb565b603682019050919050565b7f22736f757263655f706f7274223a20227472616e73666572222c0000000000005f82015250565b5f61258f601a836123fd565b915061259a8261255b565b601a82019050919050565b7f22736f757263655f6368616e6e656c223a2022000000000000000000000000005f82015250565b5f6125d96013836123fd565b91506125e4826125a5565b601382019050919050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6126236002836123fd565b915061262e826125ef565b600282019050919050565b7f22746f6b656e223a207b202264656e6f6d223a202200000000000000000000005f82015250565b5f61266d6015836123fd565b915061267882612639565b601582019050919050565b7f22616d6f756e74223a20220000000000000000000000000000000000000000005f82015250565b5f6126b7600b836123fd565b91506126c282612683565b600b82019050919050565b7f227d2c00000000000000000000000000000000000000000000000000000000005f82015250565b5f6127016003836123fd565b915061270c826126cd565b600382019050919050565b7f2273656e646572223a20220000000000000000000000000000000000000000005f82015250565b5f61274b600b836123fd565b915061275682612717565b600b82019050919050565b7f227265636569766572223a2022000000000000000000000000000000000000005f82015250565b5f612795600d836123fd565b91506127a082612761565b600d82019050919050565b7f2274696d656f75745f686569676874223a207b227265766973696f6e5f6e756d5f8201527f626572223a202230222c227265766973696f6e5f686569676874223a2022302260208201527f7d2c000000000000000000000000000000000000000000000000000000000000604082015250565b5f61282b6042836123fd565b9150612836826127ab565b604282019050919050565b7f2274696d656f75745f74696d657374616d70223a2022000000000000000000005f82015250565b5f6128756016836123fd565b915061288082612841565b601682019050919050565b7f226d656d6f223a20227b5c2265766d5c223a207b5c226173796e635f63616c6c5f8201527f6261636b5c223a207b5c2269645c223a20000000000000000000000000000000602082015250565b5f6128e56031836123fd565b91506128f08261288b565b603182019050919050565b7f2c5c22636f6e74726163745f616464726573735c223a5c2200000000000000005f82015250565b5f61292f6018836123fd565b915061293a826128fb565b601882019050919050565b7f5c227d7d7d227d000000000000000000000000000000000000000000000000005f82015250565b5f6129796007836123fd565b915061298482612945565b600782019050919050565b5f61299982612539565b91506129a482612583565b91506129af826125cd565b91506129bb828b612407565b91506129c682612617565b91506129d182612661565b91506129dd828a612407565b91506129e882612617565b91506129f3826126ab565b91506129ff8289612407565b9150612a0a826126f5565b9150612a158261273f565b9150612a218288612407565b9150612a2c82612617565b9150612a3782612789565b9150612a438287612407565b9150612a4e82612617565b9150612a598261281f565b9150612a6482612869565b9150612a708286612407565b9150612a7b82612617565b9150612a86826128d9565b9150612a928285612407565b9150612a9d82612923565b9150612aa98284612407565b9150612ab48261296d565b91508190509998505050505050505050565b5f612ad082611a5e565b9150612adb83611a5e565b9250828201905080821115612af357612af2611fa4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612b3082611a5e565b91505f8203612b4257612b41611fa4565b5b600182039050919050565b5f604082019050612b605f830185611e99565b612b6d6020830184611e99565b939250505056fea2646970667358221220d9b1dc575807a7f0f9cf1818ba3dee2c4544ac78e9af315a49035995c948ae4764736f6c63430008190033", } // Erc20WrapperABI is the input ABI used to generate the binding from. From 81ad742e47b87e12a02b11d9ea09279b73f38002 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Fri, 8 Nov 2024 22:02:27 +0900 Subject: [PATCH 9/9] return nil --- app/upgrade.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/upgrade.go b/app/upgrade.go index a7fd646..f9ca920 100644 --- a/app/upgrade.go +++ b/app/upgrade.go @@ -72,7 +72,7 @@ func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { codeHash := crypto.Keccak256Hash(code).Bytes() // iterate all erc20 contracts and replace contract code to new version - app.EVMKeeper.ERC20s.Walk(ctx, nil, func(contractAddr []byte) (bool, error) { + err = app.EVMKeeper.ERC20s.Walk(ctx, nil, func(contractAddr []byte) (bool, error) { acc := app.AccountKeeper.GetAccount(ctx, contractAddr) if acc == nil { return true, fmt.Errorf("account not found for contract address %s", contractAddr) @@ -102,6 +102,9 @@ func (app *MinitiaApp) RegisterUpgradeHandlers(cfg module.Configurator) { return false, nil }) + if err != nil { + return nil, err + } return versionMap, nil },