From 2e0f469880fd1e0c3b31aff66a6421824cbcce06 Mon Sep 17 00:00:00 2001 From: ericlee Date: Wed, 11 Dec 2024 17:55:06 +0800 Subject: [PATCH] all: implement goat features --- beacon/engine/gen_blockparams.go | 14 + beacon/engine/types.go | 4 + core/block_validator.go | 8 + core/block_validator_goat.go | 53 ++ core/chain_makers.go | 26 +- core/genesis.go | 7 +- core/genesis_goat.go | 62 ++ core/goat/mainnet.json | 151 +++++ core/goat/testnet3.json | 151 +++++ core/state_processor.go | 28 +- core/state_processor_goat.go | 196 ++++++ core/state_processor_goat_test.go | 392 ++++++++++++ core/state_transition.go | 54 +- core/state_transition_goat.go | 75 +++ core/state_transition_goat_test.go | 183 ++++++ core/testdata/goat-genesis.json | 110 ++++ .../gen_balance_change_reason_stringer.go | 18 +- core/tracing/hooks.go | 3 + core/txpool/legacypool/legacypool.go | 3 +- core/txpool/legacypool/legacypool_test.go | 2 + core/txpool/validation.go | 4 + core/types/goattypes/constant.go | 23 + core/types/goattypes/req_bridge.go | 458 ++++++++++++++ core/types/goattypes/req_bridge_test.go | 502 ++++++++++++++++ core/types/goattypes/req_locking.go | 502 ++++++++++++++++ core/types/goattypes/req_locking_test.go | 565 ++++++++++++++++++ core/types/goattypes/req_relayer.go | 130 ++++ core/types/goattypes/req_relayer_test.go | 165 +++++ core/types/goattypes/request.go | 246 ++++++++ core/types/goattypes/request_test.go | 271 +++++++++ core/types/goattypes/tx.go | 68 +++ core/types/goattypes/tx_bridge.go | 299 +++++++++ core/types/goattypes/tx_bridge_test.go | 291 +++++++++ core/types/goattypes/tx_locking.go | 174 ++++++ core/types/goattypes/tx_locking_test.go | 176 ++++++ core/types/goattypes/tx_test.go | 159 +++++ core/types/transaction.go | 2 + core/types/transaction_marshalling.go | 40 ++ core/types/transaction_signing.go | 3 + core/types/tx_goat.go | 111 ++++ core/types/tx_goat_test.go | 136 +++++ eth/catalyst/api.go | 23 +- eth/catalyst/goat.go | 11 + eth/ethconfig/config.go | 8 +- eth/tracers/internal/tracetest/goat_test.go | 7 + .../testdata/goat_call_tracer/deposit.json | 90 +++ .../testdata/goat_call_tracer/distribute.json | 112 ++++ .../goat_call_tracer/unlock-native.json | 112 ++++ .../testdata/goat_call_tracer/unlock.json | 112 ++++ eth/tracers/live/supply.go | 4 + eth/tracers/native/call.go | 50 ++ miner/miner.go | 4 +- miner/payload_building.go | 4 + miner/worker.go | 51 +- p2p/server.go | 1 + params/config.go | 7 + params/goat.go | 112 ++++ params/protocol_params.go | 2 +- 58 files changed, 6544 insertions(+), 31 deletions(-) create mode 100644 core/block_validator_goat.go create mode 100644 core/genesis_goat.go create mode 100644 core/goat/mainnet.json create mode 100644 core/goat/testnet3.json create mode 100644 core/state_processor_goat.go create mode 100644 core/state_processor_goat_test.go create mode 100644 core/state_transition_goat.go create mode 100644 core/state_transition_goat_test.go create mode 100644 core/testdata/goat-genesis.json create mode 100644 core/types/goattypes/constant.go create mode 100644 core/types/goattypes/req_bridge.go create mode 100644 core/types/goattypes/req_bridge_test.go create mode 100644 core/types/goattypes/req_locking.go create mode 100644 core/types/goattypes/req_locking_test.go create mode 100644 core/types/goattypes/req_relayer.go create mode 100644 core/types/goattypes/req_relayer_test.go create mode 100644 core/types/goattypes/request.go create mode 100644 core/types/goattypes/request_test.go create mode 100644 core/types/goattypes/tx.go create mode 100644 core/types/goattypes/tx_bridge.go create mode 100644 core/types/goattypes/tx_bridge_test.go create mode 100644 core/types/goattypes/tx_locking.go create mode 100644 core/types/goattypes/tx_locking_test.go create mode 100644 core/types/goattypes/tx_test.go create mode 100644 core/types/tx_goat.go create mode 100644 core/types/tx_goat_test.go create mode 100644 eth/catalyst/goat.go create mode 100644 eth/tracers/internal/tracetest/goat_test.go create mode 100644 eth/tracers/internal/tracetest/testdata/goat_call_tracer/deposit.json create mode 100644 eth/tracers/internal/tracetest/testdata/goat_call_tracer/distribute.json create mode 100644 eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock-native.json create mode 100644 eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock.json create mode 100644 params/goat.go diff --git a/beacon/engine/gen_blockparams.go b/beacon/engine/gen_blockparams.go index b1f01b50ff8e3..0267e836a8757 100644 --- a/beacon/engine/gen_blockparams.go +++ b/beacon/engine/gen_blockparams.go @@ -21,6 +21,7 @@ func (p PayloadAttributes) MarshalJSON() ([]byte, error) { SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` + GoatTxs []hexutil.Bytes `json:"goatTxs,omitempty" gencodec:"optional"` } var enc PayloadAttributes enc.Timestamp = hexutil.Uint64(p.Timestamp) @@ -28,6 +29,12 @@ func (p PayloadAttributes) MarshalJSON() ([]byte, error) { enc.SuggestedFeeRecipient = p.SuggestedFeeRecipient enc.Withdrawals = p.Withdrawals enc.BeaconRoot = p.BeaconRoot + if p.GoatTxs != nil { + enc.GoatTxs = make([]hexutil.Bytes, len(p.GoatTxs)) + for k, v := range p.GoatTxs { + enc.GoatTxs[k] = v + } + } return json.Marshal(&enc) } @@ -39,6 +46,7 @@ func (p *PayloadAttributes) UnmarshalJSON(input []byte) error { SuggestedFeeRecipient *common.Address `json:"suggestedFeeRecipient" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` + GoatTxs []hexutil.Bytes `json:"goatTxs,omitempty" gencodec:"optional"` } var dec PayloadAttributes if err := json.Unmarshal(input, &dec); err != nil { @@ -62,5 +70,11 @@ func (p *PayloadAttributes) UnmarshalJSON(input []byte) error { if dec.BeaconRoot != nil { p.BeaconRoot = dec.BeaconRoot } + if dec.GoatTxs != nil { + p.GoatTxs = make([][]byte, len(dec.GoatTxs)) + for k, v := range dec.GoatTxs { + p.GoatTxs[k] = v + } + } return nil } diff --git a/beacon/engine/types.go b/beacon/engine/types.go index 984090ef89b1a..7085e7b325f34 100644 --- a/beacon/engine/types.go +++ b/beacon/engine/types.go @@ -48,11 +48,15 @@ type PayloadAttributes struct { SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` Withdrawals []*types.Withdrawal `json:"withdrawals"` BeaconRoot *common.Hash `json:"parentBeaconBlockRoot"` + + GoatTxs [][]byte `json:"goatTxs,omitempty" gencodec:"optional"` } // JSON type overrides for PayloadAttributes. type payloadAttributesMarshaling struct { Timestamp hexutil.Uint64 + + GoatTxs []hexutil.Bytes } //go:generate go run github.com/fjl/gencodec -type ExecutableData -field-override executableDataMarshaling -out gen_ed.go diff --git a/core/block_validator.go b/core/block_validator.go index 5885df9ee230d..3d302c7848904 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -67,6 +67,10 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { return fmt.Errorf("transaction root hash mismatch (header value %x, calculated %x)", header.TxHash, hash) } + if err := v.validateGoatBlock(block); err != nil { + return err + } + // Withdrawals are present after the Shanghai fork. if header.WithdrawalsHash != nil { // Withdrawals list must be present in body after Shanghai. @@ -84,6 +88,10 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { // Blob transactions may be present after the Cancun fork. var blobs int for i, tx := range block.Transactions() { + if v.config.Goat != nil { + break + } + // Count the number of blobs to validate against the header's blobGasUsed blobs += len(tx.BlobHashes()) diff --git a/core/block_validator_goat.go b/core/block_validator_goat.go new file mode 100644 index 0000000000000..50c9c3ceacdfa --- /dev/null +++ b/core/block_validator_goat.go @@ -0,0 +1,53 @@ +package core + +import ( + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" +) + +func (v *BlockValidator) validateGoatBlock(block *types.Block) error { + if v.config.Goat == nil { + return nil + } + + extra := block.Header().Extra + if len(extra) != params.GoatHeaderExtraLengthV0 { + return fmt.Errorf("no goat tx root found (block %x)", block.Number()) + } + + txLen, txRoot := int(extra[0]), common.BytesToHash(extra[1:]) + if l := block.Transactions().Len(); l < txLen { + return fmt.Errorf("txs length(%d) is less than goat tx length %d", l, txLen) + } + if hash := types.DeriveSha(block.Transactions()[:txLen], trie.NewStackTrie(nil)); hash != txRoot { + return fmt.Errorf("goat tx root hash mismatch (header value %x, calculated %x)", txRoot, hash) + } + if len(block.Withdrawals()) > 0 { + return errors.New("withdrawals not allowed for goat-geth") + } + + for i, tx := range block.Transactions() { + if i < txLen { + if !tx.IsGoatTx() { + return fmt.Errorf("transaction %d should be goat tx", i) + } + if tx.To() == nil { + return fmt.Errorf("goat tx %d should have a to address", i) + } + } else { + if tx.IsGoatTx() { + return fmt.Errorf("transaction %d should not be goat tx", i) + } + if tx.Type() == types.BlobTxType { + return fmt.Errorf("blob transaction %d is not allowed", i) + } + } + } + + return nil +} diff --git a/core/chain_makers.go b/core/chain_makers.go index 97c785d52b484..84b41305b6c8e 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/triedb" "github.com/ethereum/go-verkle" "github.com/holiman/uint256" @@ -127,6 +128,12 @@ func (b *BlockGen) addTx(bc *BlockChain, vmConfig vm.Config, tx *types.Transacti if b.header.BlobGasUsed != nil { *b.header.BlobGasUsed += receipt.BlobGasUsed } + + if tx.IsGoatTx() { + b.header.Extra[0]++ + hash := types.DeriveSha(types.Transactions(b.txs[:]), trie.NewStackTrie(nil)) + copy(b.header.Extra[1:], hash[:]) + } } // AddTx adds a transaction to the generated block. If no coinbase has @@ -348,7 +355,19 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse } var requests [][]byte - if config.IsPrague(b.header.Number, b.header.Time) { + if config.Goat != nil { + var blockLogs []*types.Log + for _, r := range b.receipts { + blockLogs = append(blockLogs, r.Logs...) + } + gasRevenue := AllocateGoatGasFee(statedb, CalculateGoatGasFees(b.header, b.txs, b.receipts)) + goatRequests, err := ProcessGoatRequests(b.Number().Uint64(), gasRevenue, blockLogs) + if err != nil { + panic(fmt.Sprintf("failed to parse goat logs: %v", err)) + } + requests = goatRequests + } + if config.Goat == nil && config.IsPrague(b.header.Number, b.header.Time) { requests = [][]byte{} // EIP-6110 deposits var blockLogs []*types.Log @@ -581,6 +600,11 @@ func (cm *chainMaker) makeHeader(parent *types.Block, state *state.StateDB, engi header.BlobGasUsed = new(uint64) header.ParentBeaconRoot = new(common.Hash) } + + if cm.config.Goat != nil { + header.Extra = make([]byte, 1, params.GoatHeaderExtraLengthV0) + header.Extra = append(header.Extra, types.EmptyTxsHash[:]...) + } return header } diff --git a/core/genesis.go b/core/genesis.go index 85ef049ba6cfd..2bce49b8ac812 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -471,7 +471,12 @@ func (g *Genesis) toBlockWithRoot(root common.Hash) *types.Block { head.BlobGasUsed = new(uint64) } } - if conf.IsPrague(num, g.Timestamp) { + + if conf.Goat != nil { + head.RequestsHash = &types.EmptyRequestsHash + } + + if conf.Goat == nil && conf.IsPrague(num, g.Timestamp) { head.RequestsHash = &types.EmptyRequestsHash } } diff --git a/core/genesis_goat.go b/core/genesis_goat.go new file mode 100644 index 0000000000000..567df0307172d --- /dev/null +++ b/core/genesis_goat.go @@ -0,0 +1,62 @@ +package core + +import ( + "embed" + "encoding/json" + "math/big" + + _ "embed" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" +) + +//go:embed goat +var goatGenesis embed.FS + +var goatEmptyExtra = common.Hex2Bytes("0056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") + +// DefaultGoatTestnet3GenesisBlock returns the Goat Testnet3 genesis block. +func DefaultGoatTestnet3GenesisBlock() *Genesis { + raw, err := goatGenesis.ReadFile("goat/testnet3.json") + if err != nil { + panic(err) + } + var alloc types.GenesisAlloc + if err := json.Unmarshal(raw, &alloc); err != nil { + panic(err) + } + return &Genesis{ + Config: params.GoatTestnet3ChainConfig, + Nonce: 0, + Timestamp: 0x67345ba0, + ExtraData: goatEmptyExtra, + GasLimit: params.GoatTxGasLimit, + Difficulty: common.Big0, + Alloc: alloc, + BaseFee: big.NewInt(2028449), + } +} + +// DefaultGoatMainnetGenesisBlock returns the Goat Mainnet genesis block. +func DefaultGoatMainnetGenesisBlock() *Genesis { + raw, err := goatGenesis.ReadFile("goat/mainnet.json") + if err != nil { + panic(err) + } + var alloc types.GenesisAlloc + if err := json.Unmarshal(raw, &alloc); err != nil { + panic(err) + } + return &Genesis{ + Config: params.GoatMainnetChainConfig, + Nonce: 0, + Timestamp: 0x674d6b3a, + ExtraData: goatEmptyExtra, + GasLimit: params.GoatTxGasLimit, + Difficulty: common.Big0, + Alloc: alloc, + BaseFee: big.NewInt(2028449), + } +} diff --git a/core/goat/mainnet.json b/core/goat/mainnet.json new file mode 100644 index 0000000000000..304bca8d1f4de --- /dev/null +++ b/core/goat/mainnet.json @@ -0,0 +1,151 @@ +{ + "4e59b44847b379578588920ca78fbf26c0b4956c": { + "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + "balance": "0x0" + }, + "1820a4B7618BdE71Dce8cdc73aAB6C95905faD24": { + "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c0029", + "balance": "0x0" + }, + "13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2": { + "code": "0x6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033", + "balance": "0x0" + }, + "000F3df6D732807Ef1319fB7B8bB8522d0Beac02": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "balance": "0x0" + }, + "ba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed": { + "code": "0x60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed8361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a", + "balance": "0x0" + }, + "cA11bde05977b3631167028862bE2a173976CA11": { + "code": "0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033", + "balance": "0x0" + }, + "bC10000000000000000000000000000000000000": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6080604052600436106100e7575f3560e01c806370a0823111610087578063a9059cbb11610057578063a9059cbb1461026c578063d0e30db01461028b578063d505accf14610293578063dd62ed3e146102b2575f5ffd5b806370a08231146101de5780637ecebe001461021257806384b0196e1461023157806395d89b4114610258575f5ffd5b806323b872dd116100c257806323b872dd146101715780632e1a7d4d14610190578063313ce567146101af5780633644e515146101ca575f5ffd5b806306fdde03146100fa578063095ea7b31461012457806318160ddd14610153575f5ffd5b366100f6576100f46102f6565b005b5f5ffd5b348015610105575f5ffd5b5061010e610337565b60405161011b9190610e91565b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610ec5565b6103c7565b604051901515815260200161011b565b34801561015e575f5ffd5b506002545b60405190815260200161011b565b34801561017c575f5ffd5b5061014361018b366004610eed565b6103e0565b34801561019b575f5ffd5b506100f46101aa366004610f27565b610403565b3480156101ba575f5ffd5b506040516012815260200161011b565b3480156101d5575f5ffd5b5061016361044f565b3480156101e9575f5ffd5b506101636101f8366004610f3e565b6001600160a01b03165f9081526020819052604090205490565b34801561021d575f5ffd5b5061016361022c366004610f3e565b61045d565b34801561023c575f5ffd5b5061024561047a565b60405161011b9796959493929190610f57565b348015610263575f5ffd5b5061010e6104bc565b348015610277575f5ffd5b50610143610286366004610ec5565b6104cb565b6100f46102f6565b34801561029e575f5ffd5b506100f46102ad366004610fed565b6104d8565b3480156102bd575f5ffd5b506101636102cc36600461105a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6103003334610613565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b6060600380546103469061108b565b80601f01602080910402602001604051908101604052809291908181526020018280546103729061108b565b80156103bd5780601f10610394576101008083540402835291602001916103bd565b820191905f5260205f20905b8154815290600101906020018083116103a057829003601f168201915b5050505050905090565b5f336103d481858561064b565b60019150505b92915050565b5f336103ed85828561065d565b6103f88585856106d8565b506001949350505050565b61040d3382610735565b6104173382610769565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b5f610458610803565b905090565b6001600160a01b0381165f908152600760205260408120546103da565b5f6060805f5f5f606061048b61092c565b610493610959565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6060600480546103469061108b565b5f336103d48185856106d8565b834211156105015760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861054c8c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6105a682610986565b90505f6105b5828787876109b2565b9050896001600160a01b0316816001600160a01b0316146105fc576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016104f8565b6106078a8a8a61064b565b50505050505050505050565b6001600160a01b03821661063c5760405163ec442f0560e01b81525f60048201526024016104f8565b6106475f83836109de565b5050565b6106588383836001610b04565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146106d257818110156106c457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016104f8565b6106d284848484035f610b04565b50505050565b6001600160a01b03831661070157604051634b637e8f60e11b81525f60048201526024016104f8565b6001600160a01b03821661072a5760405163ec442f0560e01b81525f60048201526024016104f8565b6106588383836109de565b6001600160a01b03821661075e57604051634b637e8f60e11b81525f60048201526024016104f8565b610647825f836109de565b804710156107935760405163cf47918160e01b8152476004820152602481018290526044016104f8565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146107dc576040519150601f19603f3d011682016040523d82523d5f602084013e6107e1565b606091505b50509050806106585760405163d6bda27560e01b815260040160405180910390fd5b5f306001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614801561085b57507f000000000000000000000000000000000000000000000000000000000000092946145b1561088557507f87c221e5254cd88265070541bc79888ac224430b2f23a30c690d50936abee2c590565b610458604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fd3974318b35c22bdad78531c2e406ce004418eec475a02ecc063f209cbf20828918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606104587f57474254430000000000000000000000000000000000000000000000000000056005610bd6565b60606104587f31000000000000000000000000000000000000000000000000000000000000016006610bd6565b5f6103da610992610803565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f6109c288888888610c7f565b9250925092506109d28282610d47565b50909695505050505050565b6001600160a01b038316610a08578060025f8282546109fd91906110c3565b90915550610a789050565b6001600160a01b0383165f9081526020819052604090205481811015610a5a5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016104f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610a9457600280548290039055610ab2565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610af791815260200190565b60405180910390a3505050565b6001600160a01b038416610b2d5760405163e602df0560e01b81525f60048201526024016104f8565b6001600160a01b038316610b5657604051634a1406b160e11b81525f60048201526024016104f8565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156106d257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bc891815260200190565b60405180910390a350505050565b606060ff8314610bf057610be983610dff565b90506103da565b818054610bfc9061108b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c289061108b565b8015610c735780601f10610c4a57610100808354040283529160200191610c73565b820191905f5260205f20905b815481529060010190602001808311610c5657829003601f168201915b505050505090506103da565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610cb857505f91506003905082610d3d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610d09573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610d3457505f925060019150829050610d3d565b92505f91508190505b9450945094915050565b5f826003811115610d5a57610d5a6110e2565b03610d63575050565b6001826003811115610d7757610d776110e2565b03610d955760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610da957610da96110e2565b03610dca5760405163fce698f760e01b8152600481018290526024016104f8565b6003826003811115610dde57610dde6110e2565b03610647576040516335e2f38360e21b8152600481018290526024016104f8565b60605f610e0b83610e3c565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103da57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610ea36020830184610e63565b9392505050565b80356001600160a01b0381168114610ec0575f5ffd5b919050565b5f5f60408385031215610ed6575f5ffd5b610edf83610eaa565b946020939093013593505050565b5f5f5f60608486031215610eff575f5ffd5b610f0884610eaa565b9250610f1660208501610eaa565b929592945050506040919091013590565b5f60208284031215610f37575f5ffd5b5035919050565b5f60208284031215610f4e575f5ffd5b610ea382610eaa565b60ff60f81b8816815260e060208201525f610f7560e0830189610e63565b8281036040840152610f878189610e63565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610fdc578351835260209384019390920191600101610fbe565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215611003575f5ffd5b61100c88610eaa565b965061101a60208901610eaa565b95506040880135945060608801359350608088013560ff8116811461103d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561106b575f5ffd5b61107483610eaa565b915061108260208401610eaa565b90509250929050565b600181811c9082168061109f57607f821691505b6020821081036110bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156103da57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x5772617070656420476f617420426974636f696e000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x574742544300000000000000000000000000000000000000000000000000000a" + } + }, + "bC10000000000000000000000000000000000001": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b506004361061019a575f3560e01c806370a08231116100e857806395d89b4111610093578063c3cda5201161006e578063c3cda52014610392578063d505accf146103a5578063dd62ed3e146103b8578063f1127ed8146103f0575f5ffd5b806395d89b41146103645780639ab24eb01461036c578063a9059cbb1461037f575f5ffd5b806384b0196e116100c357806384b0196e146103175780638e539e8c1461033257806391ddadf414610345575f5ffd5b806370a08231146102c957806379cc6790146102f15780637ecebe0014610304575f5ffd5b80633a46b1a811610148578063587cde1e11610123578063587cde1e1461024b5780635c19a95c1461028e5780636fcfff45146102a1575f5ffd5b80633a46b1a81461021b57806342966c681461022e5780634bf5d7e914610243575f5ffd5b806323b872dd1161017857806323b872dd146101f1578063313ce567146102045780633644e51514610213575f5ffd5b806306fdde031461019e578063095ea7b3146101bc57806318160ddd146101df575b5f5ffd5b6101a661042f565b6040516101b39190611a59565b60405180910390f35b6101cf6101ca366004611a86565b6104bf565b60405190151581526020016101b3565b6002545b6040519081526020016101b3565b6101cf6101ff366004611aae565b6104d8565b604051601281526020016101b3565b6101e36104fb565b6101e3610229366004611a86565b610509565b61024161023c366004611ae8565b61058d565b005b6101a661059a565b610276610259366004611aff565b6001600160a01b039081165f908152600860205260409020541690565b6040516001600160a01b0390911681526020016101b3565b61024161029c366004611aff565b610612565b6102b46102af366004611aff565b610621565b60405163ffffffff90911681526020016101b3565b6101e36102d7366004611aff565b6001600160a01b03165f9081526020819052604090205490565b6102416102ff366004611a86565b61062b565b6101e3610312366004611aff565b610640565b61031f61064a565b6040516101b39796959493929190611b18565b6101e3610340366004611ae8565b61068c565b61034d6106f5565b60405165ffffffffffff90911681526020016101b3565b6101a66106fe565b6101e361037a366004611aff565b61070d565b6101cf61038d366004611a86565b61073c565b6102416103a0366004611bbe565b610749565b6102416103b3366004611c12565b610805565b6101e36103c6366004611c78565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104036103fe366004611ca9565b61093b565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101b3565b60606003805461043e90611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611ce6565b80156104b55780601f1061048c576101008083540402835291602001916104b5565b820191905f5260205f20905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b5f336104cc818585610975565b60019150505b92915050565b5f336104e5858285610987565b6104f0858585610a02565b506001949350505050565b5f610504610a5f565b905090565b5f5f6105136106f5565b90508065ffffffffffff16831061055357604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044015b60405180910390fd5b61057c61055f84610b88565b6001600160a01b0386165f90815260096020526040902090610bbe565b6001600160d01b0316949350505050565b6105973382610c71565b50565b60606105a4610ca5565b65ffffffffffff166105b46106f5565b65ffffffffffff16146105da576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b3361061d8183610caf565b5050565b5f6104d282610d38565b610636823383610987565b61061d8282610c71565b5f6104d282610d59565b5f6060805f5f5f606061065b610d76565b610663610da3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f6106966106f5565b90508065ffffffffffff1683106106d157604051637669fc0f60e11b81526004810184905265ffffffffffff8216602482015260440161054a565b6106e56106dd84610b88565b600a90610bbe565b6001600160d01b03169392505050565b5f610504610ca5565b60606004805461043e90611ce6565b6001600160a01b0381165f90815260096020526040812061072d90610dd0565b6001600160d01b031692915050565b5f336104cc818585610a02565b8342111561076d57604051632341d78760e11b81526004810185905260240161054a565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906107e6906107de9060a00160405160208183030381529060405280519060200120610e0a565b858585610e36565b90506107f28187610e62565b6107fc8188610caf565b50505050505050565b834211156108295760405163313c898160e11b81526004810185905260240161054a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108748c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108ce82610e0a565b90505f6108dd82878787610e36565b9050896001600160a01b0316816001600160a01b031614610924576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161054a565b61092f8a8a8a610975565b50505050505050505050565b604080518082019091525f80825260208201526109588383610eb4565b9392505050565b5f6109588284611d32565b5f6109588284611d51565b6109828383836001610ee8565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146109fc57818110156109ee57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161054a565b6109fc84848484035f610ee8565b50505050565b6001600160a01b038316610a2b57604051634b637e8f60e11b81525f600482015260240161054a565b6001600160a01b038216610a545760405163ec442f0560e01b81525f600482015260240161054a565b610982838383610fba565b5f306001600160a01b037f0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa316148015610ab757507f000000000000000000000000000000000000000000000000000000000000092946145b15610ae157507fe007978ecacf9012709c434e8ef8da2ccb041cae2246ec12d2a85b8606da6fad90565b610504604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fd130d8e4cd0a991f8e0ed7bafef98334c8ceb5ce3efda07a8d1dacbfd6f9b768918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115610bba576040516306dfcc6560e41b8152603060048201526024810183905260440161054a565b5090565b81545f9081816005811115610c1a575f610bd784610fc5565b610be19085611d70565b5f8881526020902090915081015465ffffffffffff9081169087161015610c0a57809150610c18565b610c15816001611d83565b92505b505b5f610c278787858561112a565b90508015610c6457610c4b87610c3e600184611d70565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610c66565b5f5b979650505050505050565b6001600160a01b038216610c9a57604051634b637e8f60e11b81525f600482015260240161054a565b61061d825f83610fba565b5f61050443610b88565b6001600160a01b038281165f8181526008602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46109828183610d3386611189565b6111a6565b6001600160a01b0381165f908152600960205260408120546104d29061130f565b6001600160a01b0381165f908152600760205260408120546104d2565b60606105047f474f415445440000000000000000000000000000000000000000000000000006600561133f565b60606105047f3100000000000000000000000000000000000000000000000000000000000001600661133f565b80545f908015610e0257610de983610c3e600184611d70565b54660100000000000090046001600160d01b0316610958565b5f9392505050565b5f6104d2610e16610a5f565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610e46888888886113e8565b925092509250610e5682826114b0565b50909695505050505050565b6001600160a01b0382165f908152600760205260409020805460018101909155818114610982576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161054a565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206109589083611568565b6001600160a01b038416610f115760405163e602df0560e01b81525f600482015260240161054a565b6001600160a01b038316610f3a57604051634a1406b160e11b81525f600482015260240161054a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156109fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fac91815260200190565b60405180910390a350505050565b6109828383836115d8565b5f60018211610fd2575090565b8160017001000000000000000000000000000000008210610ff85760809190911c9060401b5b6801000000000000000082106110135760409190911c9060201b5b640100000000821061102a5760209190911c9060101b5b62010000821061103f5760109190911c9060081b5b61010082106110535760089190911c9060041b5b601082106110665760049190911c9060021b5b600482106110725760011b5b600302600190811c9081858161108a5761108a611d96565b048201901c905060018185816110a2576110a2611d96565b048201901c905060018185816110ba576110ba611d96565b048201901c905060018185816110d2576110d2611d96565b048201901c905060018185816110ea576110ea611d96565b048201901c9050600181858161110257611102611d96565b048201901c905061112181858161111b5761111b611d96565b04821190565b90039392505050565b5f5b81831015611181575f61113f848461163e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561116d5780925061117b565b611178816001611d83565b93505b5061112c565b509392505050565b6001600160a01b0381165f908152602081905260408120546104d2565b816001600160a01b0316836001600160a01b0316141580156111c757505f81115b15610982576001600160a01b0383161561126e576001600160a01b0383165f90815260096020526040812081906112099061096a61120486611658565b61168b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611263929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610982576001600160a01b0382165f90815260096020526040812081906112a69061095f61120486611658565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611300929190918252602082015260400190565b60405180910390a25050505050565b5f63ffffffff821115610bba576040516306dfcc6560e41b8152602060048201526024810183905260440161054a565b606060ff831461135957611352836116c3565b90506104d2565b81805461136590611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461139190611ce6565b80156113dc5780601f106113b3576101008083540402835291602001916113dc565b820191905f5260205f20905b8154815290600101906020018083116113bf57829003601f168201915b505050505090506104d2565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561142157505f915060039050826114a6565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611472573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661149d57505f9250600191508290506114a6565b92505f91508190505b9450945094915050565b5f8260038111156114c3576114c3611daa565b036114cc575050565b60018260038111156114e0576114e0611daa565b036114fe5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561151257611512611daa565b036115335760405163fce698f760e01b81526004810182905260240161054a565b600382600381111561154757611547611daa565b0361061d576040516335e2f38360e21b81526004810182905260240161054a565b604080518082019091525f8082526020820152825f018263ffffffff168154811061159557611595611dbe565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6115e3838383611700565b6001600160a01b038316611633575f6115fb60025490565b90506001600160d01b038082111561163057604051630e58ae9360e11b8152600481018390526024810182905260440161054a565b50505b610982838383611826565b5f61164c6002848418611dd2565b61095890848416611d83565b5f6001600160d01b03821115610bba576040516306dfcc6560e41b815260d060048201526024810183905260440161054a565b5f5f6116b66116986106f5565b6116ae6116a488610dd0565b868863ffffffff16565b87919061189b565b915091505b935093915050565b60605f6116cf836118a8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03831661172a578060025f82825461171f9190611d83565b9091555061179a9050565b6001600160a01b0383165f908152602081905260409020548181101561177c5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161054a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b6576002805482900390556117d4565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181991815260200190565b60405180910390a3505050565b6001600160a01b03831661184857611845600a61095f61120484611658565b50505b6001600160a01b03821661186a57611867600a61096a61120484611658565b50505b6001600160a01b038381165f90815260086020526040808220548584168352912054610982929182169116836111a6565b5f806116b68585856118cf565b5f60ff8216601f8111156104d257604051632cd44ac360e21b815260040160405180910390fd5b82545f90819080156119ce575f6118eb87610c3e600185611d70565b805490915065ffffffffffff80821691660100000000000090046001600160d01b031690881682111561193157604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361196d57825465ffffffffffff1666010000000000006001600160d01b038916021783556119c0565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506116bb92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816116bb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109586020830184611a2b565b80356001600160a01b0381168114611a81575f5ffd5b919050565b5f5f60408385031215611a97575f5ffd5b611aa083611a6b565b946020939093013593505050565b5f5f5f60608486031215611ac0575f5ffd5b611ac984611a6b565b9250611ad760208501611a6b565b929592945050506040919091013590565b5f60208284031215611af8575f5ffd5b5035919050565b5f60208284031215611b0f575f5ffd5b61095882611a6b565b60ff60f81b8816815260e060208201525f611b3660e0830189611a2b565b8281036040840152611b488189611a2b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611b9d578351835260209384019390920191600101611b7f565b50909b9a5050505050505050505050565b803560ff81168114611a81575f5ffd5b5f5f5f5f5f5f60c08789031215611bd3575f5ffd5b611bdc87611a6b565b95506020870135945060408701359350611bf860608801611bae565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215611c28575f5ffd5b611c3188611a6b565b9650611c3f60208901611a6b565b95506040880135945060608801359350611c5b60808901611bae565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611c89575f5ffd5b611c9283611a6b565b9150611ca060208401611a6b565b90509250929050565b5f5f60408385031215611cba575f5ffd5b611cc383611a6b565b9150602083013563ffffffff81168114611cdb575f5ffd5b809150509250929050565b600181811c90821680611cfa57607f821691505b602082108103611d1857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160d01b0381811683821601908111156104d2576104d2611d1e565b6001600160d01b0382811682821603908111156104d2576104d2611d1e565b818103818111156104d2576104d2611d1e565b808201808211156104d2576104d2611d1e565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82611dec57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x476f6174204e6574776f726b0000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x474f41544544000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x42df54d978308232df5f7d63c0445e00c9e9f8c4eb4d4c22b0f8badf086d40da": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x4f4ded9249ee538b9cb6f0ff7a55254b68cddfac5fdd7f830ce83382bec08977": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x540b5a72faa2463ad7b6e96257f3df9adbe15e6f4ef1a160019203de6a3b6c17": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x55b0fb7ee6854a4c90517d06cee035cb67a225460ad0f72a5ba96fbf9c7f69fa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5c8a026c050bbafa6dcbd612a344da1477aa71c609e295d7f9c1ecd5f82ea9b7": "0x00000000000000000000000000000000000000000295be96e640669720000000", + "0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000033b2e3c9fd0803ce8000000000000000001" + } + }, + "Bc10000000000000000000000000000000000002": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405260043610610071575f3560e01c80639db5dbe41161004c5780639db5dbe4146101245780639e976db114610143578063a9059cbb14610163578063f2fde38b14610182575f5ffd5b806301ffc9a7146100b4578063715018a6146100e85780638da5cb5b146100fe575f5ffd5b366100b057604080513381523460208201527f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef13910160405180910390a1005b5f5ffd5b3480156100bf575f5ffd5b506100d36100ce3660046106a3565b6101a1565b60405190151581526020015b60405180910390f35b3480156100f3575f5ffd5b506100fc6101d7565b005b348015610109575f5ffd5b505f546040516001600160a01b0390911681526020016100df565b34801561012f575f5ffd5b506100fc61013e3660046106de565b6101ea565b61015661015136600461071c565b61020b565b6040516100df91906107a3565b34801561016e575f5ffd5b506100fc61017d3660046107d8565b6102d8565b34801561018d575f5ffd5b506100fc61019c366004610802565b610339565b5f6001600160e01b031982166301ffc9a760e01b14806101d157506001600160e01b03198216635513957760e11b145b92915050565b6101df610376565b6101e85f6103a2565b565b6101f2610376565b6102066001600160a01b0384168383610409565b505050565b6060610215610376565b5f546001600160a01b03166001600160a01b0316856001600160a01b0316036102855760405162461bcd60e51b815260206004820152600660248201527f216f776e6572000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6102cf84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084610470565b95945050505050565b6102e0610376565b6102f36001600160a01b03831682610512565b604080516001600160a01b0384168152602081018390527f69ca02dd4edd7bf0a4abb9ed3b7af3f14778db5d61921c7dc7cd545266326de2910160405180910390a15050565b610341610376565b6001600160a01b03811661036a57604051631e4fbdf760e01b81525f600482015260240161027c565b610373816103a2565b50565b5f546001600160a01b031633146101e85760405163118cdaa760e01b815233600482015260240161027c565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790526102069084906105ac565b60608147101561049c5760405163cf47918160e01b81524760048201526024810183905260440161027c565b5f5f856001600160a01b031684866040516104b7919061081d565b5f6040518083038185875af1925050503d805f81146104f1576040519150601f19603f3d011682016040523d82523d5f602084013e6104f6565b606091505b509150915061050686838361061e565b925050505b9392505050565b8047101561053c5760405163cf47918160e01b81524760048201526024810182905260440161027c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610585576040519150601f19603f3d011682016040523d82523d5f602084013e61058a565b606091505b50509050806102065760405163d6bda27560e01b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806105cb576040513d5f823e3d81fd5b50505f513d915081156105e25780600114156105ef565b6001600160a01b0384163b155b1561061857604051635274afe760e01b81526001600160a01b038516600482015260240161027c565b50505050565b6060826106335761062e8261067a565b61050b565b815115801561064a57506001600160a01b0384163b155b1561067357604051639996b31560e01b81526001600160a01b038516600482015260240161027c565b508061050b565b80511561068a5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f602082840312156106b3575f5ffd5b81356001600160e01b03198116811461050b575f5ffd5b6001600160a01b0381168114610373575f5ffd5b5f5f5f606084860312156106f0575f5ffd5b83356106fb816106ca565b9250602084013561070b816106ca565b929592945050506040919091013590565b5f5f5f5f6060858703121561072f575f5ffd5b843561073a816106ca565b9350602085013567ffffffffffffffff811115610755575f5ffd5b8501601f81018713610765575f5ffd5b803567ffffffffffffffff81111561077b575f5ffd5b87602082840101111561078c575f5ffd5b949760209190910196509394604001359392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156107e9575f5ffd5b82356107f4816106ca565b946020939093013593505050565b5f60208284031215610812575f5ffd5b813561050b816106ca565b5f82518060208501845e5f92019182525091905056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000001a3e8c63e9490271a9e97d48239fe0a3b68bbdf6" + } + }, + "BC10000000000000000000000000000000000003": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x60806040526004361061018e575f3560e01c80638da5cb5b116100dc578063b3dd64dd11610087578063b9cf8c8f11610062578063b9cf8c8f14610484578063c19dd32014610528578063c8c3c6b614610547578063f2fde38b14610566575f5ffd5b8063b3dd64dd14610427578063b3f33eda14610446578063b670ab5e14610465575f5ffd5b8063a2215ab4116100b7578063a2215ab4146103e7578063a5517aff146103fc578063a81de86914610414575f5ffd5b80638da5cb5b14610383578063904183cb146103a9578063a0ea8451146103c8575f5ffd5b80634e0cd7991161013c578063715018a611610117578063715018a61461033157806384a64c12146103455780638aa4af8914610364575f5ffd5b80634e0cd7991461027a5780635c6650ac1461028e5780635cc0707614610300575f5ffd5b8063278ecde11161016c578063278ecde1146102075780632eff14ec146102285780633396c80914610247575f5ffd5b806301ffc9a7146101925780631af87ddf146101c65780631ccc92c7146101e8575b5f5ffd5b34801561019d575f5ffd5b506101b16101ac36600461197b565b610585565b60405190151581526020015b60405180910390f35b3480156101d1575f5ffd5b506101da6105d6565b6040519081526020016101bd565b3480156101f3575f5ffd5b506101b16102023660046119c1565b6105ea565b348015610212575f5ffd5b506102266102213660046119eb565b610644565b005b348015610233575f5ffd5b50610226610242366004611a13565b610750565b348015610252575f5ffd5b506101da7f000000000000000000000000000000000000000000000000000000000000002081565b348015610285575f5ffd5b506101da610820565b348015610299575f5ffd5b506005546102d29067ffffffffffffffff8082169161ffff68010000000000000000820416916a01000000000000000000009091041683565b6040805167ffffffffffffffff948516815261ffff90931660208401529216918101919091526060016101bd565b34801561030b575f5ffd5b5061031f61031a3660046119eb565b610831565b6040516101bd96959493929190611a40565b34801561033c575f5ffd5b50610226610889565b348015610350575f5ffd5b5061022661035f3660046119eb565b61089c565b34801561036f575f5ffd5b5061022661037e366004611ab0565b6109bd565b34801561038e575f5ffd5b505f546040516001600160a01b0390911681526020016101bd565b3480156103b4575f5ffd5b506102266103c3366004611aee565b610ab4565b3480156103d3575f5ffd5b506102266103e2366004611b38565b610c0e565b3480156103f2575f5ffd5b506101da61012c81565b348015610407575f5ffd5b506101da6402540be40081565b610226610422366004611b51565b610cdf565b348015610432575f5ffd5b50610226610441366004611bcd565b6110a2565b348015610451575f5ffd5b50610226610460366004611ab0565b6112af565b348015610470575f5ffd5b5061022661047f366004611bee565b6113be565b34801561048f575f5ffd5b506004546104e69060e081901b9067ffffffffffffffff640100000000820481169161ffff6c0100000000000000000000000082048116926e01000000000000000000000000000083041691600160b01b90041685565b604080516001600160e01b0319909616865267ffffffffffffffff948516602087015261ffff938416908601529216606084015216608082015260a0016101bd565b348015610533575f5ffd5b506102266105423660046119eb565b611535565b348015610552575f5ffd5b50610226610561366004611b38565b61162d565b348015610571575f5ffd5b50610226610580366004611c28565b611704565b5f6001600160e01b031982166301ffc9a760e01b14806105b557506001600160e01b03198216634388643560e01b145b806105d057506001600160e01b03198216630ff038eb60e31b145b92915050565b6105e76402540be40061012c611c55565b81565b5f5f838360405160200161061592919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f1901815291815281516020928301205f908152600690925290205460ff16949350505050565b5f6007828154811061065857610658611c6c565b5f9182526020909120600490910201905060038154600160b01b900460ff16600581111561068857610688611a2c565b146106a657604051631dd2188d60e31b815260040160405180910390fd5b805476040000000000000000000000000000000000000000000060ff60b01b1982161782556001600160a01b03163381146106f457604051634ca8886760e01b815260040160405180910390fd5b426003830155600282015460018301546107219161071191611c80565b6001600160a01b03831690611741565b60405183907f2e1897b0591d764356194f7a795238a87c1987c7a877568e50d829d547c92b97905f90a2505050565b6107586117e0565b5f8161ffff16116107b05760405162461bcd60e51b815260206004820152600e60248201527f6e756d62657220746f6f206c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b600480547fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b61ffff8416908102919091179091556040519081527f30b92002139b64ec601b714d1ecccba1212034e735773b3de088e8876f4dfb659060200160405180910390a150565b6105e76402540be4006103e8611c55565b60078181548110610840575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b0383169450600160a01b830461ffff1693600160b01b90930460ff16929086565b6108916117e0565b61089a5f61180c565b565b6108a7336001611873565b5f600782815481106108bb576108bb611c6c565b5f9182526020909120600490910201905060018154600160b01b900460ff1660058111156108eb576108eb611a2c565b1461090957604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b0316331461093357604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426109469190611c93565b101561096557604051633234675360e21b815260040160405180910390fd5b426003820155805460ff60b01b191676020000000000000000000000000000000000000000000017815560405182907f0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c905f90a25050565b6109c56117e0565b81816109e06402540be40067ffffffffffffffff8316611cba565b1580156109f1575060658261ffff16105b610a0e576040516337d4ed5b60e01b815260040160405180910390fd5b6005805471ffffffffffffffffffff000000000000000019166801000000000000000061ffff871690810271ffffffffffffffff000000000000000000001916919091176a010000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f59b73ca79bcb3dcb02c4d2b81e1a2da4c9fd9857ed81cfb16c5431b502f8c71b91015b60405180910390a150505050565b3373bc1000000000000000000000000000000000100014610ae857604051634ca8886760e01b815260040160405180910390fd5b5f8585604051602001610b1292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815291815281516020928301205f818152600690935291205490915060ff1615610b895760405162461bcd60e51b815260206004820152600a60248201527f6475706c6963617465640000000000000000000000000000000000000000000060448201526064016107a7565b5f8181526006602052604090819020805460ff19166001179055516001600160a01b038516907f4d2c35ab224c2e654f91bb91c9f4081beef0e0abfc8a59df04254f6d0232213290610bfe90899089908890889093845263ffffffff9290921660208401526040830152606082015260800190565b60405180910390a2505050505050565b610c166117e0565b80670de0b6b3a76400008167ffffffffffffffff16108015610c485750655af3107a40008167ffffffffffffffff1610155b8015610c6a5750610c686402540be40067ffffffffffffffff8316611cba565b155b610c875760405163aabd5a0960e01b815260040160405180910390fd5b6005805467ffffffffffffffff191667ffffffffffffffff84169081179091556040519081527f69458aa02de2093876897ec9cd5653bbdd83360ef731be0da0e3c94bf9a22dba906020015b60405180910390a15050565b610cea336001611873565b81602181118015610cfb5750605b81105b610d475760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642061646472657373000000000000000000000000000000000060448201526064016107a7565b6040805160608101825260055467ffffffffffffffff80821680845261ffff6801000000000000000084041660208501526a0100000000000000000000909204169282019290925234915f9190831015610de35760405162461bcd60e51b815260206004820152600e60248201527f616d6f756e7420746f6f206c6f7700000000000000000000000000000000000060448201526064016107a7565b602081015161ffff1615610e6257612710816020015161ffff1684610e089190611c55565b610e129190611ccd565b91505f816040015167ffffffffffffffff16118015610e3e5750806040015167ffffffffffffffff1682115b15610e5557806040015167ffffffffffffffff1691505b610e5f8284611c93565b92505b5f610e726402540be40085611cba565b90508015610e9357610e848184611c80565b9250610e908185611c93565b93505b5f8661ffff1611610ed95760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b610eea6402540be40061012c611c55565b610ef89061ffff8816611c55565b610f096402540be4006103e8611c55565b610f139190611c80565b8411610f505760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b600780546040805160c08101825233815261ffff8a8116602083019081526001938301848152606084018b9052608084018a90524260a085015293850186555f9590955281517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600486020180549651909216600160a01b027fffffffffffffffffffff000000000000000000000000000000000000000000009096166001600160a01b0390911617949094178085559151929390929091829060ff60b01b1916600160b01b83600581111561102857611028611a2c565b0217905550606082015181600101556080820151816002015560a082015181600301555050336001600160a01b0316817fbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b87878b8e8e60405161108f959493929190611ce0565b60405180910390a3505050505050505050565b6110ad336001611873565b5f600783815481106110c1576110c1611c6c565b5f9182526020909120600490910201905060018154600160b01b900460ff1660058111156110f1576110f1611a2c565b1461110f57604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b0316331461113957604051634ca8886760e01b815260040160405180910390fd5b61012c81600301544261114c9190611c93565b101561116b57604051633234675360e21b815260040160405180910390fd5b805461ffff600160a01b9091048116908316116111bd5760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b6111ce6402540be40061012c611c55565b6111dc9061ffff8416611c55565b6111ed6402540be4006103e8611c55565b6111f79190611c80565b8160010154116112385760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff841690810291909117825542600383015560405190815283907f19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa9060200160405180910390a2505050565b6112b76117e0565b81816112d26402540be40067ffffffffffffffff8316611cba565b1580156112e3575060658261ffff16105b611300576040516337d4ed5b60e01b815260040160405180910390fd5b600480547fffffffffffffffffffff00000000000000000000ffffffffffffffffffffffff166c0100000000000000000000000061ffff87169081027fffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff16919091176e01000000000000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f1007ff7aec53e9626ce51f25d4e093f290f60da8019c8cf489f0ae2f21ebf76a9101610aa6565b3373bc10000000000000000000000000000000001000146113f257604051634ca8886760e01b815260040160405180910390fd5b5f6007858154811061140657611406611c6c565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561143857611438611a2c565b14806114555750600281600581111561145357611453611a2c565b145b61145d575f5ffd5b815460ff60b01b1916760500000000000000000000000000000000000000000000178255426003830155600282015480156114b0576114b073bc1000000000000000000000000000000000000282611741565b60018301546040515f91906114c49061196f565b82906040518091039083f5915050801580156114e2573d5f5f3e3d5ffd5b50506040805187815263ffffffff8716602082015290810185905287907fb74f5dbf34aabe02f20ff775b898acf1a9f70e4fbd48ad50548acae86e1ccd789060600160405180910390a250505050505050565b3373bc100000000000000000000000000000000010001461156957604051634ca8886760e01b815260040160405180910390fd5b5f6007828154811061157d5761157d611c6c565b5f91825260209091206004909102018054909150600160b01b900460ff1660018160058111156115af576115af611a2c565b14806115cc575060028160058111156115ca576115ca611a2c565b145b6115d4575f5ffd5b815460ff60b01b191676030000000000000000000000000000000000000000000017825542600383015560405183907f829a8683c544ad289ce92d3ce06e9ebad69b18a6916e60ec766c2c217461d8e9905f90a2505050565b6116356117e0565b80670de0b6b3a76400008167ffffffffffffffff161080156116675750655af3107a40008167ffffffffffffffff1610155b801561168957506116876402540be40067ffffffffffffffff8316611cba565b155b6116a65760405163aabd5a0960e01b815260040160405180910390fd5b600480546bffffffffffffffff00000000191664010000000067ffffffffffffffff8516908102919091179091556040519081527f7aa20a242ea0b0f7b0141c56aaad636eb2b2077c9c27d09a8282f6931f486a2190602001610cd3565b61170c6117e0565b6001600160a01b03811661173557604051631e4fbdf760e01b81525f60048201526024016107a7565b61173e8161180c565b50565b8047101561176b5760405163cf47918160e01b8152476004820152602481018290526044016107a7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146117b4576040519150601f19603f3d011682016040523d82523d5f602084013e6117b9565b606091505b50509050806117db5760405163d6bda27560e01b815260040160405180910390fd5b505050565b5f546001600160a01b0316331461089a5760405163118cdaa760e01b81523360048201526024016107a7565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f0000000000000000000000000000000000000000000000000000000000000000156118ec576001600160a01b0382165f908152600360205260409020544390036118d157604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f036118f7575050565b600154430361191e5780600180015f8282546119139190611c80565b909155506119289050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561196b5760405163a74c1c5f60e01b815260040160405180910390fd5b5050565b600880611d2883390190565b5f6020828403121561198b575f5ffd5b81356001600160e01b0319811681146119a2575f5ffd5b9392505050565b803563ffffffff811681146119bc575f5ffd5b919050565b5f5f604083850312156119d2575f5ffd5b823591506119e2602084016119a9565b90509250929050565b5f602082840312156119fb575f5ffd5b5035919050565b803561ffff811681146119bc575f5ffd5b5f60208284031215611a23575f5ffd5b6119a282611a02565b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b038716815261ffff8616602082015260c0810160068610611a7657634e487b7160e01b5f52602160045260245ffd5b8560408301528460608301528360808301528260a0830152979650505050505050565b803567ffffffffffffffff811681146119bc575f5ffd5b5f5f60408385031215611ac1575f5ffd5b611aca83611a02565b91506119e260208401611a99565b80356001600160a01b03811681146119bc575f5ffd5b5f5f5f5f5f60a08688031215611b02575f5ffd5b85359450611b12602087016119a9565b9350611b2060408701611ad8565b94979396509394606081013594506080013592915050565b5f60208284031215611b48575f5ffd5b6119a282611a99565b5f5f5f60408486031215611b63575f5ffd5b833567ffffffffffffffff811115611b79575f5ffd5b8401601f81018613611b89575f5ffd5b803567ffffffffffffffff811115611b9f575f5ffd5b866020828401011115611bb0575f5ffd5b602091820194509250611bc4908501611a02565b90509250925092565b5f5f60408385031215611bde575f5ffd5b823591506119e260208401611a02565b5f5f5f5f60808587031215611c01575f5ffd5b8435935060208501359250611c18604086016119a9565b9396929550929360600135925050565b5f60208284031215611c38575f5ffd5b6119a282611ad8565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105d0576105d0611c41565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105d0576105d0611c41565b818103818111156105d0576105d0611c41565b634e487b7160e01b5f52601260045260245ffd5b5f82611cc857611cc8611ca6565b500690565b5f82611cdb57611cdb611ca6565b500490565b85815284602082015261ffff8416604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f1916010194935050505056fe608060405230fffea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000853f96ed28e776afd7c56fbe19b04e94febfdbe1", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x00000000000000000006000000000000000000000001c6bf52634000474f4154", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000071afd498d000000140001c6bf52634000", + "0x31773ce5641d458709b34148820535392ad7c1dfa8a7baea3de330df9accc8e1": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x83fb2464e123174ae6807273604c4e9b79a7a011b35c1c9364c1e7e1c555e844": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc9d1a8397eefa80091b6951ed20375ea61f0277a812b9d6eb071ba297e223130": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "bC10000000000000000000000000000000000004": { + "balance": "0x14d1120d7b160000", + "nonce": "0x1", + "code": "0x6080604052600436106101d9575f3560e01c80635ba3a6a5116100fd578063bc01763711610092578063e486033911610062578063e4860339146105c4578063e4a28a521461063d578063e6a36cb61461066c578063f2fde38b1461068b575f5ffd5b8063bc01763714610548578063bd12835014610567578063bd9fadb514610586578063daea85c5146105a5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b146104e15780639d879990146104fd578063aa94def21461051c578063af38d7571461052f575f5ffd5b80635ba3a6a51461045c5780635d0341ba1461047b578063715018a6146104b957806380e9071b146104cd575f5ffd5b806323435e2f1161017357806349a0bf8e1161014357806349a0bf8e146103d1578063505bd3da146103e5578063551b3cd21461041057806359e5332d1461043b575f5ffd5b806323435e2f14610341578063293cdbf1146103775780633396c8091461038b578063423905f2146103be575f5ffd5b80631485ff78116101ae5780631485ff78146102a1578063160e3f3d146102c45780631eeea1f3146102e357806321c0b34214610322575f5ffd5b806252c9e1146101dd578062aba51a146101fe578063022914a71461021d57806309e3faa71461026e575b5f5ffd5b3480156101e8575f5ffd5b506101fc6101f73660046125d6565b6106aa565b005b348015610209575f5ffd5b506101fc61021836600461261e565b61078d565b348015610228575f5ffd5b50610251610237366004612666565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610279575f5ffd5b506102517f000000000000000000000000bc1000000000000000000000000000000000000181565b3480156102ac575f5ffd5b506102b660055481565b604051908152602001610265565b3480156102cf575f5ffd5b506101fc6102de366004612686565b6108aa565b3480156102ee575f5ffd5b506103026102fd3660046126b3565b610954565b604080516001600160a01b03938416815292909116602083015201610265565b34801561032d575f5ffd5b506101fc61033c3660046125d6565b610971565b34801561034c575f5ffd5b506102b661035b3660046125d6565b600b60209081525f928352604080842090915290825290205481565b348015610382575f5ffd5b506101fc610a99565b348015610396575f5ffd5b506102b67f000000000000000000000000000000000000000000000000000000000000002081565b6101fc6103cc3660046126db565b610afc565b3480156103dc575f5ffd5b506102b6600881565b3480156103f0575f5ffd5b506102b66103ff366004612666565b600c6020525f908152604090205481565b34801561041b575f5ffd5b506102b661042a366004612666565b600a6020525f908152604090205481565b348015610446575f5ffd5b5061044f610d1c565b6040516102659190612721565b348015610467575f5ffd5b506101fc610476366004612778565b610e0d565b348015610486575f5ffd5b506104a9610495366004612666565b600d6020525f908152604090205460ff1681565b6040519015158152602001610265565b3480156104c4575f5ffd5b506101fc611115565b3480156104d8575f5ffd5b506101fc611128565b3480156104ec575f5ffd5b505f546001600160a01b0316610251565b348015610508575f5ffd5b506101fc6105173660046127b7565b6111bf565b6101fc61052a366004612827565b611450565b34801561053a575f5ffd5b506007546104a99060ff1681565b348015610553575f5ffd5b506101fc6105623660046127b7565b611537565b348015610572575f5ffd5b506101fc610581366004612876565b6115e0565b348015610591575f5ffd5b506101fc6105a036600461289e565b611883565b3480156105b0575f5ffd5b506101fc6105bf366004612666565b611a0b565b3480156105cf575f5ffd5b506106126105de366004612666565b60096020525f908152604090208054600182015460029092015460ff82169261010090920467ffffffffffffffff16919084565b60408051941515855267ffffffffffffffff9093166020850152918301526060820152608001610265565b348015610648575f5ffd5b50610653620f424081565b60405167ffffffffffffffff9091168152602001610265565b348015610677575f5ffd5b506101fc6106863660046128c8565b611a9f565b348015610696575f5ffd5b506101fc6106a5366004612666565b611ce7565b6001600160a01b038083165f90815260086020526040902054839116803381146106f8576040516370a4337d60e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0383166107205760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038481165f8181526008602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fadd4071c89e561d58065ade5130c43b17b1101714bca7d91d2515ba1cb9fc97691015b60405180910390a150505050565b833373bc10000000000000000000000000000000001001146107c25760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561080b57604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556001600160a01b0383161580159061084657505f82115b1561085f5761085f6001600160a01b0384168584611d21565b6040805167ffffffffffffffff87168152602081018490527f31fa984883dfea329532d399d9106031006364f445ef2351a45c0d9cbc4ec72791015b60405180910390a15050505050565b6108b2611d9a565b5f81116108d257604051630dd484e760e41b815260040160405180910390fd5b6109076001600160a01b037f000000000000000000000000bc1000000000000000000000000000000000000116333084611dc6565b8060055f8282546109189190612939565b90915550506040518181527f41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0906020015b60405180910390a150565b5f5f61095f83611dff565b61096884611f17565b91509150915091565b6001600160a01b038083165f90815260086020526040902054839116803381146109ba576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508360016109c88282611f47565b6001600160a01b0385166109ef5760405163f6b2911f60e01b815260040160405180910390fd5b600480547fa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b9167ffffffffffffffff909116905f610a2c8361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508787604051610a899392919067ffffffffffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a1505050505050565b610aa1611d9a565b60075460ff1615610ac55760405163eef336d960e01b815260040160405180910390fd5b6007805460ff191660011790556040517f8b1bc2671f5913bb778240df66342565720db9b7a01e7e78190ae6aa1e4bd0f3905f90a1565b600654610b1c576040516314d2abd360e21b815260040160405180910390fd5b5f610b2685611dff565b90505f468233604051602001610b6593929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b604051602081830303815290604052805190602001209050610b898184878761203f565b6001600160a01b0316610b9b87611f17565b6001600160a01b031614610bc257604051630e751dc360e31b815260040160405180910390fd5b6001600160a01b038281165f9081526008602052604090205483911615610c085760405163107f863360e21b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600d602052604090205460ff1680610c5857505f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff165b8290610c8357604051633e55e12b60e11b81526001600160a01b0390911660048201526024016106ef565b50600654610c9d908390610c98906001612939565b611f47565b6001600160a01b0382165f908152600860205260409081902080546001600160a01b0319163390811790915590517ff3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd91610cfb918591908a90612978565b60405180910390a1610d1482610d0f610d1c565b61206b565b505050505050565b6006546060905f9067ffffffffffffffff811115610d3c57610d3c61299f565b604051908082528060200260200182016040528015610d8057816020015b604080518082019091525f8082526020820152815260200190600190039081610d5a5790505b5090505f5b600654811015610e07575f60068281548110610da357610da36129b3565b5f9182526020808320909101546040805180820182526001600160a01b039092168083528085526009845293206002015491810191909152845191925090849084908110610df357610df36129b3565b602090810291909101015250600101610d85565b50919050565b610e15611d9a565b6001600160a01b0384165f9081526009602052604090205460ff1615610e4e57604051632ae3f45d60e11b815260040160405180910390fd5b6001600160a01b0384161580610ec65750836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906129c7565b60ff166012145b610ee357604051638785ff4f60e01b815260040160405180910390fd5b5f8367ffffffffffffffff16118015610f085750620f424067ffffffffffffffff8416105b610f255760405163018a49e560e01b815260040160405180910390fd5b60408051608081018252600180825267ffffffffffffffff8681166020808501828152858701898152606087018981526001600160a01b038d165f818152600986528a902098518954945168ffffffffffffffffff1990951690151568ffffffffffffffff0019161761010094909716939093029590951787555194860194909455915160029094019390935583519182528101919091527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a1604080516001600160a01b0386168152602081018490527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a1801561110f5781158061103d5750808210155b828290916110675760405163068ade6560e31b8152600481019290925260248201526044016106ef565b505060065460081161108c57604051632970307360e11b815260040160405180910390fd5b600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03861690811790915560408051918252602082018390527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b50505050565b61111d611d9a565b6111265f612380565b565b60075460ff1661114b576040516335b43c0360e11b815260040160405180910390fd5b335f908152600c602052604090205480611178576040516301e1880f60e51b815260040160405180910390fd5b335f818152600c60205260408120556111bc907f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03169083611d21565b50565b6111c7611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661120d5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600960205260409020600201548181036112495760405163aabb9c6360e01b815260040160405180910390fd5b6001600160a01b0383165f81815260096020908152604091829020600201859055815192835282018490527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910160405180910390a1801580156112ac57505f82115b15611325576006546008116112d457604051632970307360e11b815260040160405180910390fd5b50600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091161790555050565b5f8111801561133357505f82115b1561133d57505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611366576113666129b3565b5f918252602090912001546001600160a01b0316036114445760065461138e906001906129e2565b811461140b57600680546113a4906001906129e2565b815481106113b4576113b46129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106113df576113df6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061141c5761141c6129f5565b5f8281526020902081015f1990810180546001600160a01b03191690550190555061144c9050565b60010161133f565b5050565b6001600160a01b038084165f9081526008602052604090205484911680338114611499576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b5084836114a68282611f47565b84158015906114b6575060088511155b6114d357604051632970307360e11b815260040160405180910390fd5b61152e878787808060200260200160405190810160405280939291908181526020015f905b828210156115245761151560408302860136819003810190612a09565b815260200190600101906114f8565b505050505061206b565b50505050505050565b61153f611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff166115855760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f81815260096020908152604091829020600101849055815192835282018390527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a15050565b6115e8611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661162e5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b50620f424067ffffffffffffffff82161061165c5760405163018a49e560e01b815260040160405180910390fd5b604080516001600160a01b038416815267ffffffffffffffff831660208201527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a167ffffffffffffffff8116156116f4576001600160a01b0382165f908152600960205260409020805467ffffffffffffffff83166101000268ffffffffffffffff00199091161790555050565b6001600160a01b0382165f908152600960205260408120600281018054825468ffffffffffffffffff1916835560019092018390559190915515158061173957505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611762576117626129b3565b5f918252602090912001546001600160a01b03160361187b5760065461178a906001906129e2565b811461180757600680546117a0906001906129e2565b815481106117b0576117b06129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106117db576117db6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6006805480611818576118186129f5565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516001600160a01b0388168152918201929092527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b60010161173b565b833373bc10000000000000000000000000000000001001146118b85760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561190157604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556005548311156119355760055492505b82156119c35760075460ff161561197f5761197a6001600160a01b037f000000000000000000000000bc10000000000000000000000000000000000001168585611d21565b6119ac565b6001600160a01b0384165f908152600c6020526040812080548592906119a6908490612939565b90915550505b8260055f8282546119bd91906129e2565b90915550505b6040805167ffffffffffffffff87168152602081018590529081018390527f2b02cde117ae53d66dc4d0bdf72b2146e0e1070c1428d6274b0f98d628ad99c49060600161089b565b611a13611d9a565b6001600160a01b0381165f908152600d602052604090205460ff1615611a4c57604051632ef470fd60e11b815260040160405180910390fd5b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce79101610949565b6001600160a01b038085165f9081526008602052604090205485911680338114611ae8576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508583611af58282611f47565b8415801590611b05575060088511155b611b2257604051632970307360e11b815260040160405180910390fd5b6001600160a01b038716611b495760405163f6b2911f60e01b815260040160405180910390fd5b5f5b85811015611cdc575f878783818110611b6657611b666129b3565b905060400201803603810190611b7c9190612a09565b90505f816020015111611ba257604051630dd484e760e41b815260040160405180910390fd5b6020808201516001600160a01b03808d165f908152600b8452604080822086519093168252919093528220805491929091611bde9084906129e2565b909155505060208082015182516001600160a01b03165f908152600a90925260408220805491929091611c129084906129e2565b9091555050600480547f40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db79167ffffffffffffffff909116905f611c548361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508b8b845f01518560200151604051611ccb95949392919067ffffffffffffffff9590951685526001600160a01b03938416602086015291831660408501529091166060830152608082015260a00190565b60405180910390a150600101611b4b565b505050505050505050565b611cef611d9a565b6001600160a01b038116611d1857604051631e4fbdf760e01b81525f60048201526024016106ef565b6111bc81612380565b6040516001600160a01b03838116602483015260448201839052611d9591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123cf565b505050565b5f546001600160a01b031633146111265760405163118cdaa760e01b81523360048201526024016106ef565b6040516001600160a01b03848116602483015283811660448301526064820183905261110f9186918216906323b872dd90608401611d4e565b5f80602083013560011615611e1857600360f81b611e1e565b600160f91b5b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152843560218201529091505f9060029060410160408051601f1981840301815290829052611e7591612a6b565b602060405180830381855afa158015611e90573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611eb39190612a81565b9050600381604051602001611eca91815260200190565b60408051601f1981840301815290829052611ee491612a6b565b602060405180830381855afa158015611eff573d5f5f3e3d5ffd5b5050604051516001600160a01b031695945050505050565b5f81604051602001611f299190612a98565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000115611fc0576001600160a01b0382165f90815260036020526040902054439003611fa557604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f03611fcb575050565b6001544303611ff25780600180015f828254611fe79190612939565b90915550611ffc9050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561144c5760405163a74c1c5f60e01b815260040160405180910390fd5b5f5f5f5f61204f8888888861243b565b92509250925061205f8282612503565b50909695505050505050565b345f5b825181101561235c575f83828151811061208a5761208a6129b3565b60209081029190910181015180516001600160a01b03165f908152600983526040908190208151608081018352815460ff811615158252610100900467ffffffffffffffff16818601526001820154928101929092526002015460608201529181015190925061210d57604051630dd484e760e41b815260040160405180910390fd5b602081015182519067ffffffffffffffff166121485760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b038087165f908152600b6020908152604080832086519094168352929052205460608201518110156121ce575f81836060015161218d91906129e2565b6020850151855191925082908111156121ca576040516349cd40ff60e01b81526001600160a01b03909216600483015260248201526044016106ef565b5050505b82516001600160a01b031661220e57602083015185811461220557604051630a61be9f60e41b81526004016106ef91815260200190565b505f945061222e565b6020830151835161222e916001600160a01b039091169033903090611dc6565b60208084015184516001600160a01b03165f908152600a90925260408220546122579190612939565b905082604001515f148061226f575080836040015110155b8451604085015190916122a65760405163421dca0560e11b81526001600160a01b03909216600483015260248201526044016106ef565b505083516001600160a01b039081165f908152600a60209081526040808320859055818801518c85168452600b83528184208951909516845293909152812080549091906122f5908490612939565b90915550508351602080860151604080516001600160a01b038d811682529094169284019290925282820152517fec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f39181900360600190a150506001909201915061206e9050565b505f811561110f57604051630a61be9f60e41b81526004016106ef91815260200190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f60205f8451602086015f885af1806123ee576040513d5f823e3d81fd5b50505f513d91508115612405578060011415612412565b6001600160a01b0384163b155b1561110f57604051635274afe760e01b81526001600160a01b03851660048201526024016106ef565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561247457505f915060039050826124f9565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124c5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124f057505f9250600191508290506124f9565b92505f91508190505b9450945094915050565b5f82600381111561251657612516612aa5565b0361251f575050565b600182600381111561253357612533612aa5565b036125515760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561256557612565612aa5565b036125865760405163fce698f760e01b8152600481018290526024016106ef565b600382600381111561259a5761259a612aa5565b0361144c576040516335e2f38360e21b8152600481018290526024016106ef565b80356001600160a01b03811681146125d1575f5ffd5b919050565b5f5f604083850312156125e7575f5ffd5b6125f0836125bb565b91506125fe602084016125bb565b90509250929050565b803567ffffffffffffffff811681146125d1575f5ffd5b5f5f5f5f60808587031215612631575f5ffd5b61263a85612607565b9350612648602086016125bb565b9250612656604086016125bb565b9396929550929360600135925050565b5f60208284031215612676575f5ffd5b61267f826125bb565b9392505050565b5f60208284031215612696575f5ffd5b5035919050565b80604081018310156126ad575f5ffd5b92915050565b5f604082840312156126c3575f5ffd5b61267f838361269d565b60ff811681146111bc575f5ffd5b5f5f5f5f60a085870312156126ee575f5ffd5b6126f8868661269d565b935060408501359250606085013591506080850135612716816126cd565b939692955090935050565b602080825282518282018190525f918401906040840190835b8181101561276d57835180516001600160a01b03168452602090810151818501529093019260409092019160010161273a565b509095945050505050565b5f5f5f5f6080858703121561278b575f5ffd5b612794856125bb565b93506127a260208601612607565b93969395505050506040820135916060013590565b5f5f604083850312156127c8575f5ffd5b6127d1836125bb565b946020939093013593505050565b5f5f83601f8401126127ef575f5ffd5b50813567ffffffffffffffff811115612806575f5ffd5b6020830191508360208260061b8501011115612820575f5ffd5b9250929050565b5f5f5f60408486031215612839575f5ffd5b612842846125bb565b9250602084013567ffffffffffffffff81111561285d575f5ffd5b612869868287016127df565b9497909650939450505050565b5f5f60408385031215612887575f5ffd5b612890836125bb565b91506125fe60208401612607565b5f5f5f5f608085870312156128b1575f5ffd5b6128ba85612607565b93506127a2602086016125bb565b5f5f5f5f606085870312156128db575f5ffd5b6128e4856125bb565b93506128f2602086016125bb565b9250604085013567ffffffffffffffff81111561290d575f5ffd5b612919878288016127df565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126ad576126ad612925565b5f67ffffffffffffffff821667ffffffffffffffff810361296f5761296f612925565b60010192915050565b6001600160a01b038481168252831660208201526080810160408381840137949350505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156129d7575f5ffd5b815161267f816126cd565b818103818111156126ad576126ad612925565b634e487b7160e01b5f52603160045260245ffd5b5f6040828403128015612a1a575f5ffd5b506040805190810167ffffffffffffffff81118282101715612a4a57634e487b7160e01b5f52604160045260245ffd5b604052612a56836125bb565b81526020928301359281019290925250919050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612a91575f5ffd5b5051919050565b6040828237604001919050565b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f1b4ea97bebb568a945345fed882f3d3219b3e44", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x106c0985205591d03b09a6d23c055855b032fd01222765f63a853daa589b33f5": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3": "0x00000000000000000000000000000000000000000000000014d1120d7b160000", + "0x1aa40fcda5613db4a6323ad2a6558319c7c32684d4aea3b9d3cbf3b5225809f9": "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x3c7f400b3f98b3434d83022fb3e72214a13add6711ad003fdbb3d6192982d983": "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x60ea9dbdabefa70d6dbbd307114861b1f51f2d42da767df414b1ef1945cb3581": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x6f7d694851573f774a58b364bb8c0d9d3b4ab995b5140adbd4d2a0f7652ba644": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x7dd9637047b493acfa24ead1da2827dd0a32a776fc046018bd792560909912ce": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x894366103b9216ec3096733a4e01ed6d449b8cb12ae40e56cd89e782124b59d3": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x99abd277bea7f6c608aad19adca16ce472b89087c841c85adb993eafd9a2d453": "0x00000000000000000000000032444c83c841146a92ad936cdd93b93b9898f6b9", + "0xb3fda58c873ab206ee2664215be39a4bca1f19afe308665e3f2c5a5ec461169e": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xd6436e0ee4fde07a4728cd348ac6eb2d27f37c2fd804cb187ac551678df182f7": "0x00000000000000000000000009ccd1cb6be49c131c0dd636c95b4e4f5bc549ad", + "0xe6a7d98f4a2fd6db136cdb1df79c32f479b6588daa53504aaefd8dc21096cddc": "0x000000000000000000000000a3ae64125631f56b1b96b113a79545f4684e67bb", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b": "0x0000000000000000000000000000000000000000000000000000000007a12001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c": "0x00000000000000000000000000000000000000000000001043561a8829300000", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0xef87d982b34d4475bf5573f4f6f0ce6070181760618517e68e51cedd99505bd2": "0x0000000000000000000000000000000000000000000000000000000000000023", + "0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "bc10000000000000000000000000000000000005": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b5060043610610064575f3560e01c806385df51fd1161004d57806385df51fd1461009d57806394f490bd146100bc578063e405bbc3146100d1575f5ffd5b8063107bf28c1461006857806326a6557a14610086575b5f5ffd5b6100706100da565b60405161007d91906101fe565b60405180910390f35b61008f60015481565b60405190815260200161007d565b61008f6100ab366004610233565b5f9081526003602052604090205490565b6100cf6100ca366004610233565b610165565b005b61008f60025481565b5f80546100e69061024a565b80601f01602080910402602001604051908101604052809291908181526020018280546101129061024a565b801561015d5780601f106101345761010080835404028352916020019161015d565b820191905f5260205f20905b81548152906001019060200180831161014057829003601f168201915b505050505081565b3373bc100000000000000000000000000000000010001461019957604051634ca8886760e01b815260040160405180910390fd5b5f60025f81546101a890610282565b91829055505f8181526003602052604090819020849055519091507fdd5483f1119d050d70b0fe3ed9db0b5f41b3ec55838346cbb624efe0565b0133906101f29083815260200190565b60405180910390a15050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610243575f5ffd5b5035919050565b600181811c9082168061025e57607f821691505b60208210810361027c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6001820161029f57634e487b7160e01b5f52601160045260245ffd5b506001019056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x6d61696e6e65740000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000000000000000d519d", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d519d", + "0xc991b534b29466ed64c97db2fe70276f8140e097d9e6f020f7ee820e53a8fd3e": "0x2ec9b932e108cbf1254a4afcb19afe38230f368e95c100000000000000000000" + } + }, + "BC10000000000000000000000000000000000006": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c80638da5cb5b11610072578063a3ec138d11610058578063a3ec138d1461015e578063cd57654314610180578063f2fde38b146101a2575f5ffd5b80638da5cb5b1461011257806398611f121461012c575f5ffd5b8063715018a6116100a2578063715018a6146100ee578063827fb811146100f657806386c1ff68146100ff575f5ffd5b80632ddbd13a146100bd5780637090a943146100d9575b5f5ffd5b6100c660015481565b6040519081526020015b60405180910390f35b6100ec6100e7366004610602565b6101b5565b005b6100ec6103c4565b6100c661010081565b6100ec61010d36600461062a565b6103d7565b5f546040516001600160a01b0390911681526020016100d0565b61014e61013a36600461064a565b60026020525f908152604090205460ff1681565b60405190151581526020016100d0565b61014e61016c36600461062a565b60036020525f908152604090205460ff1681565b61014e61018e36600461062a565b60046020525f908152604090205460ff1681565b6100ec6101b036600461062a565b610517565b6101bd610554565b5f8181526002602052604090205460ff16156102205760405162461bcd60e51b815260206004820152600e60248201527f6475706c696361746564206b657900000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0382165f9081526003602052604090205460ff16156102885760405162461bcd60e51b815260206004820152601060248201527f6475706c69636174656420766f746572000000000000000000000000000000006044820152606401610217565b6001600160a01b0382165f9081526004602052604090205460ff16156102f05760405162461bcd60e51b815260206004820152600d60248201527f64656c6574656420766f746572000000000000000000000000000000000000006044820152606401610217565b61010060015f815461030190610675565b9182905550106103535760405162461bcd60e51b815260206004820152600f60248201527f746f6f206d616e7920766f7465727300000000000000000000000000000000006044820152606401610217565b6001600160a01b0382165f8181526003602090815260408083208054600160ff199182168117909255868552600284529382902080549094161790925590518381527f101c617f43dd1b8a54a9d747d9121bbc55e93b88bc50560d782a79c4e28fc838910160405180910390a25050565b6103cc610554565b6103d55f610580565b565b6103df610554565b6001600160a01b0381165f9081526003602052604090205460ff166104465760405162461bcd60e51b815260206004820152600f60248201527f766f746572206e6f7420666f756e6400000000000000000000000000000000006044820152606401610217565b60018054116104975760405162461bcd60e51b815260206004820152600e60248201527f746f6f2066657720766f746572730000000000000000000000000000000000006044820152606401610217565b6001600160a01b0381165f908152600360209081526040808320805460ff1990811690915560049092528220805490911660019081179091558054916104dc8361068d565b90915550506040516001600160a01b038216907f183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e8905f90a250565b61051f610554565b6001600160a01b03811661054857604051631e4fbdf760e01b81525f6004820152602401610217565b61055181610580565b50565b5f546001600160a01b031633146103d55760405163118cdaa760e01b8152336004820152602401610217565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146105fd575f5ffd5b919050565b5f5f60408385031215610613575f5ffd5b61061c836105e7565b946020939093013593505050565b5f6020828403121561063a575f5ffd5b610643826105e7565b9392505050565b5f6020828403121561065a575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161068657610686610661565b5060010190565b5f8161069b5761069b610661565b505f19019056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000e37325b734bd2b6fb5c6b52a7f4e64924ce5ee59", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x2265dd02e08e0ee36a5e9ce6da32951e363b8c69f4ff80942477d3d2e9e512ba": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x288a5b9bcf6841facb516c72405426ccc637c16b13d98147079c51cd07e901cb": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x3d1b6cb6a1e8fb80e9dec25932bc375fe25b9c04410bd0a1b8a6e0feadada5ea": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x4206cb9bbadbc033b8a96f61fc72f1c5d136e91e83a4389748deac4f4798aa18": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x5d612cf55902f8121082782d907c246831964e30178f0457241031fff86a42ef": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x629e603f7d508c59e4f8d2acdb9972a8a911433feb2fd2c334e50ff62be90dc6": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xaba13f20df8ae925f0709766b1e827991be081958fac916fc506f4cfb33235aa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xbccd416a65e1ae100c689827d7a6c42e3018d262788a21bd80cbe319d18549b5": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xeb95e26b7db7c270130bc0fa53c0bbd3b0ffaeb093780826ea4879b5020f4d11": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "Bc10000000000000000000000000000000000007": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063023276f01461002d575b5f5ffd5b61004061003b3660046100f0565b610042565b005b5f5f5f1b82604051610053906100e3565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103905ff590508015801561008d573d5f5f3e3d5ffd5b5060405173ffffffffffffffffffffffffffffffffffffffff8083168252919250908316907f587ece4cd19692c5be1a4184503d607d45542d2aca0698c0068f52e09ccb541c9060200160405180910390a25050565b6111178061012b83390190565b5f60208284031215610100575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610123575f5ffd5b939250505056fe60c060405234801561000f575f5ffd5b5060405161111738038061111783398101604081905261002e91610233565b806001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610069573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100909190810190610274565b6040516020016100a0919061033b565b604051602081830303815290604052816001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100ea573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101119190810190610274565b6040516020016101219190610370565b60408051601f19818403018152919052600361013d8382610411565b50600461014a8282610411565b5050505f816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561018a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ae91906104cb565b60ff1690506012811080156101c257505f81115b6102055760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b604482015260640160405180910390fd5b6001600160a01b03821660805261021d8160126104ff565b61022890600a6105fb565b60a052506106069050565b5f60208284031215610243575f5ffd5b81516001600160a01b0381168114610259575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610284575f5ffd5b81516001600160401b03811115610299575f5ffd5b8201601f810184136102a9575f5ffd5b80516001600160401b038111156102c2576102c2610260565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102f0576102f0610260565b604052818152828201602001861015610307575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f81518060208401855e5f93019283525090919050565b5f6103468284610324565b600160fd1b81526f29ba30b73230b932102bb930b83832b960811b60018201526011019392505050565b5f61037b8284610324565b61535760f01b81526002019392505050565b600181811c908216806103a157607f821691505b6020821081036103bf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561040c57805f5260205f20601f840160051c810160208510156103ea5750805b601f840160051c820191505b81811015610409575f81556001016103f6565b50505b505050565b81516001600160401b0381111561042a5761042a610260565b61043e81610438845461038d565b846103c5565b6020601f821160018114610470575f83156104595750848201515b5f19600385901b1c1916600184901b178455610409565b5f84815260208120601f198516915b8281101561049f578785015182556020948501946001909201910161047f565b50848210156104bc57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156104db575f5ffd5b815160ff81168114610259575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610512576105126104eb565b92915050565b6001815b600184111561055357808504811115610537576105376104eb565b600184161561054557908102905b60019390931c92800261051c565b935093915050565b5f8261056957506001610512565b8161057557505f610512565b816001811461058b5760028114610595576105b1565b6001915050610512565b60ff8411156105a6576105a66104eb565b50506001821b610512565b5060208310610133831016604e8410600b84101617156105d4575081810a610512565b6105e05f198484610518565b805f19048211156105f3576105f36104eb565b029392505050565b5f610259838361055b565b60805160a051610acd61064a5f395f818161016d015281816103370152818161038f015261046401525f8181610194015281816103be015261042b0152610acd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80633ba0b9a91161008857806395d89b411161006357806395d89b41146101f6578063a9059cbb146101fe578063b6b55f2514610211578063dd62ed3e14610224575f5ffd5b80633ba0b9a9146101685780636f307dc31461018f57806370a08231146101ce575f5ffd5b806323b872dd116100b857806323b872dd146101315780632e1a7d4d14610144578063313ce56714610159575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e661025c565b6040516100f391906108f6565b60405180910390f35b61010f61010a366004610946565b6102ec565b60405190151581526020016100f3565b6002545b6040519081526020016100f3565b61010f61013f36600461096e565b610305565b6101576101523660046109a8565b610328565b005b604051601281526020016100f3565b6101237f000000000000000000000000000000000000000000000000000000000000000081565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100f3565b6101236101dc3660046109bf565b6001600160a01b03165f9081526020819052604090205490565b6100e66103e9565b61010f61020c366004610946565b6103f8565b61015761021f3660046109a8565b610405565b6101236102323660046109df565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461026b90610a10565b80601f016020809104026020016040519081016040528092919081815260200182805461029790610a10565b80156102e25780601f106102b9576101008083540402835291602001916102e2565b820191905f5260205f20905b8154815290600101906020018083116102c557829003601f168201915b5050505050905090565b5f336102f981858561048e565b60019150505b92915050565b5f336103128582856104a0565b61031d858585610520565b506001949350505050565b5f8111801561035e575061035c7f000000000000000000000000000000000000000000000000000000000000000082610a5c565b155b61037b57604051632a9ffab760e21b815260040160405180910390fd5b33610386818361057d565b6103e5816103b47f000000000000000000000000000000000000000000000000000000000000000085610a83565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906105b1565b5050565b60606004805461026b90610a10565b5f336102f9818585610520565b5f811161042557604051632a9ffab760e21b815260040160405180910390fd5b3361045b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316823085610625565b6103e5816104897f000000000000000000000000000000000000000000000000000000000000000085610a96565b61065e565b61049b8383836001610692565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461051a578181101561050c57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61051a84848484035f610692565b50505050565b6001600160a01b03831661054957604051634b637e8f60e11b81525f6004820152602401610503565b6001600160a01b0382166105725760405163ec442f0560e01b81525f6004820152602401610503565b61049b838383610764565b6001600160a01b0382166105a657604051634b637e8f60e11b81525f6004820152602401610503565b6103e5825f83610764565b6040516001600160a01b0383811660248301526044820183905261049b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061088a565b6040516001600160a01b03848116602483015283811660448301526064820183905261051a9186918216906323b872dd906084016105de565b6001600160a01b0382166106875760405163ec442f0560e01b81525f6004820152602401610503565b6103e55f8383610764565b6001600160a01b0384166106bb5760405163e602df0560e01b81525f6004820152602401610503565b6001600160a01b0383166106e457604051634a1406b160e11b81525f6004820152602401610503565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561051a57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161075691815260200190565b60405180910390a350505050565b6001600160a01b03831661078e578060025f8282546107839190610aad565b909155506107fe9050565b6001600160a01b0383165f90815260208190526040902054818110156107e05760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610503565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661081a57600280548290039055610838565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161087d91815260200190565b60405180910390a3505050565b5f5f60205f8451602086015f885af1806108a9576040513d5f823e3d81fd5b50505f513d915081156108c05780600114156108cd565b6001600160a01b0384163b155b1561051a57604051635274afe760e01b81526001600160a01b0385166004820152602401610503565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610941575f5ffd5b919050565b5f5f60408385031215610957575f5ffd5b6109608361092b565b946020939093013593505050565b5f5f5f60608486031215610980575f5ffd5b6109898461092b565b92506109976020850161092b565b929592945050506040919091013590565b5f602082840312156109b8575f5ffd5b5035919050565b5f602082840312156109cf575f5ffd5b6109d88261092b565b9392505050565b5f5f604083850312156109f0575f5ffd5b6109f98361092b565b9150610a076020840161092b565b90509250929050565b600181811c90821680610a2457607f821691505b602082108103610a4257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601260045260245ffd5b5f82610a6a57610a6a610a48565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82610a9157610a91610a48565b500490565b80820281158282048414176102ff576102ff610a6f565b808201808211156102ff576102ff610a6f56fea164736f6c634300081b000aa164736f6c634300081b000a", + "storage": {} + }, + "BC10000000000000000000000000000000000Da0": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6080604052600436106102f0575f3560e01c80637d5e81e211610186578063bc197c81116100dc578063e540d01d11610087578063f23a6e6111610062578063f23a6e611461097e578063f8ce560a146109a9578063fc0c546a146109c8575f5ffd5b8063e540d01d14610921578063eb9019d414610940578063ece40cc11461095f575f5ffd5b8063c59057e4116100b7578063c59057e41461088a578063dd4e2ba5146108a9578063deaaa7cc146108ee575f5ffd5b8063bc197c811461082d578063c01f9e3714610858578063c28bc2fa14610877575f5ffd5b806397c3d3341161013c578063a9a9529411610117578063a9a95294146107c4578063ab58fb8e146107e3578063b58131b014610819575f5ffd5b806397c3d3341461077e5780639a802a6d14610791578063a7713a70146107b0575f5ffd5b806384b0196e1161016c57806384b0196e1461070d5780638ff262e31461073457806391ddadf414610753575f5ffd5b80637d5e81e2146106ba5780637ecebe00146106d9575f5ffd5b80633e4f49e61161024657806356781388116101f157806360c4247f116101cc57806360c4247f1461065d578063790518871461067c5780637b3c71d31461069b575f5ffd5b806356781388146106005780635b8d0e0d1461061f5780635f398a141461063e575f5ffd5b80634bf5d7e9116102215780634bf5d7e914610570578063544ffc9c1461058457806354fd4d50146105d7575f5ffd5b80633e4f49e6146104dd5780634385963214610509578063452115d614610551575f5ffd5b8063150b7a02116102a65780632d63f693116102815780632d63f6931461045c5780632fe3e261146104965780633932abb1146104c9575f5ffd5b8063150b7a02146103e7578063160cbed71461042a5780632656227d14610449575f5ffd5b806306f3f9e6116102d657806306f3f9e61461035b57806306fdde031461037a578063143489d01461039b575f5ffd5b806301ffc9a7146102fc57806302a251a314610330575f5ffd5b366102f8575b005b5f5ffd5b348015610307575f5ffd5b5061031b610316366004612c6c565b6109fa565b60405190151581526020015b60405180910390f35b34801561033b575f5ffd5b50600854600160301b900463ffffffff165b604051908152602001610327565b348015610366575f5ffd5b506102f6610375366004612c93565b610a50565b348015610385575f5ffd5b5061038e610a64565b6040516103279190612cd8565b3480156103a6575f5ffd5b506103cf6103b5366004612c93565b5f908152600460205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610327565b3480156103f2575f5ffd5b50610411610401366004612dc5565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610327565b348015610435575f5ffd5b5061034d610444366004612f88565b610af4565b61034d610457366004612f88565b610b3c565b348015610467575f5ffd5b5061034d610476366004612c93565b5f90815260046020526040902054600160a01b900465ffffffffffff1690565b3480156104a1575f5ffd5b5061034d7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b3480156104d4575f5ffd5b5061034d610c7f565b3480156104e8575f5ffd5b506104fc6104f7366004612c93565b610c91565b6040516103279190613052565b348015610514575f5ffd5b5061031b610523366004613060565b5f8281526009602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561055c575f5ffd5b5061034d61056b366004612f88565b610dda565b34801561057b575f5ffd5b5061038e610e46565b34801561058f575f5ffd5b506105bc61059e366004612c93565b5f908152600960205260409020805460018201546002909201549092565b60408051938452602084019290925290820152606001610327565b3480156105e2575f5ffd5b506040805180820190915260018152603160f81b602082015261038e565b34801561060b575f5ffd5b5061034d61061a36600461309a565b610f06565b34801561062a575f5ffd5b5061034d610639366004613100565b610f2d565b348015610649575f5ffd5b5061034d6106583660046131bd565b611089565b348015610668575f5ffd5b5061034d610677366004612c93565b6110dc565b348015610687575f5ffd5b506102f6610696366004613253565b611168565b3480156106a6575f5ffd5b5061034d6106b536600461326e565b611179565b3480156106c5575f5ffd5b5061034d6106d43660046132c4565b6111bf565b3480156106e4575f5ffd5b5061034d6106f3366004613384565b6001600160a01b03165f9081526002602052604090205490565b348015610718575f5ffd5b50610721611275565b60405161032797969594939291906133d7565b34801561073f575f5ffd5b5061034d61074e366004613444565b6112b7565b34801561075e575f5ffd5b50610767611386565b60405165ffffffffffff9091168152602001610327565b348015610789575f5ffd5b50606461034d565b34801561079c575f5ffd5b5061034d6107ab366004613490565b61140d565b3480156107bb575f5ffd5b5061034d611423565b3480156107cf575f5ffd5b5061031b6107de366004612c93565b505f90565b3480156107ee575f5ffd5b5061034d6107fd366004612c93565b5f9081526004602052604090206001015465ffffffffffff1690565b348015610824575f5ffd5b5061034d61143c565b348015610838575f5ffd5b506104116108473660046134e3565b63bc197c8160e01b95945050505050565b348015610863575f5ffd5b5061034d610872366004612c93565b611446565b6102f6610885366004613579565b611488565b348015610895575f5ffd5b5061034d6108a4366004612f88565b611504565b3480156108b4575f5ffd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e9082015261038e565b3480156108f9575f5ffd5b5061034d7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b34801561092c575f5ffd5b506102f661093b3660046135b7565b61153d565b34801561094b575f5ffd5b5061034d61095a3660046135da565b61154e565b34801561096a575f5ffd5b506102f6610979366004612c93565b61156d565b348015610989575f5ffd5b50610411610998366004613602565b63f23a6e6160e01b95945050505050565b3480156109b4575f5ffd5b5061034d6109c3366004612c93565b61157e565b3480156109d3575f5ffd5b507f000000000000000000000000bc100000000000000000000000000000000000016103cf565b5f6001600160e01b031982166332a2ad4360e11b1480610a2a57506001600160e01b03198216630271189760e51b145b80610a4557506301ffc9a760e01b6001600160e01b03198316145b92915050565b905090565b610a58611588565b610a61816115bf565b50565b606060038054610a7390613656565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613656565b8015610aea5780601f10610ac157610100808354040283529160200191610aea565b820191905f5260205f20905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b5f5f610b0286868686611504565b9050610b1781610b126004611654565b611676565b505f604051634844252360e11b815260040160405180910390fd5b5095945050505050565b5f5f610b4a86868686611504565b9050610b6a81610b5a6005611654565b610b646004611654565b17611676565b505f81815260046020526040902080547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f01b17905530610bac3090565b6001600160a01b031614610c35575f5b8651811015610c3357306001600160a01b0316878281518110610be157610be161368e565b60200260200101516001600160a01b031603610c2b57610c2b858281518110610c0c57610c0c61368e565b60200260200101518051906020012060056116b390919063ffffffff16565b600101610bbc565b505b610c428187878787611726565b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b5f610a4b60085465ffffffffffff1690565b5f818152600460205260408120805460ff600160f01b8204811691600160f81b9004168115610cc557506007949350505050565b8015610cd657506002949350505050565b5f85815260046020526040812054600160a01b900465ffffffffffff169050805f03610d1d57604051636ad0607560e01b8152600481018790526024015b60405180910390fd5b5f610d26611386565b65ffffffffffff169050808210610d4357505f9695505050505050565b5f610d4d88611446565b9050818110610d6457506001979650505050505050565b610d6d886117fb565b1580610d8c57505f888152600960205260409020805460019091015411155b15610d9f57506003979650505050505050565b5f8881526004602052604090206001015465ffffffffffff165f03610dcc57506004979650505050505050565b506005979650505050505050565b5f5f610de886868686611504565b9050610df781610b125f611654565b505f818152600460205260409020546001600160a01b03163314610e305760405163233d98e360e01b8152336004820152602401610d14565b610e3c8686868661184b565b9695505050505050565b60607f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b0316634bf5d7e96040518163ffffffff1660e01b81526004015f60405180830381865afa925050508015610ec557506040513d5f823e601f3d908101601f19168201604052610ec291908101906136a2565b60015b610f01575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b5f80339050610f2584828560405180602001604052805f815250611912565b949350505050565b5f5f61100e876110087f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c610f808e6001600160a01b03165f90815260026020526040902080546001810190915590565b8d8d604051610f90929190613717565b60405180910390208c80519060200120604051602001610fed9796959493929190968752602087019590955260ff9390931660408601526001600160a01b03919091166060850152608084015260a083015260c082015260e00190565b6040516020818303038152906040528051906020012061193c565b85611968565b905080611039576040516394ab6c0760e01b81526001600160a01b0388166004820152602401610d14565b61107c89888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508b92506119d8915050565b9998505050505050505050565b5f803390506110d187828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506119d8915050565b979650505050505050565b600a80545f9182906110ef60018461373a565b815481106110ff576110ff61368e565b5f918252602090912001805490915065ffffffffffff811690600160301b90046001600160d01b0316858211611141576001600160d01b031695945050505050565b61115561114d87611acb565b600a90611b01565b6001600160d01b03169695505050505050565b611170611588565b610a6181611bb0565b5f80339050610e3c86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061191292505050565b5f336111cb8184611c16565b6111f35760405163d9b3955760e01b81526001600160a01b0382166004820152602401610d14565b5f6111fc61143c565b90508015611268575f61122a836001611213611386565b61121d919061374d565b65ffffffffffff1661154e565b90508181101561126657604051636121770b60e11b81526001600160a01b03841660048201526024810182905260448101839052606401610d14565b505b6110d18787878786611d34565b5f6060805f5f5f6060611286611f8a565b61128e611fb6565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f611341846110087ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d789898961130a8b6001600160a01b03165f90815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff90911660608401526001600160a01b0316608083015260a082015260c001610fed565b90508061136c576040516394ab6c0760e01b81526001600160a01b0385166004820152602401610d14565b610e3c86858760405180602001604052805f815250611912565b5f7f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611401575060408051601f3d908101601f191682019092526113fe9181019061376b565b60015b610f0157610a4b611fe3565b5f611419848484611fed565b90505b9392505050565b5f61142e600a612080565b6001600160d01b0316905090565b5f610a4b60075490565b5f8181526004602052604081205461147a90600160d01b810463ffffffff1690600160a01b900465ffffffffffff16613786565b65ffffffffffff1692915050565b611490611588565b5f5f856001600160a01b03168585856040516114ad929190613717565b5f6040518083038185875af1925050503d805f81146114e7576040519150601f19603f3d011682016040523d82523d5f602084013e6114ec565b606091505b50915091506114fb82826120b7565b50505050505050565b5f8484848460405160200161151c9493929190613837565b60408051601f19818403018152919052805160209091012095945050505050565b611545611588565b610a61816120d3565b5f61141c838361156860408051602081019091525f815290565b611fed565b611575611588565b610a618161216f565b5f610a45826121b0565b3033146115aa576040516347096e4760e01b8152336004820152602401610d14565b565b806115b76005612257565b036115ac5750565b6064808211156115ec5760405163243e544560e01b81526004810183905260248101829052604401610d14565b5f6115f5611423565b9050611614611602611386565b61160b856122d6565b600a9190612309565b505060408051828152602081018590527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a1505050565b5f8160078111156116675761166761301e565b600160ff919091161b92915050565b5f5f61168184610c91565b90505f8361168e83611654565b160361141c578381846040516331b75e4d60e01b8152600401610d1493929190613881565b81546fffffffffffffffffffffffffffffffff600160801b8204811691811660018301909116036116e8576116e86041612323565b6fffffffffffffffffffffffffffffffff8082165f90815260018086016020526040909120939093558354919092018216600160801b029116179055565b5f5b84518110156117f3575f5f8683815181106117455761174561368e565b60200260200101516001600160a01b03168684815181106117685761176861368e565b60200260200101518685815181106117825761178261368e565b602002602001015160405161179791906138a3565b5f6040518083038185875af1925050503d805f81146117d1576040519150601f19603f3d011682016040523d82523d5f602084013e6117d6565b606091505b50915091506117e582826120b7565b505050806001019050611728565b505050505050565b5f8181526009602052604081206002810154600182015461181c91906138b9565b5f8481526004602052604090205461184290600160a01b900465ffffffffffff1661157e565b11159392505050565b5f5f61185986868686611504565b90506118a7816118696007611654565b6118736006611654565b61187d6002611654565b600161188a6007826138cc565b6118959060026139c0565b61189f919061373a565b181818611676565b505f818152600460205260409081902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610c6e9083815260200190565b5f6119338585858561192e60408051602081019091525f815290565b6119d8565b95945050505050565b5f610a45611948612334565b8360405161190160f01b8152600281019290925260228201526042902090565b5f836001600160a01b03163b5f036119c6575f5f611986858561245d565b5090925090505f81600381111561199f5761199f61301e565b1480156119bd5750856001600160a01b0316826001600160a01b0316145b9250505061141c565b6119d18484846124a6565b905061141c565b5f6119e786610b126001611654565b505f86815260046020526040812054611a11908790600160a01b900465ffffffffffff1685611fed565b90505f611a218888888588612591565b905083515f03611a7757866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051611a6a94939291906139ce565b60405180910390a26110d1565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051611ab89594939291906139f5565b60405180910390a2979650505050505050565b5f65ffffffffffff821115611afd576040516306dfcc6560e41b81526030600482015260248101839052604401610d14565b5090565b81545f9081816005811115611b5d575f611b1a8461268d565b611b24908561373a565b5f8881526020902090915081015465ffffffffffff9081169087161015611b4d57809150611b5b565b611b588160016138b9565b92505b505b5f611b6a878785856127e5565b90508015611ba457611b8e87611b8160018461373a565b5f91825260209091200190565b54600160301b90046001600160d01b03166110d1565b5f979650505050505050565b6008546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b80515f906034811015611c2d576001915050610a45565b828101601319015173ffffffffffffffffffffffffffffffffffffffff1981167f2370726f706f7365723d3078000000000000000000000000000000000000000014611c7e57600192505050610a45565b5f80611c8b60288561373a565b90505b83811015611d13575f5f611cd9888481518110611cad57611cad61368e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016612844565b9150915081611cf15760019650505050505050610a45565b8060ff166004856001600160a01b0316901b1793505050806001019050611c8e565b50856001600160a01b0316816001600160a01b031614935050505092915050565b5f611d488686868680519060200120611504565b905084518651141580611d5d57508351865114155b80611d6757508551155b15611d9c57855184518651604051630447b05d60e41b8152600481019390935260248301919091526044820152606401610d14565b5f81815260046020526040902054600160a01b900465ffffffffffff1615611de55780611dc882610c91565b6040516331b75e4d60e01b8152610d149291905f90600401613881565b5f611dee610c7f565b611df6611386565b65ffffffffffff16611e0891906138b9565b90505f611e2260085463ffffffff600160301b9091041690565b5f848152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716178155909150611e6183611acb565b815465ffffffffffff91909116600160a01b027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff909116178155611ea4826128d4565b815463ffffffff91909116600160d01b027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff90911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c9067ffffffffffffffff811115611f2057611f20612d00565b604051908082528060200260200182016040528015611f5357816020015b6060815260200190600190039081611f3e5790505b508c89611f608a826138b9565b8e604051611f7699989796959493929190613a3a565b60405180910390a150505095945050505050565b6060610a4b7f476f617444414f000000000000000000000000000000000000000000000000075f612904565b6060610a4b7f31000000000000000000000000000000000000000000000000000000000000016001612904565b5f610a4b43611acb565b5f7f000000000000000000000000bc10000000000000000000000000000000000001604051630748d63560e31b81526001600160a01b038681166004830152602482018690529190911690633a46b1a890604401602060405180830381865afa15801561205c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114199190613b14565b80545f9080156120af5761209983611b8160018461373a565b54600160301b90046001600160d01b031661141c565b5f9392505050565b6060826120cc576120c7826129ad565b610a45565b5080610a45565b8063ffffffff165f036120fb5760405163f1cfbf0560e01b81525f6004820152602401610d14565b6008546040805163ffffffff600160301b9093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a16008805463ffffffff909216600160301b0269ffffffff00000000000019909216919091179055565b60075460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600755565b5f60646121bc836110dc565b604051632394e7a360e21b8152600481018590526001600160a01b037f000000000000000000000000bc100000000000000000000000000000000000011690638e539e8c90602401602060405180830381865afa15801561221f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122439190613b14565b61224d9190613b2b565b610a459190613b56565b80545f906fffffffffffffffffffffffffffffffff80821691600160801b9004168103612288576122886031612323565b6fffffffffffffffffffffffffffffffff8181165f908152600185810160205260408220805492905585546fffffffffffffffffffffffffffffffff19169301909116919091179092555090565b5f6001600160d01b03821115611afd576040516306dfcc6560e41b815260d0600482015260248101839052604401610d14565b5f806123168585856129d6565b915091505b935093915050565b634e487b715f52806020526024601cfd5b5f306001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614801561238c57507f000000000000000000000000000000000000000000000000000000000000092946145b156123b657507f11edf9fdf74ba9ddace6e4419fc288cc48a4df2998d6128b49c405cedad7355890565b610a4b604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f7081057b801cf71f391bb13ad68bb1be4f896665916f118ed4c6811f09fe527c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f8351604103612494576020840151604085015160608601515f1a61248688828585612b26565b95509550955050505061249f565b505081515f91506002905b9250925092565b5f5f5f856001600160a01b031685856040516024016124c6929190613b75565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16630b135d3f60e11b1790525161251091906138a3565b5f60405180830381855afa9150503d805f8114612548576040519150601f19603f3d011682016040523d82523d5f602084013e61254d565b606091505b509150915081801561256157506020815110155b8015610e3c57508051630b135d3f60e11b906125869083016020908101908401613b14565b149695505050505050565b5f8581526009602090815260408083206001600160a01b03881684526003810190925282205460ff16156125e3576040516371c6af4960e01b81526001600160a01b0387166004820152602401610d14565b6001600160a01b0386165f9081526003820160205260409020805460ff1916600117905560ff851661262c5783815f015f82825461262191906138b9565b909155506126829050565b5f1960ff86160161264a5783816001015f82825461262191906138b9565b60011960ff8616016126695783816002015f82825461262191906138b9565b6040516303599be160e11b815260040160405180910390fd5b509195945050505050565b5f6001821161269a575090565b816001600160801b82106126b35760809190911c9060401b5b6801000000000000000082106126ce5760409190911c9060201b5b64010000000082106126e55760209190911c9060101b5b6201000082106126fa5760109190911c9060081b5b610100821061270e5760089190911c9060041b5b601082106127215760049190911c9060021b5b6004821061272d5760011b5b600302600190811c9081858161274557612745613b42565b048201901c9050600181858161275d5761275d613b42565b048201901c9050600181858161277557612775613b42565b048201901c9050600181858161278d5761278d613b42565b048201901c905060018185816127a5576127a5613b42565b048201901c905060018185816127bd576127bd613b42565b048201901c90506127dc8185816127d6576127d6613b42565b04821190565b90039392505050565b5f5b8183101561283c575f6127fa8484612bee565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561282857809250612836565b6128338160016138b9565b93505b506127e7565b509392505050565b5f8060f883901c602f8111801561285e5750603a8160ff16105b1561287357600194602f199091019350915050565b8060ff166040108015612889575060478160ff16105b1561289e576001946036199091019350915050565b8060ff1660601080156128b4575060678160ff16105b156128c9576001946056199091019350915050565b505f93849350915050565b5f63ffffffff821115611afd576040516306dfcc6560e41b81526020600482015260248101839052604401610d14565b606060ff831461291e5761291783612c08565b9050610a45565b81805461292a90613656565b80601f016020809104026020016040519081016040528092919081815260200182805461295690613656565b80156129a15780601f10612978576101008083540402835291602001916129a1565b820191905f5260205f20905b81548152906001019060200180831161298457829003601f168201915b50505050509050610a45565b8051156129bd5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b82545f9081908015612acc575f6129f287611b8160018561373a565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115612a3557604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603612a6e57825465ffffffffffff16600160301b6001600160d01b03891602178355612abe565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b945085935061231b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b02919093161792019190915590508161231b565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b5f57505f91506003905082612be4565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612bb0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612bdb57505f925060019150829050612be4565b92505f91508190505b9450945094915050565b5f612bfc6002848418613b56565b61141c908484166138b9565b60605f612c1483612c45565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f811115610a4557604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215612c7c575f5ffd5b81356001600160e01b03198116811461141c575f5ffd5b5f60208284031215612ca3575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61141c6020830184612caa565b80356001600160a01b0381168114610f01575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612d3d57612d3d612d00565b604052919050565b5f67ffffffffffffffff821115612d5e57612d5e612d00565b50601f01601f191660200190565b5f612d7e612d7984612d45565b612d14565b9050828152838383011115612d91575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112612db6575f5ffd5b61141c83833560208501612d6c565b5f5f5f5f60808587031215612dd8575f5ffd5b612de185612cea565b9350612def60208601612cea565b925060408501359150606085013567ffffffffffffffff811115612e11575f5ffd5b612e1d87828801612da7565b91505092959194509250565b5f67ffffffffffffffff821115612e4257612e42612d00565b5060051b60200190565b5f82601f830112612e5b575f5ffd5b8135612e69612d7982612e29565b8082825260208201915060208360051b860101925085831115612e8a575f5ffd5b602085015b83811015610b3257612ea081612cea565b835260209283019201612e8f565b5f82601f830112612ebd575f5ffd5b8135612ecb612d7982612e29565b8082825260208201915060208360051b860101925085831115612eec575f5ffd5b602085015b83811015610b32578035835260209283019201612ef1565b5f82601f830112612f18575f5ffd5b8135612f26612d7982612e29565b8082825260208201915060208360051b860101925085831115612f47575f5ffd5b602085015b83811015610b3257803567ffffffffffffffff811115612f6a575f5ffd5b612f79886020838a0101612da7565b84525060209283019201612f4c565b5f5f5f5f60808587031215612f9b575f5ffd5b843567ffffffffffffffff811115612fb1575f5ffd5b612fbd87828801612e4c565b945050602085013567ffffffffffffffff811115612fd9575f5ffd5b612fe587828801612eae565b935050604085013567ffffffffffffffff811115613001575f5ffd5b61300d87828801612f09565b949793965093946060013593505050565b634e487b7160e01b5f52602160045260245ffd5b6008811061304e57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610a458284613032565b5f5f60408385031215613071575f5ffd5b8235915061308160208401612cea565b90509250929050565b803560ff81168114610f01575f5ffd5b5f5f604083850312156130ab575f5ffd5b823591506130816020840161308a565b5f5f83601f8401126130cb575f5ffd5b50813567ffffffffffffffff8111156130e2575f5ffd5b6020830191508360208285010111156130f9575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a031215613116575f5ffd5b873596506131266020890161308a565b955061313460408901612cea565b9450606088013567ffffffffffffffff81111561314f575f5ffd5b61315b8a828b016130bb565b909550935050608088013567ffffffffffffffff81111561317a575f5ffd5b6131868a828b01612da7565b92505060a088013567ffffffffffffffff8111156131a2575f5ffd5b6131ae8a828b01612da7565b91505092959891949750929550565b5f5f5f5f5f608086880312156131d1575f5ffd5b853594506131e16020870161308a565b9350604086013567ffffffffffffffff8111156131fc575f5ffd5b613208888289016130bb565b909450925050606086013567ffffffffffffffff811115613227575f5ffd5b61323388828901612da7565b9150509295509295909350565b65ffffffffffff81168114610a61575f5ffd5b5f60208284031215613263575f5ffd5b813561141c81613240565b5f5f5f5f60608587031215613281575f5ffd5b843593506132916020860161308a565b9250604085013567ffffffffffffffff8111156132ac575f5ffd5b6132b8878288016130bb565b95989497509550505050565b5f5f5f5f608085870312156132d7575f5ffd5b843567ffffffffffffffff8111156132ed575f5ffd5b6132f987828801612e4c565b945050602085013567ffffffffffffffff811115613315575f5ffd5b61332187828801612eae565b935050604085013567ffffffffffffffff81111561333d575f5ffd5b61334987828801612f09565b925050606085013567ffffffffffffffff811115613365575f5ffd5b8501601f81018713613375575f5ffd5b612e1d87823560208401612d6c565b5f60208284031215613394575f5ffd5b61141c82612cea565b5f8151808452602084019350602083015f5b828110156133cd5781518652602095860195909101906001016133af565b5093949350505050565b60ff60f81b8816815260e060208201525f6133f560e0830189612caa565b82810360408401526134078189612caa565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613436818561339d565b9a9950505050505050505050565b5f5f5f5f60808587031215613457575f5ffd5b843593506134676020860161308a565b925061347560408601612cea565b9150606085013567ffffffffffffffff811115612e11575f5ffd5b5f5f5f606084860312156134a2575f5ffd5b6134ab84612cea565b925060208401359150604084013567ffffffffffffffff8111156134cd575f5ffd5b6134d986828701612da7565b9150509250925092565b5f5f5f5f5f60a086880312156134f7575f5ffd5b61350086612cea565b945061350e60208701612cea565b9350604086013567ffffffffffffffff811115613529575f5ffd5b61353588828901612eae565b935050606086013567ffffffffffffffff811115613551575f5ffd5b61355d88828901612eae565b925050608086013567ffffffffffffffff811115613227575f5ffd5b5f5f5f5f6060858703121561358c575f5ffd5b61359585612cea565b935060208501359250604085013567ffffffffffffffff8111156132ac575f5ffd5b5f602082840312156135c7575f5ffd5b813563ffffffff8116811461141c575f5ffd5b5f5f604083850312156135eb575f5ffd5b6135f483612cea565b946020939093013593505050565b5f5f5f5f5f60a08688031215613616575f5ffd5b61361f86612cea565b945061362d60208701612cea565b93506040860135925060608601359150608086013567ffffffffffffffff811115613227575f5ffd5b600181811c9082168061366a57607f821691505b60208210810361368857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156136b2575f5ffd5b815167ffffffffffffffff8111156136c8575f5ffd5b8201601f810184136136d8575f5ffd5b80516136e6612d7982612d45565b8181528560208385010111156136fa575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4557610a45613726565b65ffffffffffff8281168282160390811115610a4557610a45613726565b5f6020828403121561377b575f5ffd5b815161141c81613240565b65ffffffffffff8181168382160190811115610a4557610a45613726565b5f8151808452602084019350602083015f5b828110156133cd5781516001600160a01b03168652602095860195909101906001016137b6565b5f82825180855260208501945060208160051b830101602085015f5b8381101561382b57601f19858403018852613815838351612caa565b60209889019890935091909101906001016137f9565b50909695505050505050565b608081525f61384960808301876137a4565b828103602084015261385b818761339d565b9050828103604084015261386f81866137dd565b91505082606083015295945050505050565b838152606081016138956020830185613032565b826040830152949350505050565b5f82518060208501845e5f920191825250919050565b80820180821115610a4557610a45613726565b60ff8181168382160190811115610a4557610a45613726565b6001815b600184111561231b5780850481111561390457613904613726565b600184161561391257908102905b60019390931c9280026138e9565b5f8261392e57506001610a45565b8161393a57505f610a45565b8160018114613950576002811461395a57613976565b6001915050610a45565b60ff84111561396b5761396b613726565b50506001821b610a45565b5060208310610133831016604e8410600b8410161715613999575081810a610a45565b6139a55f1984846138e5565b805f19048211156139b8576139b8613726565b029392505050565b5f61141c60ff841683613920565b84815260ff84166020820152826040820152608060608201525f610e3c6080830184612caa565b85815260ff8516602082015283604082015260a060608201525f613a1c60a0830185612caa565b8281036080840152613a2e8185612caa565b98975050505050505050565b8981526001600160a01b038916602082015261012060408201525f613a6361012083018a6137a4565b8281036060840152613a75818a61339d565b9050828103608084015280885180835260208301915060208160051b84010160208b015f5b83811015613acc57601f19868403018552613ab6838351612caa565b6020958601959093509190910190600101613a9a565b505085810360a0870152613ae0818b6137dd565b93505050508560c08401528460e0840152828103610100840152613b048185612caa565b9c9b505050505050505050505050565b5f60208284031215613b24575f5ffd5b5051919050565b8082028115828204841417610a4557610a45613726565b634e487b7160e01b5f52601260045260245ffd5b5f82613b7057634e487b7160e01b5f52601260045260245ffd5b500490565b828152604060208201525f6114196040830184612caa56fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x476f617444414f0000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000093a80000000015180", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000000000000000000000000004000000000004" + } + } +} diff --git a/core/goat/testnet3.json b/core/goat/testnet3.json new file mode 100644 index 0000000000000..44cae8b4643b9 --- /dev/null +++ b/core/goat/testnet3.json @@ -0,0 +1,151 @@ +{ + "4e59b44847b379578588920ca78fbf26c0b4956c": { + "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + "balance": "0x0" + }, + "1820a4B7618BdE71Dce8cdc73aAB6C95905faD24": { + "code": "0x608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c0029", + "balance": "0x0" + }, + "13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2": { + "code": "0x6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033", + "balance": "0x0" + }, + "000F3df6D732807Ef1319fB7B8bB8522d0Beac02": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "balance": "0x0" + }, + "ba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed": { + "code": "0x60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed8361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a", + "balance": "0x0" + }, + "cA11bde05977b3631167028862bE2a173976CA11": { + "code": "0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033", + "balance": "0x0" + }, + "bC10000000000000000000000000000000000000": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6080604052600436106100e7575f3560e01c806370a0823111610087578063a9059cbb11610057578063a9059cbb1461026c578063d0e30db01461028b578063d505accf14610293578063dd62ed3e146102b2575f5ffd5b806370a08231146101de5780637ecebe001461021257806384b0196e1461023157806395d89b4114610258575f5ffd5b806323b872dd116100c257806323b872dd146101715780632e1a7d4d14610190578063313ce567146101af5780633644e515146101ca575f5ffd5b806306fdde03146100fa578063095ea7b31461012457806318160ddd14610153575f5ffd5b366100f6576100f46102f6565b005b5f5ffd5b348015610105575f5ffd5b5061010e610337565b60405161011b9190610e91565b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610ec5565b6103c7565b604051901515815260200161011b565b34801561015e575f5ffd5b506002545b60405190815260200161011b565b34801561017c575f5ffd5b5061014361018b366004610eed565b6103e0565b34801561019b575f5ffd5b506100f46101aa366004610f27565b610403565b3480156101ba575f5ffd5b506040516012815260200161011b565b3480156101d5575f5ffd5b5061016361044f565b3480156101e9575f5ffd5b506101636101f8366004610f3e565b6001600160a01b03165f9081526020819052604090205490565b34801561021d575f5ffd5b5061016361022c366004610f3e565b61045d565b34801561023c575f5ffd5b5061024561047a565b60405161011b9796959493929190610f57565b348015610263575f5ffd5b5061010e6104bc565b348015610277575f5ffd5b50610143610286366004610ec5565b6104cb565b6100f46102f6565b34801561029e575f5ffd5b506100f46102ad366004610fed565b6104d8565b3480156102bd575f5ffd5b506101636102cc36600461105a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6103003334610613565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b6060600380546103469061108b565b80601f01602080910402602001604051908101604052809291908181526020018280546103729061108b565b80156103bd5780601f10610394576101008083540402835291602001916103bd565b820191905f5260205f20905b8154815290600101906020018083116103a057829003601f168201915b5050505050905090565b5f336103d481858561064b565b60019150505b92915050565b5f336103ed85828561065d565b6103f88585856106d8565b506001949350505050565b61040d3382610735565b6104173382610769565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b5f610458610803565b905090565b6001600160a01b0381165f908152600760205260408120546103da565b5f6060805f5f5f606061048b61092c565b610493610959565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6060600480546103469061108b565b5f336103d48185856106d8565b834211156105015760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861054c8c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6105a682610986565b90505f6105b5828787876109b2565b9050896001600160a01b0316816001600160a01b0316146105fc576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016104f8565b6106078a8a8a61064b565b50505050505050505050565b6001600160a01b03821661063c5760405163ec442f0560e01b81525f60048201526024016104f8565b6106475f83836109de565b5050565b6106588383836001610b04565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146106d257818110156106c457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016104f8565b6106d284848484035f610b04565b50505050565b6001600160a01b03831661070157604051634b637e8f60e11b81525f60048201526024016104f8565b6001600160a01b03821661072a5760405163ec442f0560e01b81525f60048201526024016104f8565b6106588383836109de565b6001600160a01b03821661075e57604051634b637e8f60e11b81525f60048201526024016104f8565b610647825f836109de565b804710156107935760405163cf47918160e01b8152476004820152602481018290526044016104f8565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146107dc576040519150601f19603f3d011682016040523d82523d5f602084013e6107e1565b606091505b50509050806106585760405163d6bda27560e01b815260040160405180910390fd5b5f306001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614801561085b57507f000000000000000000000000000000000000000000000000000000000000beb046145b1561088557507f7f72c2e6bc58e9cdd90f0a36a5b202a9f24beaea0a7988cae6caf49d13c5a2a290565b610458604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fd3974318b35c22bdad78531c2e406ce004418eec475a02ecc063f209cbf20828918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606104587f57474254430000000000000000000000000000000000000000000000000000056005610bd6565b60606104587f31000000000000000000000000000000000000000000000000000000000000016006610bd6565b5f6103da610992610803565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f6109c288888888610c7f565b9250925092506109d28282610d47565b50909695505050505050565b6001600160a01b038316610a08578060025f8282546109fd91906110c3565b90915550610a789050565b6001600160a01b0383165f9081526020819052604090205481811015610a5a5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016104f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610a9457600280548290039055610ab2565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610af791815260200190565b60405180910390a3505050565b6001600160a01b038416610b2d5760405163e602df0560e01b81525f60048201526024016104f8565b6001600160a01b038316610b5657604051634a1406b160e11b81525f60048201526024016104f8565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156106d257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bc891815260200190565b60405180910390a350505050565b606060ff8314610bf057610be983610dff565b90506103da565b818054610bfc9061108b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c289061108b565b8015610c735780601f10610c4a57610100808354040283529160200191610c73565b820191905f5260205f20905b815481529060010190602001808311610c5657829003601f168201915b505050505090506103da565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610cb857505f91506003905082610d3d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610d09573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610d3457505f925060019150829050610d3d565b92505f91508190505b9450945094915050565b5f826003811115610d5a57610d5a6110e2565b03610d63575050565b6001826003811115610d7757610d776110e2565b03610d955760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610da957610da96110e2565b03610dca5760405163fce698f760e01b8152600481018290526024016104f8565b6003826003811115610dde57610dde6110e2565b03610647576040516335e2f38360e21b8152600481018290526024016104f8565b60605f610e0b83610e3c565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103da57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610ea36020830184610e63565b9392505050565b80356001600160a01b0381168114610ec0575f5ffd5b919050565b5f5f60408385031215610ed6575f5ffd5b610edf83610eaa565b946020939093013593505050565b5f5f5f60608486031215610eff575f5ffd5b610f0884610eaa565b9250610f1660208501610eaa565b929592945050506040919091013590565b5f60208284031215610f37575f5ffd5b5035919050565b5f60208284031215610f4e575f5ffd5b610ea382610eaa565b60ff60f81b8816815260e060208201525f610f7560e0830189610e63565b8281036040840152610f878189610e63565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610fdc578351835260209384019390920191600101610fbe565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215611003575f5ffd5b61100c88610eaa565b965061101a60208901610eaa565b95506040880135945060608801359350608088013560ff8116811461103d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561106b575f5ffd5b61107483610eaa565b915061108260208401610eaa565b90509250929050565b600181811c9082168061109f57607f821691505b6020821081036110bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156103da57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x5772617070656420476f617420426974636f696e000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x574742544300000000000000000000000000000000000000000000000000000a" + } + }, + "bC10000000000000000000000000000000000001": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b506004361061019a575f3560e01c806370a08231116100e857806395d89b4111610093578063c3cda5201161006e578063c3cda52014610392578063d505accf146103a5578063dd62ed3e146103b8578063f1127ed8146103f0575f5ffd5b806395d89b41146103645780639ab24eb01461036c578063a9059cbb1461037f575f5ffd5b806384b0196e116100c357806384b0196e146103175780638e539e8c1461033257806391ddadf414610345575f5ffd5b806370a08231146102c957806379cc6790146102f15780637ecebe0014610304575f5ffd5b80633a46b1a811610148578063587cde1e11610123578063587cde1e1461024b5780635c19a95c1461028e5780636fcfff45146102a1575f5ffd5b80633a46b1a81461021b57806342966c681461022e5780634bf5d7e914610243575f5ffd5b806323b872dd1161017857806323b872dd146101f1578063313ce567146102045780633644e51514610213575f5ffd5b806306fdde031461019e578063095ea7b3146101bc57806318160ddd146101df575b5f5ffd5b6101a661042f565b6040516101b39190611a59565b60405180910390f35b6101cf6101ca366004611a86565b6104bf565b60405190151581526020016101b3565b6002545b6040519081526020016101b3565b6101cf6101ff366004611aae565b6104d8565b604051601281526020016101b3565b6101e36104fb565b6101e3610229366004611a86565b610509565b61024161023c366004611ae8565b61058d565b005b6101a661059a565b610276610259366004611aff565b6001600160a01b039081165f908152600860205260409020541690565b6040516001600160a01b0390911681526020016101b3565b61024161029c366004611aff565b610612565b6102b46102af366004611aff565b610621565b60405163ffffffff90911681526020016101b3565b6101e36102d7366004611aff565b6001600160a01b03165f9081526020819052604090205490565b6102416102ff366004611a86565b61062b565b6101e3610312366004611aff565b610640565b61031f61064a565b6040516101b39796959493929190611b18565b6101e3610340366004611ae8565b61068c565b61034d6106f5565b60405165ffffffffffff90911681526020016101b3565b6101a66106fe565b6101e361037a366004611aff565b61070d565b6101cf61038d366004611a86565b61073c565b6102416103a0366004611bbe565b610749565b6102416103b3366004611c12565b610805565b6101e36103c6366004611c78565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104036103fe366004611ca9565b61093b565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101b3565b60606003805461043e90611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611ce6565b80156104b55780601f1061048c576101008083540402835291602001916104b5565b820191905f5260205f20905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b5f336104cc818585610975565b60019150505b92915050565b5f336104e5858285610987565b6104f0858585610a02565b506001949350505050565b5f610504610a5f565b905090565b5f5f6105136106f5565b90508065ffffffffffff16831061055357604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044015b60405180910390fd5b61057c61055f84610b88565b6001600160a01b0386165f90815260096020526040902090610bbe565b6001600160d01b0316949350505050565b6105973382610c71565b50565b60606105a4610ca5565b65ffffffffffff166105b46106f5565b65ffffffffffff16146105da576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b3361061d8183610caf565b5050565b5f6104d282610d38565b610636823383610987565b61061d8282610c71565b5f6104d282610d59565b5f6060805f5f5f606061065b610d76565b610663610da3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f6106966106f5565b90508065ffffffffffff1683106106d157604051637669fc0f60e11b81526004810184905265ffffffffffff8216602482015260440161054a565b6106e56106dd84610b88565b600a90610bbe565b6001600160d01b03169392505050565b5f610504610ca5565b60606004805461043e90611ce6565b6001600160a01b0381165f90815260096020526040812061072d90610dd0565b6001600160d01b031692915050565b5f336104cc818585610a02565b8342111561076d57604051632341d78760e11b81526004810185905260240161054a565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906107e6906107de9060a00160405160208183030381529060405280519060200120610e0a565b858585610e36565b90506107f28187610e62565b6107fc8188610caf565b50505050505050565b834211156108295760405163313c898160e11b81526004810185905260240161054a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108748c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108ce82610e0a565b90505f6108dd82878787610e36565b9050896001600160a01b0316816001600160a01b031614610924576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161054a565b61092f8a8a8a610975565b50505050505050505050565b604080518082019091525f80825260208201526109588383610eb4565b9392505050565b5f6109588284611d32565b5f6109588284611d51565b6109828383836001610ee8565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146109fc57818110156109ee57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161054a565b6109fc84848484035f610ee8565b50505050565b6001600160a01b038316610a2b57604051634b637e8f60e11b81525f600482015260240161054a565b6001600160a01b038216610a545760405163ec442f0560e01b81525f600482015260240161054a565b610982838383610fba565b5f306001600160a01b037f0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa316148015610ab757507f000000000000000000000000000000000000000000000000000000000000beb046145b15610ae157507fbdee81e7eb1c2ddc71067db771819a5ce89a96e369cfdb7f4ac9b387fa9258e490565b610504604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f37c469dadd9df9fb454182ffced72eec76a99c56ccde61f27666b040e87df709918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115610bba576040516306dfcc6560e41b8152603060048201526024810183905260440161054a565b5090565b81545f9081816005811115610c1a575f610bd784610fc5565b610be19085611d70565b5f8881526020902090915081015465ffffffffffff9081169087161015610c0a57809150610c18565b610c15816001611d83565b92505b505b5f610c278787858561112a565b90508015610c6457610c4b87610c3e600184611d70565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610c66565b5f5b979650505050505050565b6001600160a01b038216610c9a57604051634b637e8f60e11b81525f600482015260240161054a565b61061d825f83610fba565b5f61050443610b88565b6001600160a01b038281165f8181526008602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46109828183610d3386611189565b6111a6565b6001600160a01b0381165f908152600960205260408120546104d29061130f565b6001600160a01b0381165f908152600760205260408120546104d2565b60606105047f474f415400000000000000000000000000000000000000000000000000000004600561133f565b60606105047f3100000000000000000000000000000000000000000000000000000000000001600661133f565b80545f908015610e0257610de983610c3e600184611d70565b54660100000000000090046001600160d01b0316610958565b5f9392505050565b5f6104d2610e16610a5f565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610e46888888886113e8565b925092509250610e5682826114b0565b50909695505050505050565b6001600160a01b0382165f908152600760205260409020805460018101909155818114610982576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161054a565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206109589083611568565b6001600160a01b038416610f115760405163e602df0560e01b81525f600482015260240161054a565b6001600160a01b038316610f3a57604051634a1406b160e11b81525f600482015260240161054a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156109fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fac91815260200190565b60405180910390a350505050565b6109828383836115d8565b5f60018211610fd2575090565b8160017001000000000000000000000000000000008210610ff85760809190911c9060401b5b6801000000000000000082106110135760409190911c9060201b5b640100000000821061102a5760209190911c9060101b5b62010000821061103f5760109190911c9060081b5b61010082106110535760089190911c9060041b5b601082106110665760049190911c9060021b5b600482106110725760011b5b600302600190811c9081858161108a5761108a611d96565b048201901c905060018185816110a2576110a2611d96565b048201901c905060018185816110ba576110ba611d96565b048201901c905060018185816110d2576110d2611d96565b048201901c905060018185816110ea576110ea611d96565b048201901c9050600181858161110257611102611d96565b048201901c905061112181858161111b5761111b611d96565b04821190565b90039392505050565b5f5b81831015611181575f61113f848461163e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561116d5780925061117b565b611178816001611d83565b93505b5061112c565b509392505050565b6001600160a01b0381165f908152602081905260408120546104d2565b816001600160a01b0316836001600160a01b0316141580156111c757505f81115b15610982576001600160a01b0383161561126e576001600160a01b0383165f90815260096020526040812081906112099061096a61120486611658565b61168b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611263929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610982576001600160a01b0382165f90815260096020526040812081906112a69061095f61120486611658565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611300929190918252602082015260400190565b60405180910390a25050505050565b5f63ffffffff821115610bba576040516306dfcc6560e41b8152602060048201526024810183905260440161054a565b606060ff831461135957611352836116c3565b90506104d2565b81805461136590611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461139190611ce6565b80156113dc5780601f106113b3576101008083540402835291602001916113dc565b820191905f5260205f20905b8154815290600101906020018083116113bf57829003601f168201915b505050505090506104d2565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561142157505f915060039050826114a6565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611472573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661149d57505f9250600191508290506114a6565b92505f91508190505b9450945094915050565b5f8260038111156114c3576114c3611daa565b036114cc575050565b60018260038111156114e0576114e0611daa565b036114fe5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561151257611512611daa565b036115335760405163fce698f760e01b81526004810182905260240161054a565b600382600381111561154757611547611daa565b0361061d576040516335e2f38360e21b81526004810182905260240161054a565b604080518082019091525f8082526020820152825f018263ffffffff168154811061159557611595611dbe565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6115e3838383611700565b6001600160a01b038316611633575f6115fb60025490565b90506001600160d01b038082111561163057604051630e58ae9360e11b8152600481018390526024810182905260440161054a565b50505b610982838383611826565b5f61164c6002848418611dd2565b61095890848416611d83565b5f6001600160d01b03821115610bba576040516306dfcc6560e41b815260d060048201526024810183905260440161054a565b5f5f6116b66116986106f5565b6116ae6116a488610dd0565b868863ffffffff16565b87919061189b565b915091505b935093915050565b60605f6116cf836118a8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03831661172a578060025f82825461171f9190611d83565b9091555061179a9050565b6001600160a01b0383165f908152602081905260409020548181101561177c5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161054a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b6576002805482900390556117d4565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181991815260200190565b60405180910390a3505050565b6001600160a01b03831661184857611845600a61095f61120484611658565b50505b6001600160a01b03821661186a57611867600a61096a61120484611658565b50505b6001600160a01b038381165f90815260086020526040808220548584168352912054610982929182169116836111a6565b5f806116b68585856118cf565b5f60ff8216601f8111156104d257604051632cd44ac360e21b815260040160405180910390fd5b82545f90819080156119ce575f6118eb87610c3e600185611d70565b805490915065ffffffffffff80821691660100000000000090046001600160d01b031690881682111561193157604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361196d57825465ffffffffffff1666010000000000006001600160d01b038916021783556119c0565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506116bb92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816116bb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109586020830184611a2b565b80356001600160a01b0381168114611a81575f5ffd5b919050565b5f5f60408385031215611a97575f5ffd5b611aa083611a6b565b946020939093013593505050565b5f5f5f60608486031215611ac0575f5ffd5b611ac984611a6b565b9250611ad760208501611a6b565b929592945050506040919091013590565b5f60208284031215611af8575f5ffd5b5035919050565b5f60208284031215611b0f575f5ffd5b61095882611a6b565b60ff60f81b8816815260e060208201525f611b3660e0830189611a2b565b8281036040840152611b488189611a2b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611b9d578351835260209384019390920191600101611b7f565b50909b9a5050505050505050505050565b803560ff81168114611a81575f5ffd5b5f5f5f5f5f5f60c08789031215611bd3575f5ffd5b611bdc87611a6b565b95506020870135945060408701359350611bf860608801611bae565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215611c28575f5ffd5b611c3188611a6b565b9650611c3f60208901611a6b565b95506040880135945060608801359350611c5b60808901611bae565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611c89575f5ffd5b611c9283611a6b565b9150611ca060208401611a6b565b90509250929050565b5f5f60408385031215611cba575f5ffd5b611cc383611a6b565b9150602083013563ffffffff81168114611cdb575f5ffd5b809150509250929050565b600181811c90821680611cfa57607f821691505b602082108103611d1857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160d01b0381811683821601908111156104d2576104d2611d1e565b6001600160d01b0382811682821603908111156104d2576104d2611d1e565b818103818111156104d2576104d2611d1e565b808201808211156104d2576104d2611d1e565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82611dec57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x175f40481e668931adde1e373cc3c3442587409cf537d95148649dad47b3a6c5": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x42df54d978308232df5f7d63c0445e00c9e9f8c4eb4d4c22b0f8badf086d40da": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x540b5a72faa2463ad7b6e96257f3df9adbe15e6f4ef1a160019203de6a3b6c17": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x55b0fb7ee6854a4c90517d06cee035cb67a225460ad0f72a5ba96fbf9c7f69fa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xaba3651eb38256f942270b1b147383dadaba11a46edd8370c7c491fcb78f6de5": "0x00000000000000000000000000000000000000000295be96e640669720000000", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000033b2e3c9fd0803ce8000000000000000001" + } + }, + "Bc10000000000000000000000000000000000002": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405260043610610071575f3560e01c80639db5dbe41161004c5780639db5dbe4146101245780639e976db114610143578063a9059cbb14610163578063f2fde38b14610182575f5ffd5b806301ffc9a7146100b4578063715018a6146100e85780638da5cb5b146100fe575f5ffd5b366100b057604080513381523460208201527f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef13910160405180910390a1005b5f5ffd5b3480156100bf575f5ffd5b506100d36100ce3660046106a3565b6101a1565b60405190151581526020015b60405180910390f35b3480156100f3575f5ffd5b506100fc6101d7565b005b348015610109575f5ffd5b505f546040516001600160a01b0390911681526020016100df565b34801561012f575f5ffd5b506100fc61013e3660046106de565b6101ea565b61015661015136600461071c565b61020b565b6040516100df91906107a3565b34801561016e575f5ffd5b506100fc61017d3660046107d8565b6102d8565b34801561018d575f5ffd5b506100fc61019c366004610802565b610339565b5f6001600160e01b031982166301ffc9a760e01b14806101d157506001600160e01b03198216635513957760e11b145b92915050565b6101df610376565b6101e85f6103a2565b565b6101f2610376565b6102066001600160a01b0384168383610409565b505050565b6060610215610376565b5f546001600160a01b03166001600160a01b0316856001600160a01b0316036102855760405162461bcd60e51b815260206004820152600660248201527f216f776e6572000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6102cf84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084610470565b95945050505050565b6102e0610376565b6102f36001600160a01b03831682610512565b604080516001600160a01b0384168152602081018390527f69ca02dd4edd7bf0a4abb9ed3b7af3f14778db5d61921c7dc7cd545266326de2910160405180910390a15050565b610341610376565b6001600160a01b03811661036a57604051631e4fbdf760e01b81525f600482015260240161027c565b610373816103a2565b50565b5f546001600160a01b031633146101e85760405163118cdaa760e01b815233600482015260240161027c565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790526102069084906105ac565b60608147101561049c5760405163cf47918160e01b81524760048201526024810183905260440161027c565b5f5f856001600160a01b031684866040516104b7919061081d565b5f6040518083038185875af1925050503d805f81146104f1576040519150601f19603f3d011682016040523d82523d5f602084013e6104f6565b606091505b509150915061050686838361061e565b925050505b9392505050565b8047101561053c5760405163cf47918160e01b81524760048201526024810182905260440161027c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610585576040519150601f19603f3d011682016040523d82523d5f602084013e61058a565b606091505b50509050806102065760405163d6bda27560e01b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806105cb576040513d5f823e3d81fd5b50505f513d915081156105e25780600114156105ef565b6001600160a01b0384163b155b1561061857604051635274afe760e01b81526001600160a01b038516600482015260240161027c565b50505050565b6060826106335761062e8261067a565b61050b565b815115801561064a57506001600160a01b0384163b155b1561067357604051639996b31560e01b81526001600160a01b038516600482015260240161027c565b508061050b565b80511561068a5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f602082840312156106b3575f5ffd5b81356001600160e01b03198116811461050b575f5ffd5b6001600160a01b0381168114610373575f5ffd5b5f5f5f606084860312156106f0575f5ffd5b83356106fb816106ca565b9250602084013561070b816106ca565b929592945050506040919091013590565b5f5f5f5f6060858703121561072f575f5ffd5b843561073a816106ca565b9350602085013567ffffffffffffffff811115610755575f5ffd5b8501601f81018713610765575f5ffd5b803567ffffffffffffffff81111561077b575f5ffd5b87602082840101111561078c575f5ffd5b949760209190910196509394604001359392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156107e9575f5ffd5b82356107f4816106ca565b946020939093013593505050565b5f60208284031215610812575f5ffd5b813561050b816106ca565b5f82518060208501845e5f92019182525091905056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000360268e8c47b01ea615bbd8b682ee69608304603" + } + }, + "BC10000000000000000000000000000000000003": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x60806040526004361061018e575f3560e01c80638da5cb5b116100dc578063b3dd64dd11610087578063b9cf8c8f11610062578063b9cf8c8f14610484578063c19dd32014610528578063c8c3c6b614610547578063f2fde38b14610566575f5ffd5b8063b3dd64dd14610427578063b3f33eda14610446578063b670ab5e14610465575f5ffd5b8063a2215ab4116100b7578063a2215ab4146103e7578063a5517aff146103fc578063a81de86914610414575f5ffd5b80638da5cb5b14610383578063904183cb146103a9578063a0ea8451146103c8575f5ffd5b80634e0cd7991161013c578063715018a611610117578063715018a61461033157806384a64c12146103455780638aa4af8914610364575f5ffd5b80634e0cd7991461027a5780635c6650ac1461028e5780635cc0707614610300575f5ffd5b8063278ecde11161016c578063278ecde1146102075780632eff14ec146102285780633396c80914610247575f5ffd5b806301ffc9a7146101925780631af87ddf146101c65780631ccc92c7146101e8575b5f5ffd5b34801561019d575f5ffd5b506101b16101ac366004611a62565b610585565b60405190151581526020015b60405180910390f35b3480156101d1575f5ffd5b506101da6105d6565b6040519081526020016101bd565b3480156101f3575f5ffd5b506101b1610202366004611aa8565b6105ea565b348015610212575f5ffd5b50610226610221366004611ad2565b610644565b005b348015610233575f5ffd5b50610226610242366004611afa565b610750565b348015610252575f5ffd5b506101da7f000000000000000000000000000000000000000000000000000000000000002081565b348015610285575f5ffd5b506101da610820565b348015610299575f5ffd5b506005546102d29067ffffffffffffffff8082169161ffff68010000000000000000820416916a01000000000000000000009091041683565b6040805167ffffffffffffffff948516815261ffff90931660208401529216918101919091526060016101bd565b34801561030b575f5ffd5b5061031f61031a366004611ad2565b610831565b6040516101bd96959493929190611b27565b34801561033c575f5ffd5b50610226610889565b348015610350575f5ffd5b5061022661035f366004611ad2565b61089c565b34801561036f575f5ffd5b5061022661037e366004611b97565b6109bd565b34801561038e575f5ffd5b505f546040516001600160a01b0390911681526020016101bd565b3480156103b4575f5ffd5b506102266103c3366004611bd5565b610b34565b3480156103d3575f5ffd5b506102266103e2366004611c1f565b610c8e565b3480156103f2575f5ffd5b506101da61012c81565b348015610407575f5ffd5b506101da6402540be40081565b610226610422366004611c38565b610d5f565b348015610432575f5ffd5b50610226610441366004611cb4565b611109565b348015610451575f5ffd5b50610226610460366004611b97565b611316565b348015610470575f5ffd5b5061022661047f366004611cd5565b6114a5565b34801561048f575f5ffd5b506004546104e69060e081901b9067ffffffffffffffff640100000000820481169161ffff6c0100000000000000000000000082048116926e01000000000000000000000000000083041691600160b01b90041685565b604080516001600160e01b0319909616865267ffffffffffffffff948516602087015261ffff938416908601529216606084015216608082015260a0016101bd565b348015610533575f5ffd5b50610226610542366004611ad2565b61161c565b348015610552575f5ffd5b50610226610561366004611c1f565b611714565b348015610571575f5ffd5b50610226610580366004611d0f565b6117eb565b5f6001600160e01b031982166301ffc9a760e01b14806105b557506001600160e01b03198216634388643560e01b145b806105d057506001600160e01b03198216630ff038eb60e31b145b92915050565b6105e76402540be40061012c611d3c565b81565b5f5f838360405160200161061592919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f1901815291815281516020928301205f908152600690925290205460ff16949350505050565b5f6007828154811061065857610658611d53565b5f9182526020909120600490910201905060038154600160b01b900460ff16600581111561068857610688611b13565b146106a657604051631dd2188d60e31b815260040160405180910390fd5b805476040000000000000000000000000000000000000000000060ff60b01b1982161782556001600160a01b03163381146106f457604051634ca8886760e01b815260040160405180910390fd5b426003830155600282015460018301546107219161071191611d67565b6001600160a01b03831690611828565b60405183907f2e1897b0591d764356194f7a795238a87c1987c7a877568e50d829d547c92b97905f90a2505050565b6107586118c7565b5f8161ffff16116107b05760405162461bcd60e51b815260206004820152600e60248201527f6e756d62657220746f6f206c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b600480547fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b61ffff8416908102919091179091556040519081527f30b92002139b64ec601b714d1ecccba1212034e735773b3de088e8876f4dfb659060200160405180910390a150565b6105e76402540be4006103e8611d3c565b60078181548110610840575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b0383169450600160a01b830461ffff1693600160b01b90930460ff16929086565b6108916118c7565b61089a5f6118f3565b565b6108a733600161195a565b5f600782815481106108bb576108bb611d53565b5f9182526020909120600490910201905060018154600160b01b900460ff1660058111156108eb576108eb611b13565b1461090957604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b0316331461093357604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426109469190611d7a565b101561096557604051633234675360e21b815260040160405180910390fd5b426003820155805460ff60b01b191676020000000000000000000000000000000000000000000017815560405182907f0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c905f90a25050565b6109c56118c7565b818161ffff821615610a6557670de0b6b3a76400008167ffffffffffffffff161080156109fb57505f8167ffffffffffffffff16115b8015610a1d5750610a1b6402540be40067ffffffffffffffff8316611da1565b155b610a3a576040516337d4ed5b60e01b815260040160405180910390fd5b6127108261ffff1610610a60576040516337d4ed5b60e01b815260040160405180910390fd5b610a8e565b67ffffffffffffffff811615610a8e576040516337d4ed5b60e01b815260040160405180910390fd5b6005805471ffffffffffffffffffff000000000000000019166801000000000000000061ffff871690810271ffffffffffffffff000000000000000000001916919091176a010000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f59b73ca79bcb3dcb02c4d2b81e1a2da4c9fd9857ed81cfb16c5431b502f8c71b91015b60405180910390a150505050565b3373bc1000000000000000000000000000000000100014610b6857604051634ca8886760e01b815260040160405180910390fd5b5f8585604051602001610b9292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815291815281516020928301205f818152600690935291205490915060ff1615610c095760405162461bcd60e51b815260206004820152600a60248201527f6475706c6963617465640000000000000000000000000000000000000000000060448201526064016107a7565b5f8181526006602052604090819020805460ff19166001179055516001600160a01b038516907f4d2c35ab224c2e654f91bb91c9f4081beef0e0abfc8a59df04254f6d0232213290610c7e90899089908890889093845263ffffffff9290921660208401526040830152606082015260800190565b60405180910390a2505050505050565b610c966118c7565b80670de0b6b3a76400008167ffffffffffffffff16108015610cc85750655af3107a40008167ffffffffffffffff1610155b8015610cea5750610ce86402540be40067ffffffffffffffff8316611da1565b155b610d075760405163aabd5a0960e01b815260040160405180910390fd5b6005805467ffffffffffffffff191667ffffffffffffffff84169081179091556040519081527f69458aa02de2093876897ec9cd5653bbdd83360ef731be0da0e3c94bf9a22dba906020015b60405180910390a15050565b610d6a33600161195a565b81602181118015610d7b5750605b81105b610dc75760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642061646472657373000000000000000000000000000000000060448201526064016107a7565b6040805160608101825260055467ffffffffffffffff80821680845261ffff6801000000000000000084041660208501526a0100000000000000000000909204169282019290925234915f9190831015610e635760405162461bcd60e51b815260206004820152600e60248201527f616d6f756e7420746f6f206c6f7700000000000000000000000000000000000060448201526064016107a7565b602081015161ffff1615610ec957612710816020015161ffff1684610e889190611d3c565b610e929190611db4565b9150806040015167ffffffffffffffff16821115610ebc57806040015167ffffffffffffffff1691505b610ec68284611d7a565b92505b5f610ed96402540be40085611da1565b90508015610efa57610eeb8184611d67565b9250610ef78185611d7a565b93505b5f8661ffff1611610f405760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b610f516402540be40061012c611d3c565b610f5f9061ffff8816611d3c565b610f706402540be4006103e8611d3c565b610f7a9190611d67565b8411610fb75760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b600780546040805160c08101825233815261ffff8a8116602083019081526001938301848152606084018b9052608084018a90524260a085015293850186555f9590955281517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600486020180549651909216600160a01b027fffffffffffffffffffff000000000000000000000000000000000000000000009096166001600160a01b0390911617949094178085559151929390929091829060ff60b01b1916600160b01b83600581111561108f5761108f611b13565b0217905550606082015181600101556080820151816002015560a082015181600301555050336001600160a01b0316817fbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b87878b8e8e6040516110f6959493929190611dc7565b60405180910390a3505050505050505050565b61111433600161195a565b5f6007838154811061112857611128611d53565b5f9182526020909120600490910201905060018154600160b01b900460ff16600581111561115857611158611b13565b1461117657604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b031633146111a057604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426111b39190611d7a565b10156111d257604051633234675360e21b815260040160405180910390fd5b805461ffff600160a01b9091048116908316116112245760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b6112356402540be40061012c611d3c565b6112439061ffff8416611d3c565b6112546402540be4006103e8611d3c565b61125e9190611d67565b81600101541161129f5760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff841690810291909117825542600383015560405190815283907f19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa9060200160405180910390a2505050565b61131e6118c7565b818161ffff8216156113be57670de0b6b3a76400008167ffffffffffffffff1610801561135457505f8167ffffffffffffffff16115b801561137657506113746402540be40067ffffffffffffffff8316611da1565b155b611393576040516337d4ed5b60e01b815260040160405180910390fd5b6127108261ffff16106113b9576040516337d4ed5b60e01b815260040160405180910390fd5b6113e7565b67ffffffffffffffff8116156113e7576040516337d4ed5b60e01b815260040160405180910390fd5b600480547fffffffffffffffffffff00000000000000000000ffffffffffffffffffffffff166c0100000000000000000000000061ffff87169081027fffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff16919091176e01000000000000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f1007ff7aec53e9626ce51f25d4e093f290f60da8019c8cf489f0ae2f21ebf76a9101610b26565b3373bc10000000000000000000000000000000001000146114d957604051634ca8886760e01b815260040160405180910390fd5b5f600785815481106114ed576114ed611d53565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561151f5761151f611b13565b148061153c5750600281600581111561153a5761153a611b13565b145b611544575f5ffd5b815460ff60b01b1916760500000000000000000000000000000000000000000000178255426003830155600282015480156115975761159773bc1000000000000000000000000000000000000282611828565b60018301546040515f91906115ab90611a56565b82906040518091039083f5915050801580156115c9573d5f5f3e3d5ffd5b50506040805187815263ffffffff8716602082015290810185905287907fb74f5dbf34aabe02f20ff775b898acf1a9f70e4fbd48ad50548acae86e1ccd789060600160405180910390a250505050505050565b3373bc100000000000000000000000000000000010001461165057604051634ca8886760e01b815260040160405180910390fd5b5f6007828154811061166457611664611d53565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561169657611696611b13565b14806116b3575060028160058111156116b1576116b1611b13565b145b6116bb575f5ffd5b815460ff60b01b191676030000000000000000000000000000000000000000000017825542600383015560405183907f829a8683c544ad289ce92d3ce06e9ebad69b18a6916e60ec766c2c217461d8e9905f90a2505050565b61171c6118c7565b80670de0b6b3a76400008167ffffffffffffffff1610801561174e5750655af3107a40008167ffffffffffffffff1610155b8015611770575061176e6402540be40067ffffffffffffffff8316611da1565b155b61178d5760405163aabd5a0960e01b815260040160405180910390fd5b600480546bffffffffffffffff00000000191664010000000067ffffffffffffffff8516908102919091179091556040519081527f7aa20a242ea0b0f7b0141c56aaad636eb2b2077c9c27d09a8282f6931f486a2190602001610d53565b6117f36118c7565b6001600160a01b03811661181c57604051631e4fbdf760e01b81525f60048201526024016107a7565b611825816118f3565b50565b804710156118525760405163cf47918160e01b8152476004820152602481018290526044016107a7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461189b576040519150601f19603f3d011682016040523d82523d5f602084013e6118a0565b606091505b50509050806118c25760405163d6bda27560e01b815260040160405180910390fd5b505050565b5f546001600160a01b0316331461089a5760405163118cdaa760e01b81523360048201526024016107a7565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f0000000000000000000000000000000000000000000000000000000000000000156119d3576001600160a01b0382165f908152600360205260409020544390036119b857604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f036119de575050565b6001544303611a055780600180015f8282546119fa9190611d67565b90915550611a0f9050565b4360015560028190555b6002547f00000000000000000000000000000000000000000000000000000000000000201015611a525760405163a74c1c5f60e01b815260040160405180910390fd5b5050565b600880611e0f83390190565b5f60208284031215611a72575f5ffd5b81356001600160e01b031981168114611a89575f5ffd5b9392505050565b803563ffffffff81168114611aa3575f5ffd5b919050565b5f5f60408385031215611ab9575f5ffd5b82359150611ac960208401611a90565b90509250929050565b5f60208284031215611ae2575f5ffd5b5035919050565b803561ffff81168114611aa3575f5ffd5b5f60208284031215611b0a575f5ffd5b611a8982611ae9565b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b038716815261ffff8616602082015260c0810160068610611b5d57634e487b7160e01b5f52602160045260245ffd5b8560408301528460608301528360808301528260a0830152979650505050505050565b803567ffffffffffffffff81168114611aa3575f5ffd5b5f5f60408385031215611ba8575f5ffd5b611bb183611ae9565b9150611ac960208401611b80565b80356001600160a01b0381168114611aa3575f5ffd5b5f5f5f5f5f60a08688031215611be9575f5ffd5b85359450611bf960208701611a90565b9350611c0760408701611bbf565b94979396509394606081013594506080013592915050565b5f60208284031215611c2f575f5ffd5b611a8982611b80565b5f5f5f60408486031215611c4a575f5ffd5b833567ffffffffffffffff811115611c60575f5ffd5b8401601f81018613611c70575f5ffd5b803567ffffffffffffffff811115611c86575f5ffd5b866020828401011115611c97575f5ffd5b602091820194509250611cab908501611ae9565b90509250925092565b5f5f60408385031215611cc5575f5ffd5b82359150611ac960208401611ae9565b5f5f5f5f60808587031215611ce8575f5ffd5b8435935060208501359250611cff60408601611a90565b9396929550929360600135925050565b5f60208284031215611d1f575f5ffd5b611a8982611bbf565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105d0576105d0611d28565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105d0576105d0611d28565b818103818111156105d0576105d0611d28565b634e487b7160e01b5f52601260045260245ffd5b5f82611daf57611daf611d8d565b500690565b5f82611dc257611dc2611d8d565b500490565b85815284602082015261ffff8416604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f1916010194935050505056fe608060405230fffea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000001d13bb7a0ed6a050e72dfe021fd639e0aeab27c3", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x00000000000000000014000000000000000000000001c6bf5263400047543356", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000071afd498d000000020001c6bf52634000", + "0x31f85800935b82ff60256eaa9a3061e7e4656648283ed18142d119373d2e9115": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3c5c0524bd960f72bf0839a0572cafe45b18fec7e9e193adb5cbddf131f1818e": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xed541fd2139a6e7c726bcb95000991702417012aebbc4e50b6436330cb608399": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "bC10000000000000000000000000000000000004": { + "balance": "0x53444835ec580000", + "nonce": "0x1", + "code": "0x6080604052600436106101d9575f3560e01c80635ba3a6a5116100fd578063bc01763711610092578063e486033911610062578063e4860339146105c4578063e4a28a521461063d578063e6a36cb61461066c578063f2fde38b1461068b575f5ffd5b8063bc01763714610548578063bd12835014610567578063bd9fadb514610586578063daea85c5146105a5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b146104e15780639d879990146104fd578063aa94def21461051c578063af38d7571461052f575f5ffd5b80635ba3a6a51461045c5780635d0341ba1461047b578063715018a6146104b957806380e9071b146104cd575f5ffd5b806323435e2f1161017357806349a0bf8e1161014357806349a0bf8e146103d1578063505bd3da146103e5578063551b3cd21461041057806359e5332d1461043b575f5ffd5b806323435e2f14610341578063293cdbf1146103775780633396c8091461038b578063423905f2146103be575f5ffd5b80631485ff78116101ae5780631485ff78146102a1578063160e3f3d146102c45780631eeea1f3146102e357806321c0b34214610322575f5ffd5b806252c9e1146101dd578062aba51a146101fe578063022914a71461021d57806309e3faa71461026e575b5f5ffd5b3480156101e8575f5ffd5b506101fc6101f73660046125d6565b6106aa565b005b348015610209575f5ffd5b506101fc61021836600461261e565b61078d565b348015610228575f5ffd5b50610251610237366004612666565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610279575f5ffd5b506102517f000000000000000000000000bc1000000000000000000000000000000000000181565b3480156102ac575f5ffd5b506102b660055481565b604051908152602001610265565b3480156102cf575f5ffd5b506101fc6102de366004612686565b6108aa565b3480156102ee575f5ffd5b506103026102fd3660046126b3565b610954565b604080516001600160a01b03938416815292909116602083015201610265565b34801561032d575f5ffd5b506101fc61033c3660046125d6565b610971565b34801561034c575f5ffd5b506102b661035b3660046125d6565b600b60209081525f928352604080842090915290825290205481565b348015610382575f5ffd5b506101fc610a99565b348015610396575f5ffd5b506102b67f000000000000000000000000000000000000000000000000000000000000002081565b6101fc6103cc3660046126db565b610afc565b3480156103dc575f5ffd5b506102b6600881565b3480156103f0575f5ffd5b506102b66103ff366004612666565b600c6020525f908152604090205481565b34801561041b575f5ffd5b506102b661042a366004612666565b600a6020525f908152604090205481565b348015610446575f5ffd5b5061044f610d1c565b6040516102659190612721565b348015610467575f5ffd5b506101fc610476366004612778565b610e0d565b348015610486575f5ffd5b506104a9610495366004612666565b600d6020525f908152604090205460ff1681565b6040519015158152602001610265565b3480156104c4575f5ffd5b506101fc611115565b3480156104d8575f5ffd5b506101fc611128565b3480156104ec575f5ffd5b505f546001600160a01b0316610251565b348015610508575f5ffd5b506101fc6105173660046127b7565b6111bf565b6101fc61052a366004612827565b611450565b34801561053a575f5ffd5b506007546104a99060ff1681565b348015610553575f5ffd5b506101fc6105623660046127b7565b611537565b348015610572575f5ffd5b506101fc610581366004612876565b6115e0565b348015610591575f5ffd5b506101fc6105a036600461289e565b611883565b3480156105b0575f5ffd5b506101fc6105bf366004612666565b611a0b565b3480156105cf575f5ffd5b506106126105de366004612666565b60096020525f908152604090208054600182015460029092015460ff82169261010090920467ffffffffffffffff16919084565b60408051941515855267ffffffffffffffff9093166020850152918301526060820152608001610265565b348015610648575f5ffd5b50610653620f424081565b60405167ffffffffffffffff9091168152602001610265565b348015610677575f5ffd5b506101fc6106863660046128c8565b611a9f565b348015610696575f5ffd5b506101fc6106a5366004612666565b611ce7565b6001600160a01b038083165f90815260086020526040902054839116803381146106f8576040516370a4337d60e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0383166107205760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038481165f8181526008602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fadd4071c89e561d58065ade5130c43b17b1101714bca7d91d2515ba1cb9fc97691015b60405180910390a150505050565b833373bc10000000000000000000000000000000001001146107c25760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561080b57604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556001600160a01b0383161580159061084657505f82115b1561085f5761085f6001600160a01b0384168584611d21565b6040805167ffffffffffffffff87168152602081018490527f31fa984883dfea329532d399d9106031006364f445ef2351a45c0d9cbc4ec72791015b60405180910390a15050505050565b6108b2611d9a565b5f81116108d257604051630dd484e760e41b815260040160405180910390fd5b6109076001600160a01b037f000000000000000000000000bc1000000000000000000000000000000000000116333084611dc6565b8060055f8282546109189190612939565b90915550506040518181527f41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0906020015b60405180910390a150565b5f5f61095f83611dff565b61096884611f17565b91509150915091565b6001600160a01b038083165f90815260086020526040902054839116803381146109ba576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508360016109c88282611f47565b6001600160a01b0385166109ef5760405163f6b2911f60e01b815260040160405180910390fd5b600480547fa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b9167ffffffffffffffff909116905f610a2c8361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508787604051610a899392919067ffffffffffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a1505050505050565b610aa1611d9a565b60075460ff1615610ac55760405163eef336d960e01b815260040160405180910390fd5b6007805460ff191660011790556040517f8b1bc2671f5913bb778240df66342565720db9b7a01e7e78190ae6aa1e4bd0f3905f90a1565b600654610b1c576040516314d2abd360e21b815260040160405180910390fd5b5f610b2685611dff565b90505f468233604051602001610b6593929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b604051602081830303815290604052805190602001209050610b898184878761203f565b6001600160a01b0316610b9b87611f17565b6001600160a01b031614610bc257604051630e751dc360e31b815260040160405180910390fd5b6001600160a01b038281165f9081526008602052604090205483911615610c085760405163107f863360e21b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600d602052604090205460ff1680610c5857505f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff165b8290610c8357604051633e55e12b60e11b81526001600160a01b0390911660048201526024016106ef565b50600654610c9d908390610c98906001612939565b611f47565b6001600160a01b0382165f908152600860205260409081902080546001600160a01b0319163390811790915590517ff3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd91610cfb918591908a90612978565b60405180910390a1610d1482610d0f610d1c565b61206b565b505050505050565b6006546060905f9067ffffffffffffffff811115610d3c57610d3c61299f565b604051908082528060200260200182016040528015610d8057816020015b604080518082019091525f8082526020820152815260200190600190039081610d5a5790505b5090505f5b600654811015610e07575f60068281548110610da357610da36129b3565b5f9182526020808320909101546040805180820182526001600160a01b039092168083528085526009845293206002015491810191909152845191925090849084908110610df357610df36129b3565b602090810291909101015250600101610d85565b50919050565b610e15611d9a565b6001600160a01b0384165f9081526009602052604090205460ff1615610e4e57604051632ae3f45d60e11b815260040160405180910390fd5b6001600160a01b0384161580610ec65750836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906129c7565b60ff166012145b610ee357604051638785ff4f60e01b815260040160405180910390fd5b5f8367ffffffffffffffff16118015610f085750620f424067ffffffffffffffff8416105b610f255760405163018a49e560e01b815260040160405180910390fd5b60408051608081018252600180825267ffffffffffffffff8681166020808501828152858701898152606087018981526001600160a01b038d165f818152600986528a902098518954945168ffffffffffffffffff1990951690151568ffffffffffffffff0019161761010094909716939093029590951787555194860194909455915160029094019390935583519182528101919091527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a1604080516001600160a01b0386168152602081018490527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a1801561110f5781158061103d5750808210155b828290916110675760405163068ade6560e31b8152600481019290925260248201526044016106ef565b505060065460081161108c57604051632970307360e11b815260040160405180910390fd5b600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03861690811790915560408051918252602082018390527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b50505050565b61111d611d9a565b6111265f612380565b565b60075460ff1661114b576040516335b43c0360e11b815260040160405180910390fd5b335f908152600c602052604090205480611178576040516301e1880f60e51b815260040160405180910390fd5b335f818152600c60205260408120556111bc907f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03169083611d21565b50565b6111c7611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661120d5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600960205260409020600201548181036112495760405163aabb9c6360e01b815260040160405180910390fd5b6001600160a01b0383165f81815260096020908152604091829020600201859055815192835282018490527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910160405180910390a1801580156112ac57505f82115b15611325576006546008116112d457604051632970307360e11b815260040160405180910390fd5b50600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091161790555050565b5f8111801561133357505f82115b1561133d57505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611366576113666129b3565b5f918252602090912001546001600160a01b0316036114445760065461138e906001906129e2565b811461140b57600680546113a4906001906129e2565b815481106113b4576113b46129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106113df576113df6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061141c5761141c6129f5565b5f8281526020902081015f1990810180546001600160a01b03191690550190555061144c9050565b60010161133f565b5050565b6001600160a01b038084165f9081526008602052604090205484911680338114611499576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b5084836114a68282611f47565b84158015906114b6575060088511155b6114d357604051632970307360e11b815260040160405180910390fd5b61152e878787808060200260200160405190810160405280939291908181526020015f905b828210156115245761151560408302860136819003810190612a09565b815260200190600101906114f8565b505050505061206b565b50505050505050565b61153f611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff166115855760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f81815260096020908152604091829020600101849055815192835282018390527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a15050565b6115e8611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661162e5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b50620f424067ffffffffffffffff82161061165c5760405163018a49e560e01b815260040160405180910390fd5b604080516001600160a01b038416815267ffffffffffffffff831660208201527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a167ffffffffffffffff8116156116f4576001600160a01b0382165f908152600960205260409020805467ffffffffffffffff83166101000268ffffffffffffffff00199091161790555050565b6001600160a01b0382165f908152600960205260408120600281018054825468ffffffffffffffffff1916835560019092018390559190915515158061173957505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611762576117626129b3565b5f918252602090912001546001600160a01b03160361187b5760065461178a906001906129e2565b811461180757600680546117a0906001906129e2565b815481106117b0576117b06129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106117db576117db6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6006805480611818576118186129f5565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516001600160a01b0388168152918201929092527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b60010161173b565b833373bc10000000000000000000000000000000001001146118b85760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561190157604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556005548311156119355760055492505b82156119c35760075460ff161561197f5761197a6001600160a01b037f000000000000000000000000bc10000000000000000000000000000000000001168585611d21565b6119ac565b6001600160a01b0384165f908152600c6020526040812080548592906119a6908490612939565b90915550505b8260055f8282546119bd91906129e2565b90915550505b6040805167ffffffffffffffff87168152602081018590529081018390527f2b02cde117ae53d66dc4d0bdf72b2146e0e1070c1428d6274b0f98d628ad99c49060600161089b565b611a13611d9a565b6001600160a01b0381165f908152600d602052604090205460ff1615611a4c57604051632ef470fd60e11b815260040160405180910390fd5b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce79101610949565b6001600160a01b038085165f9081526008602052604090205485911680338114611ae8576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508583611af58282611f47565b8415801590611b05575060088511155b611b2257604051632970307360e11b815260040160405180910390fd5b6001600160a01b038716611b495760405163f6b2911f60e01b815260040160405180910390fd5b5f5b85811015611cdc575f878783818110611b6657611b666129b3565b905060400201803603810190611b7c9190612a09565b90505f816020015111611ba257604051630dd484e760e41b815260040160405180910390fd5b6020808201516001600160a01b03808d165f908152600b8452604080822086519093168252919093528220805491929091611bde9084906129e2565b909155505060208082015182516001600160a01b03165f908152600a90925260408220805491929091611c129084906129e2565b9091555050600480547f40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db79167ffffffffffffffff909116905f611c548361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508b8b845f01518560200151604051611ccb95949392919067ffffffffffffffff9590951685526001600160a01b03938416602086015291831660408501529091166060830152608082015260a00190565b60405180910390a150600101611b4b565b505050505050505050565b611cef611d9a565b6001600160a01b038116611d1857604051631e4fbdf760e01b81525f60048201526024016106ef565b6111bc81612380565b6040516001600160a01b03838116602483015260448201839052611d9591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123cf565b505050565b5f546001600160a01b031633146111265760405163118cdaa760e01b81523360048201526024016106ef565b6040516001600160a01b03848116602483015283811660448301526064820183905261110f9186918216906323b872dd90608401611d4e565b5f80602083013560011615611e1857600360f81b611e1e565b600160f91b5b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152843560218201529091505f9060029060410160408051601f1981840301815290829052611e7591612a6b565b602060405180830381855afa158015611e90573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611eb39190612a81565b9050600381604051602001611eca91815260200190565b60408051601f1981840301815290829052611ee491612a6b565b602060405180830381855afa158015611eff573d5f5f3e3d5ffd5b5050604051516001600160a01b031695945050505050565b5f81604051602001611f299190612a98565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000115611fc0576001600160a01b0382165f90815260036020526040902054439003611fa557604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f03611fcb575050565b6001544303611ff25780600180015f828254611fe79190612939565b90915550611ffc9050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561144c5760405163a74c1c5f60e01b815260040160405180910390fd5b5f5f5f5f61204f8888888861243b565b92509250925061205f8282612503565b50909695505050505050565b345f5b825181101561235c575f83828151811061208a5761208a6129b3565b60209081029190910181015180516001600160a01b03165f908152600983526040908190208151608081018352815460ff811615158252610100900467ffffffffffffffff16818601526001820154928101929092526002015460608201529181015190925061210d57604051630dd484e760e41b815260040160405180910390fd5b602081015182519067ffffffffffffffff166121485760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b038087165f908152600b6020908152604080832086519094168352929052205460608201518110156121ce575f81836060015161218d91906129e2565b6020850151855191925082908111156121ca576040516349cd40ff60e01b81526001600160a01b03909216600483015260248201526044016106ef565b5050505b82516001600160a01b031661220e57602083015185811461220557604051630a61be9f60e41b81526004016106ef91815260200190565b505f945061222e565b6020830151835161222e916001600160a01b039091169033903090611dc6565b60208084015184516001600160a01b03165f908152600a90925260408220546122579190612939565b905082604001515f148061226f575080836040015110155b8451604085015190916122a65760405163421dca0560e11b81526001600160a01b03909216600483015260248201526044016106ef565b505083516001600160a01b039081165f908152600a60209081526040808320859055818801518c85168452600b83528184208951909516845293909152812080549091906122f5908490612939565b90915550508351602080860151604080516001600160a01b038d811682529094169284019290925282820152517fec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f39181900360600190a150506001909201915061206e9050565b505f811561110f57604051630a61be9f60e41b81526004016106ef91815260200190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f60205f8451602086015f885af1806123ee576040513d5f823e3d81fd5b50505f513d91508115612405578060011415612412565b6001600160a01b0384163b155b1561110f57604051635274afe760e01b81526001600160a01b03851660048201526024016106ef565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561247457505f915060039050826124f9565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124c5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124f057505f9250600191508290506124f9565b92505f91508190505b9450945094915050565b5f82600381111561251657612516612aa5565b0361251f575050565b600182600381111561253357612533612aa5565b036125515760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561256557612565612aa5565b036125865760405163fce698f760e01b8152600481018290526024016106ef565b600382600381111561259a5761259a612aa5565b0361144c576040516335e2f38360e21b8152600481018290526024016106ef565b80356001600160a01b03811681146125d1575f5ffd5b919050565b5f5f604083850312156125e7575f5ffd5b6125f0836125bb565b91506125fe602084016125bb565b90509250929050565b803567ffffffffffffffff811681146125d1575f5ffd5b5f5f5f5f60808587031215612631575f5ffd5b61263a85612607565b9350612648602086016125bb565b9250612656604086016125bb565b9396929550929360600135925050565b5f60208284031215612676575f5ffd5b61267f826125bb565b9392505050565b5f60208284031215612696575f5ffd5b5035919050565b80604081018310156126ad575f5ffd5b92915050565b5f604082840312156126c3575f5ffd5b61267f838361269d565b60ff811681146111bc575f5ffd5b5f5f5f5f60a085870312156126ee575f5ffd5b6126f8868661269d565b935060408501359250606085013591506080850135612716816126cd565b939692955090935050565b602080825282518282018190525f918401906040840190835b8181101561276d57835180516001600160a01b03168452602090810151818501529093019260409092019160010161273a565b509095945050505050565b5f5f5f5f6080858703121561278b575f5ffd5b612794856125bb565b93506127a260208601612607565b93969395505050506040820135916060013590565b5f5f604083850312156127c8575f5ffd5b6127d1836125bb565b946020939093013593505050565b5f5f83601f8401126127ef575f5ffd5b50813567ffffffffffffffff811115612806575f5ffd5b6020830191508360208260061b8501011115612820575f5ffd5b9250929050565b5f5f5f60408486031215612839575f5ffd5b612842846125bb565b9250602084013567ffffffffffffffff81111561285d575f5ffd5b612869868287016127df565b9497909650939450505050565b5f5f60408385031215612887575f5ffd5b612890836125bb565b91506125fe60208401612607565b5f5f5f5f608085870312156128b1575f5ffd5b6128ba85612607565b93506127a2602086016125bb565b5f5f5f5f606085870312156128db575f5ffd5b6128e4856125bb565b93506128f2602086016125bb565b9250604085013567ffffffffffffffff81111561290d575f5ffd5b612919878288016127df565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126ad576126ad612925565b5f67ffffffffffffffff821667ffffffffffffffff810361296f5761296f612925565b60010192915050565b6001600160a01b038481168252831660208201526080810160408381840137949350505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156129d7575f5ffd5b815161267f816126cd565b818103818111156126ad576126ad612925565b634e487b7160e01b5f52603160045260245ffd5b5f6040828403128015612a1a575f5ffd5b506040805190810167ffffffffffffffff81118282101715612a4a57634e487b7160e01b5f52604160045260245ffd5b604052612a56836125bb565b81526020928301359281019290925250919050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612a91575f5ffd5b5051919050565b6040828237604001919050565b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000005e87b3d603818159c71dbb840d68662e9ce19321", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x055b4019b88f7aa71b7fa33ca0687db78d4fda597c5ec85623eb9ed6cc0ae25d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3": "0x00000000000000000000000000000000000000000000000053444835ec580000", + "0x38616d077d268694dde564ae0a05ba993927a08552aa7364445831f6b818cdb7": "0x0000000000000000000000000000000000000000000000001bc16d674ec80000", + "0x3979c60a57c119fc597d83cf015d5c660d8f20fcb45f3407449591212753ecaa": "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x4e74f95a34c1682602dc02abf3e60537359d1ff5d942a93007d299abfe7071c5": "0x0000000000000000000000000000000000000000000000001bc16d674ec80000", + "0x57e1d877fd7b6bc2412a34cb73f519ae4c6d112c9cb5da99c33baa9902cd4e41": "0x0000000000000000000000007d9fb1017422e8a31fe0010c31650c9932fac1a1", + "0x6f1cd4958dc6b992af15a2e753d9785c14dc589f544909d2410557a3e3001ce7": "0x0000000000000000000000000000000000000000000000001bc16d674ec80000", + "0x8078c54fe6f1a87fbd97770d8302f107462594a95794569dfeb8e849e89d6064": "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x85836a4c50cae6315b1e47a39914f1aaef059b70f9c10c63bdb186b8da23394d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x9900e33d9f78931e8785a44cff3dee398e4c033db0b0377a91a243cc1a2c9f01": "0x0000000000000000000000000000000000000000000000000000000000000024", + "0xc8bd50701570438e690cc5fcf3ae413672e0a694f8321610a7a02e912136e0cd": "0x0000000000000000000000004f42539e37f7ec121007d2f0e43866985f8534b0", + "0xdf16dabd34abcab4b8a813f4ba256d0152cc0c430c937d23d7af7614bbc8bb0d": "0x00000000000000000000000025877253d48d0386fe5655522a1b04425220ebf7", + "0xe34e0bbb96e5fa39956146a56ce75486313e2fadbc7a8bfde4d7dd622446175e": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b": "0x00000000000000000000000000000000000000000000000000000000002ee001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c": "0x00000000000000000000000000000000000000000000002b5e3af16b18800000", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d": "0x0000000000000000000000000000000000000000000000001bc16d674ec80000", + "0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "bc10000000000000000000000000000000000005": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b5060043610610064575f3560e01c806385df51fd1161004d57806385df51fd1461009d57806394f490bd146100bc578063e405bbc3146100d1575f5ffd5b8063107bf28c1461006857806326a6557a14610086575b5f5ffd5b6100706100da565b60405161007d91906101fe565b60405180910390f35b61008f60015481565b60405190815260200161007d565b61008f6100ab366004610233565b5f9081526003602052604090205490565b6100cf6100ca366004610233565b610165565b005b61008f60025481565b5f80546100e69061024a565b80601f01602080910402602001604051908101604052809291908181526020018280546101129061024a565b801561015d5780601f106101345761010080835404028352916020019161015d565b820191905f5260205f20905b81548152906001019060200180831161014057829003601f168201915b505050505081565b3373bc100000000000000000000000000000000010001461019957604051634ca8886760e01b815260040160405180910390fd5b5f60025f81546101a890610282565b91829055505f8181526003602052604090819020849055519091507fdd5483f1119d050d70b0fe3ed9db0b5f41b3ec55838346cbb624efe0565b0133906101f29083815260200190565b60405180910390a15050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610243575f5ffd5b5035919050565b600181811c9082168061025e57607f821691505b60208210810361027c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6001820161029f57634e487b7160e01b5f52601160045260245ffd5b506001019056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x746573746e657433000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000000000000003464af", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000003464af", + "0xcb1e7cde6c7e7b67fd2e6b7837024d28c05b0f892234598df9504fe968ad07a6": "0xefb879bdda4c62a568ef5354d9ebf705d748d257d93cacc9a289440100000000" + } + }, + "BC10000000000000000000000000000000000006": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c80638da5cb5b11610072578063a3ec138d11610058578063a3ec138d1461015e578063cd57654314610180578063f2fde38b146101a2575f5ffd5b80638da5cb5b1461011257806398611f121461012c575f5ffd5b8063715018a6116100a2578063715018a6146100ee578063827fb811146100f657806386c1ff68146100ff575f5ffd5b80632ddbd13a146100bd5780637090a943146100d9575b5f5ffd5b6100c660015481565b6040519081526020015b60405180910390f35b6100ec6100e7366004610602565b6101b5565b005b6100ec6103c4565b6100c661010081565b6100ec61010d36600461062a565b6103d7565b5f546040516001600160a01b0390911681526020016100d0565b61014e61013a36600461064a565b60026020525f908152604090205460ff1681565b60405190151581526020016100d0565b61014e61016c36600461062a565b60036020525f908152604090205460ff1681565b61014e61018e36600461062a565b60046020525f908152604090205460ff1681565b6100ec6101b036600461062a565b610517565b6101bd610554565b5f8181526002602052604090205460ff16156102205760405162461bcd60e51b815260206004820152600e60248201527f6475706c696361746564206b657900000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0382165f9081526003602052604090205460ff16156102885760405162461bcd60e51b815260206004820152601060248201527f6475706c69636174656420766f746572000000000000000000000000000000006044820152606401610217565b6001600160a01b0382165f9081526004602052604090205460ff16156102f05760405162461bcd60e51b815260206004820152600d60248201527f64656c6574656420766f746572000000000000000000000000000000000000006044820152606401610217565b61010060015f815461030190610675565b9182905550106103535760405162461bcd60e51b815260206004820152600f60248201527f746f6f206d616e7920766f7465727300000000000000000000000000000000006044820152606401610217565b6001600160a01b0382165f8181526003602090815260408083208054600160ff199182168117909255868552600284529382902080549094161790925590518381527f101c617f43dd1b8a54a9d747d9121bbc55e93b88bc50560d782a79c4e28fc838910160405180910390a25050565b6103cc610554565b6103d55f610580565b565b6103df610554565b6001600160a01b0381165f9081526003602052604090205460ff166104465760405162461bcd60e51b815260206004820152600f60248201527f766f746572206e6f7420666f756e6400000000000000000000000000000000006044820152606401610217565b60018054116104975760405162461bcd60e51b815260206004820152600e60248201527f746f6f2066657720766f746572730000000000000000000000000000000000006044820152606401610217565b6001600160a01b0381165f908152600360209081526040808320805460ff1990811690915560049092528220805490911660019081179091558054916104dc8361068d565b90915550506040516001600160a01b038216907f183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e8905f90a250565b61051f610554565b6001600160a01b03811661054857604051631e4fbdf760e01b81525f6004820152602401610217565b61055181610580565b50565b5f546001600160a01b031633146103d55760405163118cdaa760e01b8152336004820152602401610217565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146105fd575f5ffd5b919050565b5f5f60408385031215610613575f5ffd5b61061c836105e7565b946020939093013593505050565b5f6020828403121561063a575f5ffd5b610643826105e7565b9392505050565b5f6020828403121561065a575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161068657610686610661565b5060010190565b5f8161069b5761069b610661565b505f19019056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f0c9583e7004bda697666b45b225d59f9cc636b9", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x484a6b01b3e3e52bc3f41ff5e9e71bca633f8152e8d3f69d34ca0bef2f2260a2": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x63e0bc436493695952b42e19f4944c3ef36a24b839195b32ba6c8226ef6caaca": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x6c79f5296e50ab3c976bfd2a389ab8350bbb40a5dbf74ebed1d2846f1e92112f": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x7e6cb734332efe99706b67232cd79fc8d72b531a8e9f840ce92f3b2ca9490652": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xb022734f5b831968a51f5277286e2e269e555a21e37762696fb3bb8082e89504": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xb20e607d76705630552b187de3fd439159f1e5bec17afe65f401d37d5221266d": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xdb30e2252c21185def5fe74a21888911a0ab486372eae0475125ea9b74c60292": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xe1f14e470c445296d843a101cc9ae22da12ef251d20e4bb8fa4f40e821f32a2b": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf9c6f15cfc2e56c85274b24a3e2e58e18f64bebbbbcbb7a0fa45e9c1118d2ca4": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + }, + "Bc10000000000000000000000000000000000007": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063023276f01461002d575b5f5ffd5b61004061003b3660046100f0565b610042565b005b5f5f5f1b82604051610053906100e3565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103905ff590508015801561008d573d5f5f3e3d5ffd5b5060405173ffffffffffffffffffffffffffffffffffffffff8083168252919250908316907f587ece4cd19692c5be1a4184503d607d45542d2aca0698c0068f52e09ccb541c9060200160405180910390a25050565b6111178061012b83390190565b5f60208284031215610100575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610123575f5ffd5b939250505056fe60c060405234801561000f575f5ffd5b5060405161111738038061111783398101604081905261002e91610233565b806001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610069573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100909190810190610274565b6040516020016100a0919061033b565b604051602081830303815290604052816001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100ea573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101119190810190610274565b6040516020016101219190610370565b60408051601f19818403018152919052600361013d8382610411565b50600461014a8282610411565b5050505f816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561018a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ae91906104cb565b60ff1690506012811080156101c257505f81115b6102055760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b604482015260640160405180910390fd5b6001600160a01b03821660805261021d8160126104ff565b61022890600a6105fb565b60a052506106069050565b5f60208284031215610243575f5ffd5b81516001600160a01b0381168114610259575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610284575f5ffd5b81516001600160401b03811115610299575f5ffd5b8201601f810184136102a9575f5ffd5b80516001600160401b038111156102c2576102c2610260565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102f0576102f0610260565b604052818152828201602001861015610307575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f81518060208401855e5f93019283525090919050565b5f6103468284610324565b600160fd1b81526f29ba30b73230b932102bb930b83832b960811b60018201526011019392505050565b5f61037b8284610324565b61535760f01b81526002019392505050565b600181811c908216806103a157607f821691505b6020821081036103bf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561040c57805f5260205f20601f840160051c810160208510156103ea5750805b601f840160051c820191505b81811015610409575f81556001016103f6565b50505b505050565b81516001600160401b0381111561042a5761042a610260565b61043e81610438845461038d565b846103c5565b6020601f821160018114610470575f83156104595750848201515b5f19600385901b1c1916600184901b178455610409565b5f84815260208120601f198516915b8281101561049f578785015182556020948501946001909201910161047f565b50848210156104bc57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156104db575f5ffd5b815160ff81168114610259575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610512576105126104eb565b92915050565b6001815b600184111561055357808504811115610537576105376104eb565b600184161561054557908102905b60019390931c92800261051c565b935093915050565b5f8261056957506001610512565b8161057557505f610512565b816001811461058b5760028114610595576105b1565b6001915050610512565b60ff8411156105a6576105a66104eb565b50506001821b610512565b5060208310610133831016604e8410600b84101617156105d4575081810a610512565b6105e05f198484610518565b805f19048211156105f3576105f36104eb565b029392505050565b5f610259838361055b565b60805160a051610acd61064a5f395f818161016d015281816103370152818161038f015261046401525f8181610194015281816103be015261042b0152610acd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80633ba0b9a91161008857806395d89b411161006357806395d89b41146101f6578063a9059cbb146101fe578063b6b55f2514610211578063dd62ed3e14610224575f5ffd5b80633ba0b9a9146101685780636f307dc31461018f57806370a08231146101ce575f5ffd5b806323b872dd116100b857806323b872dd146101315780632e1a7d4d14610144578063313ce56714610159575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e661025c565b6040516100f391906108f6565b60405180910390f35b61010f61010a366004610946565b6102ec565b60405190151581526020016100f3565b6002545b6040519081526020016100f3565b61010f61013f36600461096e565b610305565b6101576101523660046109a8565b610328565b005b604051601281526020016100f3565b6101237f000000000000000000000000000000000000000000000000000000000000000081565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100f3565b6101236101dc3660046109bf565b6001600160a01b03165f9081526020819052604090205490565b6100e66103e9565b61010f61020c366004610946565b6103f8565b61015761021f3660046109a8565b610405565b6101236102323660046109df565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461026b90610a10565b80601f016020809104026020016040519081016040528092919081815260200182805461029790610a10565b80156102e25780601f106102b9576101008083540402835291602001916102e2565b820191905f5260205f20905b8154815290600101906020018083116102c557829003601f168201915b5050505050905090565b5f336102f981858561048e565b60019150505b92915050565b5f336103128582856104a0565b61031d858585610520565b506001949350505050565b5f8111801561035e575061035c7f000000000000000000000000000000000000000000000000000000000000000082610a5c565b155b61037b57604051632a9ffab760e21b815260040160405180910390fd5b33610386818361057d565b6103e5816103b47f000000000000000000000000000000000000000000000000000000000000000085610a83565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906105b1565b5050565b60606004805461026b90610a10565b5f336102f9818585610520565b5f811161042557604051632a9ffab760e21b815260040160405180910390fd5b3361045b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316823085610625565b6103e5816104897f000000000000000000000000000000000000000000000000000000000000000085610a96565b61065e565b61049b8383836001610692565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461051a578181101561050c57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61051a84848484035f610692565b50505050565b6001600160a01b03831661054957604051634b637e8f60e11b81525f6004820152602401610503565b6001600160a01b0382166105725760405163ec442f0560e01b81525f6004820152602401610503565b61049b838383610764565b6001600160a01b0382166105a657604051634b637e8f60e11b81525f6004820152602401610503565b6103e5825f83610764565b6040516001600160a01b0383811660248301526044820183905261049b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061088a565b6040516001600160a01b03848116602483015283811660448301526064820183905261051a9186918216906323b872dd906084016105de565b6001600160a01b0382166106875760405163ec442f0560e01b81525f6004820152602401610503565b6103e55f8383610764565b6001600160a01b0384166106bb5760405163e602df0560e01b81525f6004820152602401610503565b6001600160a01b0383166106e457604051634a1406b160e11b81525f6004820152602401610503565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561051a57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161075691815260200190565b60405180910390a350505050565b6001600160a01b03831661078e578060025f8282546107839190610aad565b909155506107fe9050565b6001600160a01b0383165f90815260208190526040902054818110156107e05760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610503565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661081a57600280548290039055610838565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161087d91815260200190565b60405180910390a3505050565b5f5f60205f8451602086015f885af1806108a9576040513d5f823e3d81fd5b50505f513d915081156108c05780600114156108cd565b6001600160a01b0384163b155b1561051a57604051635274afe760e01b81526001600160a01b0385166004820152602401610503565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610941575f5ffd5b919050565b5f5f60408385031215610957575f5ffd5b6109608361092b565b946020939093013593505050565b5f5f5f60608486031215610980575f5ffd5b6109898461092b565b92506109976020850161092b565b929592945050506040919091013590565b5f602082840312156109b8575f5ffd5b5035919050565b5f602082840312156109cf575f5ffd5b6109d88261092b565b9392505050565b5f5f604083850312156109f0575f5ffd5b6109f98361092b565b9150610a076020840161092b565b90509250929050565b600181811c90821680610a2457607f821691505b602082108103610a4257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601260045260245ffd5b5f82610a6a57610a6a610a48565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82610a9157610a91610a48565b500490565b80820281158282048414176102ff576102ff610a6f565b808201808211156102ff576102ff610a6f56fea164736f6c634300081b000aa164736f6c634300081b000a", + "storage": {} + }, + "BC10000000000000000000000000000000000Da0": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6080604052600436106102f0575f3560e01c80637d5e81e211610186578063bc197c81116100dc578063e540d01d11610087578063f23a6e6111610062578063f23a6e611461097e578063f8ce560a146109a9578063fc0c546a146109c8575f5ffd5b8063e540d01d14610921578063eb9019d414610940578063ece40cc11461095f575f5ffd5b8063c59057e4116100b7578063c59057e41461088a578063dd4e2ba5146108a9578063deaaa7cc146108ee575f5ffd5b8063bc197c811461082d578063c01f9e3714610858578063c28bc2fa14610877575f5ffd5b806397c3d3341161013c578063a9a9529411610117578063a9a95294146107c4578063ab58fb8e146107e3578063b58131b014610819575f5ffd5b806397c3d3341461077e5780639a802a6d14610791578063a7713a70146107b0575f5ffd5b806384b0196e1161016c57806384b0196e1461070d5780638ff262e31461073457806391ddadf414610753575f5ffd5b80637d5e81e2146106ba5780637ecebe00146106d9575f5ffd5b80633e4f49e61161024657806356781388116101f157806360c4247f116101cc57806360c4247f1461065d578063790518871461067c5780637b3c71d31461069b575f5ffd5b806356781388146106005780635b8d0e0d1461061f5780635f398a141461063e575f5ffd5b80634bf5d7e9116102215780634bf5d7e914610570578063544ffc9c1461058457806354fd4d50146105d7575f5ffd5b80633e4f49e6146104dd5780634385963214610509578063452115d614610551575f5ffd5b8063150b7a02116102a65780632d63f693116102815780632d63f6931461045c5780632fe3e261146104965780633932abb1146104c9575f5ffd5b8063150b7a02146103e7578063160cbed71461042a5780632656227d14610449575f5ffd5b806306f3f9e6116102d657806306f3f9e61461035b57806306fdde031461037a578063143489d01461039b575f5ffd5b806301ffc9a7146102fc57806302a251a314610330575f5ffd5b366102f8575b005b5f5ffd5b348015610307575f5ffd5b5061031b610316366004612c6c565b6109fa565b60405190151581526020015b60405180910390f35b34801561033b575f5ffd5b50600854600160301b900463ffffffff165b604051908152602001610327565b348015610366575f5ffd5b506102f6610375366004612c93565b610a50565b348015610385575f5ffd5b5061038e610a64565b6040516103279190612cd8565b3480156103a6575f5ffd5b506103cf6103b5366004612c93565b5f908152600460205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610327565b3480156103f2575f5ffd5b50610411610401366004612dc5565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610327565b348015610435575f5ffd5b5061034d610444366004612f88565b610af4565b61034d610457366004612f88565b610b3c565b348015610467575f5ffd5b5061034d610476366004612c93565b5f90815260046020526040902054600160a01b900465ffffffffffff1690565b3480156104a1575f5ffd5b5061034d7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b3480156104d4575f5ffd5b5061034d610c7f565b3480156104e8575f5ffd5b506104fc6104f7366004612c93565b610c91565b6040516103279190613052565b348015610514575f5ffd5b5061031b610523366004613060565b5f8281526009602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561055c575f5ffd5b5061034d61056b366004612f88565b610dda565b34801561057b575f5ffd5b5061038e610e46565b34801561058f575f5ffd5b506105bc61059e366004612c93565b5f908152600960205260409020805460018201546002909201549092565b60408051938452602084019290925290820152606001610327565b3480156105e2575f5ffd5b506040805180820190915260018152603160f81b602082015261038e565b34801561060b575f5ffd5b5061034d61061a36600461309a565b610f06565b34801561062a575f5ffd5b5061034d610639366004613100565b610f2d565b348015610649575f5ffd5b5061034d6106583660046131bd565b611089565b348015610668575f5ffd5b5061034d610677366004612c93565b6110dc565b348015610687575f5ffd5b506102f6610696366004613253565b611168565b3480156106a6575f5ffd5b5061034d6106b536600461326e565b611179565b3480156106c5575f5ffd5b5061034d6106d43660046132c4565b6111bf565b3480156106e4575f5ffd5b5061034d6106f3366004613384565b6001600160a01b03165f9081526002602052604090205490565b348015610718575f5ffd5b50610721611275565b60405161032797969594939291906133d7565b34801561073f575f5ffd5b5061034d61074e366004613444565b6112b7565b34801561075e575f5ffd5b50610767611386565b60405165ffffffffffff9091168152602001610327565b348015610789575f5ffd5b50606461034d565b34801561079c575f5ffd5b5061034d6107ab366004613490565b61140d565b3480156107bb575f5ffd5b5061034d611423565b3480156107cf575f5ffd5b5061031b6107de366004612c93565b505f90565b3480156107ee575f5ffd5b5061034d6107fd366004612c93565b5f9081526004602052604090206001015465ffffffffffff1690565b348015610824575f5ffd5b5061034d61143c565b348015610838575f5ffd5b506104116108473660046134e3565b63bc197c8160e01b95945050505050565b348015610863575f5ffd5b5061034d610872366004612c93565b611446565b6102f6610885366004613579565b611488565b348015610895575f5ffd5b5061034d6108a4366004612f88565b611504565b3480156108b4575f5ffd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e9082015261038e565b3480156108f9575f5ffd5b5061034d7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b34801561092c575f5ffd5b506102f661093b3660046135b7565b61153d565b34801561094b575f5ffd5b5061034d61095a3660046135da565b61154e565b34801561096a575f5ffd5b506102f6610979366004612c93565b61156d565b348015610989575f5ffd5b50610411610998366004613602565b63f23a6e6160e01b95945050505050565b3480156109b4575f5ffd5b5061034d6109c3366004612c93565b61157e565b3480156109d3575f5ffd5b507f000000000000000000000000bc100000000000000000000000000000000000016103cf565b5f6001600160e01b031982166332a2ad4360e11b1480610a2a57506001600160e01b03198216630271189760e51b145b80610a4557506301ffc9a760e01b6001600160e01b03198316145b92915050565b905090565b610a58611588565b610a61816115bf565b50565b606060038054610a7390613656565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613656565b8015610aea5780601f10610ac157610100808354040283529160200191610aea565b820191905f5260205f20905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b5f5f610b0286868686611504565b9050610b1781610b126004611654565b611676565b505f604051634844252360e11b815260040160405180910390fd5b5095945050505050565b5f5f610b4a86868686611504565b9050610b6a81610b5a6005611654565b610b646004611654565b17611676565b505f81815260046020526040902080547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f01b17905530610bac3090565b6001600160a01b031614610c35575f5b8651811015610c3357306001600160a01b0316878281518110610be157610be161368e565b60200260200101516001600160a01b031603610c2b57610c2b858281518110610c0c57610c0c61368e565b60200260200101518051906020012060056116b390919063ffffffff16565b600101610bbc565b505b610c428187878787611726565b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b5f610a4b60085465ffffffffffff1690565b5f818152600460205260408120805460ff600160f01b8204811691600160f81b9004168115610cc557506007949350505050565b8015610cd657506002949350505050565b5f85815260046020526040812054600160a01b900465ffffffffffff169050805f03610d1d57604051636ad0607560e01b8152600481018790526024015b60405180910390fd5b5f610d26611386565b65ffffffffffff169050808210610d4357505f9695505050505050565b5f610d4d88611446565b9050818110610d6457506001979650505050505050565b610d6d886117fb565b1580610d8c57505f888152600960205260409020805460019091015411155b15610d9f57506003979650505050505050565b5f8881526004602052604090206001015465ffffffffffff165f03610dcc57506004979650505050505050565b506005979650505050505050565b5f5f610de886868686611504565b9050610df781610b125f611654565b505f818152600460205260409020546001600160a01b03163314610e305760405163233d98e360e01b8152336004820152602401610d14565b610e3c8686868661184b565b9695505050505050565b60607f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b0316634bf5d7e96040518163ffffffff1660e01b81526004015f60405180830381865afa925050508015610ec557506040513d5f823e601f3d908101601f19168201604052610ec291908101906136a2565b60015b610f01575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b5f80339050610f2584828560405180602001604052805f815250611912565b949350505050565b5f5f61100e876110087f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c610f808e6001600160a01b03165f90815260026020526040902080546001810190915590565b8d8d604051610f90929190613717565b60405180910390208c80519060200120604051602001610fed9796959493929190968752602087019590955260ff9390931660408601526001600160a01b03919091166060850152608084015260a083015260c082015260e00190565b6040516020818303038152906040528051906020012061193c565b85611968565b905080611039576040516394ab6c0760e01b81526001600160a01b0388166004820152602401610d14565b61107c89888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508b92506119d8915050565b9998505050505050505050565b5f803390506110d187828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506119d8915050565b979650505050505050565b600a80545f9182906110ef60018461373a565b815481106110ff576110ff61368e565b5f918252602090912001805490915065ffffffffffff811690600160301b90046001600160d01b0316858211611141576001600160d01b031695945050505050565b61115561114d87611acb565b600a90611b01565b6001600160d01b03169695505050505050565b611170611588565b610a6181611bb0565b5f80339050610e3c86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061191292505050565b5f336111cb8184611c16565b6111f35760405163d9b3955760e01b81526001600160a01b0382166004820152602401610d14565b5f6111fc61143c565b90508015611268575f61122a836001611213611386565b61121d919061374d565b65ffffffffffff1661154e565b90508181101561126657604051636121770b60e11b81526001600160a01b03841660048201526024810182905260448101839052606401610d14565b505b6110d18787878786611d34565b5f6060805f5f5f6060611286611f8a565b61128e611fb6565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f611341846110087ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d789898961130a8b6001600160a01b03165f90815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff90911660608401526001600160a01b0316608083015260a082015260c001610fed565b90508061136c576040516394ab6c0760e01b81526001600160a01b0385166004820152602401610d14565b610e3c86858760405180602001604052805f815250611912565b5f7f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611401575060408051601f3d908101601f191682019092526113fe9181019061376b565b60015b610f0157610a4b611fe3565b5f611419848484611fed565b90505b9392505050565b5f61142e600a612080565b6001600160d01b0316905090565b5f610a4b60075490565b5f8181526004602052604081205461147a90600160d01b810463ffffffff1690600160a01b900465ffffffffffff16613786565b65ffffffffffff1692915050565b611490611588565b5f5f856001600160a01b03168585856040516114ad929190613717565b5f6040518083038185875af1925050503d805f81146114e7576040519150601f19603f3d011682016040523d82523d5f602084013e6114ec565b606091505b50915091506114fb82826120b7565b50505050505050565b5f8484848460405160200161151c9493929190613837565b60408051601f19818403018152919052805160209091012095945050505050565b611545611588565b610a61816120d3565b5f61141c838361156860408051602081019091525f815290565b611fed565b611575611588565b610a618161216f565b5f610a45826121b0565b3033146115aa576040516347096e4760e01b8152336004820152602401610d14565b565b806115b76005612257565b036115ac5750565b6064808211156115ec5760405163243e544560e01b81526004810183905260248101829052604401610d14565b5f6115f5611423565b9050611614611602611386565b61160b856122d6565b600a9190612309565b505060408051828152602081018590527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a1505050565b5f8160078111156116675761166761301e565b600160ff919091161b92915050565b5f5f61168184610c91565b90505f8361168e83611654565b160361141c578381846040516331b75e4d60e01b8152600401610d1493929190613881565b81546fffffffffffffffffffffffffffffffff600160801b8204811691811660018301909116036116e8576116e86041612323565b6fffffffffffffffffffffffffffffffff8082165f90815260018086016020526040909120939093558354919092018216600160801b029116179055565b5f5b84518110156117f3575f5f8683815181106117455761174561368e565b60200260200101516001600160a01b03168684815181106117685761176861368e565b60200260200101518685815181106117825761178261368e565b602002602001015160405161179791906138a3565b5f6040518083038185875af1925050503d805f81146117d1576040519150601f19603f3d011682016040523d82523d5f602084013e6117d6565b606091505b50915091506117e582826120b7565b505050806001019050611728565b505050505050565b5f8181526009602052604081206002810154600182015461181c91906138b9565b5f8481526004602052604090205461184290600160a01b900465ffffffffffff1661157e565b11159392505050565b5f5f61185986868686611504565b90506118a7816118696007611654565b6118736006611654565b61187d6002611654565b600161188a6007826138cc565b6118959060026139c0565b61189f919061373a565b181818611676565b505f818152600460205260409081902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610c6e9083815260200190565b5f6119338585858561192e60408051602081019091525f815290565b6119d8565b95945050505050565b5f610a45611948612334565b8360405161190160f01b8152600281019290925260228201526042902090565b5f836001600160a01b03163b5f036119c6575f5f611986858561245d565b5090925090505f81600381111561199f5761199f61301e565b1480156119bd5750856001600160a01b0316826001600160a01b0316145b9250505061141c565b6119d18484846124a6565b905061141c565b5f6119e786610b126001611654565b505f86815260046020526040812054611a11908790600160a01b900465ffffffffffff1685611fed565b90505f611a218888888588612591565b905083515f03611a7757866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051611a6a94939291906139ce565b60405180910390a26110d1565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051611ab89594939291906139f5565b60405180910390a2979650505050505050565b5f65ffffffffffff821115611afd576040516306dfcc6560e41b81526030600482015260248101839052604401610d14565b5090565b81545f9081816005811115611b5d575f611b1a8461268d565b611b24908561373a565b5f8881526020902090915081015465ffffffffffff9081169087161015611b4d57809150611b5b565b611b588160016138b9565b92505b505b5f611b6a878785856127e5565b90508015611ba457611b8e87611b8160018461373a565b5f91825260209091200190565b54600160301b90046001600160d01b03166110d1565b5f979650505050505050565b6008546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b80515f906034811015611c2d576001915050610a45565b828101601319015173ffffffffffffffffffffffffffffffffffffffff1981167f2370726f706f7365723d3078000000000000000000000000000000000000000014611c7e57600192505050610a45565b5f80611c8b60288561373a565b90505b83811015611d13575f5f611cd9888481518110611cad57611cad61368e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016612844565b9150915081611cf15760019650505050505050610a45565b8060ff166004856001600160a01b0316901b1793505050806001019050611c8e565b50856001600160a01b0316816001600160a01b031614935050505092915050565b5f611d488686868680519060200120611504565b905084518651141580611d5d57508351865114155b80611d6757508551155b15611d9c57855184518651604051630447b05d60e41b8152600481019390935260248301919091526044820152606401610d14565b5f81815260046020526040902054600160a01b900465ffffffffffff1615611de55780611dc882610c91565b6040516331b75e4d60e01b8152610d149291905f90600401613881565b5f611dee610c7f565b611df6611386565b65ffffffffffff16611e0891906138b9565b90505f611e2260085463ffffffff600160301b9091041690565b5f848152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716178155909150611e6183611acb565b815465ffffffffffff91909116600160a01b027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff909116178155611ea4826128d4565b815463ffffffff91909116600160d01b027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff90911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c9067ffffffffffffffff811115611f2057611f20612d00565b604051908082528060200260200182016040528015611f5357816020015b6060815260200190600190039081611f3e5790505b508c89611f608a826138b9565b8e604051611f7699989796959493929190613a3a565b60405180910390a150505095945050505050565b6060610a4b7f476f617444414f000000000000000000000000000000000000000000000000075f612904565b6060610a4b7f31000000000000000000000000000000000000000000000000000000000000016001612904565b5f610a4b43611acb565b5f7f000000000000000000000000bc10000000000000000000000000000000000001604051630748d63560e31b81526001600160a01b038681166004830152602482018690529190911690633a46b1a890604401602060405180830381865afa15801561205c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114199190613b14565b80545f9080156120af5761209983611b8160018461373a565b54600160301b90046001600160d01b031661141c565b5f9392505050565b6060826120cc576120c7826129ad565b610a45565b5080610a45565b8063ffffffff165f036120fb5760405163f1cfbf0560e01b81525f6004820152602401610d14565b6008546040805163ffffffff600160301b9093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a16008805463ffffffff909216600160301b0269ffffffff00000000000019909216919091179055565b60075460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600755565b5f60646121bc836110dc565b604051632394e7a360e21b8152600481018590526001600160a01b037f000000000000000000000000bc100000000000000000000000000000000000011690638e539e8c90602401602060405180830381865afa15801561221f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122439190613b14565b61224d9190613b2b565b610a459190613b56565b80545f906fffffffffffffffffffffffffffffffff80821691600160801b9004168103612288576122886031612323565b6fffffffffffffffffffffffffffffffff8181165f908152600185810160205260408220805492905585546fffffffffffffffffffffffffffffffff19169301909116919091179092555090565b5f6001600160d01b03821115611afd576040516306dfcc6560e41b815260d0600482015260248101839052604401610d14565b5f806123168585856129d6565b915091505b935093915050565b634e487b715f52806020526024601cfd5b5f306001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614801561238c57507f000000000000000000000000000000000000000000000000000000000000beb046145b156123b657507f3125659d62319bc38c263a9cdd617fbe8598727a977f7ec05d25ffba4e5a02dc90565b610a4b604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f7081057b801cf71f391bb13ad68bb1be4f896665916f118ed4c6811f09fe527c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f8351604103612494576020840151604085015160608601515f1a61248688828585612b26565b95509550955050505061249f565b505081515f91506002905b9250925092565b5f5f5f856001600160a01b031685856040516024016124c6929190613b75565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16630b135d3f60e11b1790525161251091906138a3565b5f60405180830381855afa9150503d805f8114612548576040519150601f19603f3d011682016040523d82523d5f602084013e61254d565b606091505b509150915081801561256157506020815110155b8015610e3c57508051630b135d3f60e11b906125869083016020908101908401613b14565b149695505050505050565b5f8581526009602090815260408083206001600160a01b03881684526003810190925282205460ff16156125e3576040516371c6af4960e01b81526001600160a01b0387166004820152602401610d14565b6001600160a01b0386165f9081526003820160205260409020805460ff1916600117905560ff851661262c5783815f015f82825461262191906138b9565b909155506126829050565b5f1960ff86160161264a5783816001015f82825461262191906138b9565b60011960ff8616016126695783816002015f82825461262191906138b9565b6040516303599be160e11b815260040160405180910390fd5b509195945050505050565b5f6001821161269a575090565b816001600160801b82106126b35760809190911c9060401b5b6801000000000000000082106126ce5760409190911c9060201b5b64010000000082106126e55760209190911c9060101b5b6201000082106126fa5760109190911c9060081b5b610100821061270e5760089190911c9060041b5b601082106127215760049190911c9060021b5b6004821061272d5760011b5b600302600190811c9081858161274557612745613b42565b048201901c9050600181858161275d5761275d613b42565b048201901c9050600181858161277557612775613b42565b048201901c9050600181858161278d5761278d613b42565b048201901c905060018185816127a5576127a5613b42565b048201901c905060018185816127bd576127bd613b42565b048201901c90506127dc8185816127d6576127d6613b42565b04821190565b90039392505050565b5f5b8183101561283c575f6127fa8484612bee565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561282857809250612836565b6128338160016138b9565b93505b506127e7565b509392505050565b5f8060f883901c602f8111801561285e5750603a8160ff16105b1561287357600194602f199091019350915050565b8060ff166040108015612889575060478160ff16105b1561289e576001946036199091019350915050565b8060ff1660601080156128b4575060678160ff16105b156128c9576001946056199091019350915050565b505f93849350915050565b5f63ffffffff821115611afd576040516306dfcc6560e41b81526020600482015260248101839052604401610d14565b606060ff831461291e5761291783612c08565b9050610a45565b81805461292a90613656565b80601f016020809104026020016040519081016040528092919081815260200182805461295690613656565b80156129a15780601f10612978576101008083540402835291602001916129a1565b820191905f5260205f20905b81548152906001019060200180831161298457829003601f168201915b50505050509050610a45565b8051156129bd5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b82545f9081908015612acc575f6129f287611b8160018561373a565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115612a3557604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603612a6e57825465ffffffffffff16600160301b6001600160d01b03891602178355612abe565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b945085935061231b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b02919093161792019190915590508161231b565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b5f57505f91506003905082612be4565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612bb0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612bdb57505f925060019150829050612be4565b92505f91508190505b9450945094915050565b5f612bfc6002848418613b56565b61141c908484166138b9565b60605f612c1483612c45565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f811115610a4557604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215612c7c575f5ffd5b81356001600160e01b03198116811461141c575f5ffd5b5f60208284031215612ca3575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61141c6020830184612caa565b80356001600160a01b0381168114610f01575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612d3d57612d3d612d00565b604052919050565b5f67ffffffffffffffff821115612d5e57612d5e612d00565b50601f01601f191660200190565b5f612d7e612d7984612d45565b612d14565b9050828152838383011115612d91575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112612db6575f5ffd5b61141c83833560208501612d6c565b5f5f5f5f60808587031215612dd8575f5ffd5b612de185612cea565b9350612def60208601612cea565b925060408501359150606085013567ffffffffffffffff811115612e11575f5ffd5b612e1d87828801612da7565b91505092959194509250565b5f67ffffffffffffffff821115612e4257612e42612d00565b5060051b60200190565b5f82601f830112612e5b575f5ffd5b8135612e69612d7982612e29565b8082825260208201915060208360051b860101925085831115612e8a575f5ffd5b602085015b83811015610b3257612ea081612cea565b835260209283019201612e8f565b5f82601f830112612ebd575f5ffd5b8135612ecb612d7982612e29565b8082825260208201915060208360051b860101925085831115612eec575f5ffd5b602085015b83811015610b32578035835260209283019201612ef1565b5f82601f830112612f18575f5ffd5b8135612f26612d7982612e29565b8082825260208201915060208360051b860101925085831115612f47575f5ffd5b602085015b83811015610b3257803567ffffffffffffffff811115612f6a575f5ffd5b612f79886020838a0101612da7565b84525060209283019201612f4c565b5f5f5f5f60808587031215612f9b575f5ffd5b843567ffffffffffffffff811115612fb1575f5ffd5b612fbd87828801612e4c565b945050602085013567ffffffffffffffff811115612fd9575f5ffd5b612fe587828801612eae565b935050604085013567ffffffffffffffff811115613001575f5ffd5b61300d87828801612f09565b949793965093946060013593505050565b634e487b7160e01b5f52602160045260245ffd5b6008811061304e57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610a458284613032565b5f5f60408385031215613071575f5ffd5b8235915061308160208401612cea565b90509250929050565b803560ff81168114610f01575f5ffd5b5f5f604083850312156130ab575f5ffd5b823591506130816020840161308a565b5f5f83601f8401126130cb575f5ffd5b50813567ffffffffffffffff8111156130e2575f5ffd5b6020830191508360208285010111156130f9575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a031215613116575f5ffd5b873596506131266020890161308a565b955061313460408901612cea565b9450606088013567ffffffffffffffff81111561314f575f5ffd5b61315b8a828b016130bb565b909550935050608088013567ffffffffffffffff81111561317a575f5ffd5b6131868a828b01612da7565b92505060a088013567ffffffffffffffff8111156131a2575f5ffd5b6131ae8a828b01612da7565b91505092959891949750929550565b5f5f5f5f5f608086880312156131d1575f5ffd5b853594506131e16020870161308a565b9350604086013567ffffffffffffffff8111156131fc575f5ffd5b613208888289016130bb565b909450925050606086013567ffffffffffffffff811115613227575f5ffd5b61323388828901612da7565b9150509295509295909350565b65ffffffffffff81168114610a61575f5ffd5b5f60208284031215613263575f5ffd5b813561141c81613240565b5f5f5f5f60608587031215613281575f5ffd5b843593506132916020860161308a565b9250604085013567ffffffffffffffff8111156132ac575f5ffd5b6132b8878288016130bb565b95989497509550505050565b5f5f5f5f608085870312156132d7575f5ffd5b843567ffffffffffffffff8111156132ed575f5ffd5b6132f987828801612e4c565b945050602085013567ffffffffffffffff811115613315575f5ffd5b61332187828801612eae565b935050604085013567ffffffffffffffff81111561333d575f5ffd5b61334987828801612f09565b925050606085013567ffffffffffffffff811115613365575f5ffd5b8501601f81018713613375575f5ffd5b612e1d87823560208401612d6c565b5f60208284031215613394575f5ffd5b61141c82612cea565b5f8151808452602084019350602083015f5b828110156133cd5781518652602095860195909101906001016133af565b5093949350505050565b60ff60f81b8816815260e060208201525f6133f560e0830189612caa565b82810360408401526134078189612caa565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613436818561339d565b9a9950505050505050505050565b5f5f5f5f60808587031215613457575f5ffd5b843593506134676020860161308a565b925061347560408601612cea565b9150606085013567ffffffffffffffff811115612e11575f5ffd5b5f5f5f606084860312156134a2575f5ffd5b6134ab84612cea565b925060208401359150604084013567ffffffffffffffff8111156134cd575f5ffd5b6134d986828701612da7565b9150509250925092565b5f5f5f5f5f60a086880312156134f7575f5ffd5b61350086612cea565b945061350e60208701612cea565b9350604086013567ffffffffffffffff811115613529575f5ffd5b61353588828901612eae565b935050606086013567ffffffffffffffff811115613551575f5ffd5b61355d88828901612eae565b925050608086013567ffffffffffffffff811115613227575f5ffd5b5f5f5f5f6060858703121561358c575f5ffd5b61359585612cea565b935060208501359250604085013567ffffffffffffffff8111156132ac575f5ffd5b5f602082840312156135c7575f5ffd5b813563ffffffff8116811461141c575f5ffd5b5f5f604083850312156135eb575f5ffd5b6135f483612cea565b946020939093013593505050565b5f5f5f5f5f60a08688031215613616575f5ffd5b61361f86612cea565b945061362d60208701612cea565b93506040860135925060608601359150608086013567ffffffffffffffff811115613227575f5ffd5b600181811c9082168061366a57607f821691505b60208210810361368857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156136b2575f5ffd5b815167ffffffffffffffff8111156136c8575f5ffd5b8201601f810184136136d8575f5ffd5b80516136e6612d7982612d45565b8181528560208385010111156136fa575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4557610a45613726565b65ffffffffffff8281168282160390811115610a4557610a45613726565b5f6020828403121561377b575f5ffd5b815161141c81613240565b65ffffffffffff8181168382160190811115610a4557610a45613726565b5f8151808452602084019350602083015f5b828110156133cd5781516001600160a01b03168652602095860195909101906001016137b6565b5f82825180855260208501945060208160051b830101602085015f5b8381101561382b57601f19858403018852613815838351612caa565b60209889019890935091909101906001016137f9565b50909695505050505050565b608081525f61384960808301876137a4565b828103602084015261385b818761339d565b9050828103604084015261386f81866137dd565b91505082606083015295945050505050565b838152606081016138956020830185613032565b826040830152949350505050565b5f82518060208501845e5f920191825250919050565b80820180821115610a4557610a45613726565b60ff8181168382160190811115610a4557610a45613726565b6001815b600184111561231b5780850481111561390457613904613726565b600184161561391257908102905b60019390931c9280026138e9565b5f8261392e57506001610a45565b8161393a57505f610a45565b8160018114613950576002811461395a57613976565b6001915050610a45565b60ff84111561396b5761396b613726565b50506001821b610a45565b5060208310610133831016604e8410600b8410161715613999575081810a610a45565b6139a55f1984846138e5565b805f19048211156139b8576139b8613726565b029392505050565b5f61141c60ff841683613920565b84815260ff84166020820152826040820152608060608201525f610e3c6080830184612caa565b85815260ff8516602082015283604082015260a060608201525f613a1c60a0830185612caa565b8281036080840152613a2e8185612caa565b98975050505050505050565b8981526001600160a01b038916602082015261012060408201525f613a6361012083018a6137a4565b8281036060840152613a75818a61339d565b9050828103608084015280885180835260208301915060208160051b84010160208b015f5b83811015613acc57601f19868403018552613ab6838351612caa565b6020958601959093509190910190600101613a9a565b505085810360a0870152613ae0818b6137dd565b93505050508560c08401528460e0840152828103610100840152613b048185612caa565b9c9b505050505050505050505050565b5f60208284031215613b24575f5ffd5b5051919050565b8082028115828204841417610a4557610a45613726565b634e487b7160e01b5f52601260045260245ffd5b5f82613b7057634e487b7160e01b5f52601260045260245ffd5b500490565b828152604060208201525f6114196040830184612caa56fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x476f617444414f0000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000093a80000000015180", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000000000000000000000000004000000000004" + } + } +} diff --git a/core/state_processor.go b/core/state_processor.go index 3eb83a673a968..28f1f28e48372 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -63,6 +63,9 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg blockNumber = block.Number() allLogs []*types.Log gp = new(GasPool).AddGas(block.GasLimit()) + + // gas reward to validators and goat foundation + goatGasFees = new(big.Int) ) // Mutate the block and state according to any hard-fork specs @@ -103,10 +106,29 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg } receipts = append(receipts, receipt) allLogs = append(allLogs, receipt.Logs...) + + if receipt.GasUsed > 0 { // non-goatTx case + tipFee := new(big.Int).SetUint64(receipt.GasUsed) + tipFee.Mul(tipFee, tx.EffectiveGasTipValue(context.BaseFee)) + goatGasFees.Add(goatGasFees, tipFee) + } } // Read requests if Prague is enabled. var requests [][]byte - if p.config.IsPrague(block.Number(), block.Time()) { + if p.config.Goat != nil { + burntFees := new(big.Int) + if context.BaseFee != nil && header.GasUsed > 0 { + burntFees.Mul(context.BaseFee, new(big.Int).SetUint64(header.GasUsed)) + } + goatGasFees.Add(goatGasFees, burntFees) + reward := AllocateGoatGasFee(statedb, goatGasFees) + goatRequests, err := ProcessGoatRequests(block.NumberU64(), reward, allLogs) + if err != nil { + return nil, err + } + requests = goatRequests + } + if p.config.Goat == nil && p.config.IsPrague(block.Number(), block.Time()) { requests = [][]byte{} // EIP-6110 if err := ParseDepositLogs(&requests, allLogs, p.config); err != nil { @@ -212,6 +234,10 @@ func ApplyTransaction(evm *vm.EVM, gp *GasPool, statedb *state.StateDB, header * // ProcessBeaconBlockRoot applies the EIP-4788 system call to the beacon block root // contract. This method is exported to be used in tests. func ProcessBeaconBlockRoot(beaconRoot common.Hash, evm *vm.EVM) { + if evm.ChainConfig().Goat != nil { // reenable it when we have a correct beacon root + return + } + if tracer := evm.Config.Tracer; tracer != nil { onSystemCallStart(tracer, evm.GetVMContext()) if tracer.OnSystemCallEnd != nil { diff --git a/core/state_processor_goat.go b/core/state_processor_goat.go new file mode 100644 index 0000000000000..88363f06387c1 --- /dev/null +++ b/core/state_processor_goat.go @@ -0,0 +1,196 @@ +package core + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/types/goattypes" + "github.com/holiman/uint256" +) + +var ( + gfBasePoint = big.NewInt(200) + gfMaxBasePoint = big.NewInt(1e4) +) + +func AllocateGoatGasFee(statedb *state.StateDB, gasFees *big.Int) *big.Int { + if gasFees.Sign() == 0 { + return new(big.Int) + } + + // foundation tax 2% + tax := new(big.Int).Mul(gasFees, gfBasePoint) + tax.Div(tax, gfMaxBasePoint) + + if tax.Sign() > 0 { + f, _ := uint256.FromBig(tax) + statedb.AddBalance(goattypes.GoatFoundationContract, f, tracing.BalanceIncreaseRewardTransactionFee) + } + + // add gas revenue to locking contract + // if the validator withdraws the gas reward, we will subtract it from locking contract then + gas := new(big.Int).Sub(gasFees, tax) + if gas.Sign() > 0 { + f, _ := uint256.FromBig(gas) + statedb.AddBalance(goattypes.LockingContract, f, tracing.BalanceIncreaseRewardTransactionFee) + } + return gas +} + +// ProcessGoatRequests processes goat requests +func ProcessGoatRequests(height uint64, reward *big.Int, allLogs []*types.Log) ([][]byte, error) { + var ( + lockingRequests goattypes.LockingRequests + bridgeRequests goattypes.BridgeRequests + relayerRequests goattypes.RelayerRequests + ) + + lockingRequests.Gas = append(lockingRequests.Gas, goattypes.NewGasRequest(height, reward)) + + for _, log := range allLogs { + switch log.Address { + case goattypes.BridgeContract: + if len(log.Topics) < 1 { + continue + } + switch log.Topics[0] { + case goattypes.WithdrawEventTopic: + req, err := goattypes.UnpackIntoWithdrawRequest(log.Topics, log.Data) + if err != nil { + return nil, err + } + bridgeRequests.Withdraws = append(bridgeRequests.Withdraws, req) + case goattypes.ReplaceByFeeEventTopic: + req, err := goattypes.UnpackIntoReplaceByFeeRequest(log.Topics, log.Data) + if err != nil { + return nil, err + } + bridgeRequests.ReplaceByFees = append(bridgeRequests.ReplaceByFees, req) + case goattypes.Cancel1EventTopic: + req, err := goattypes.UnpackIntoCancel1Request(log.Topics, log.Data) + if err != nil { + return nil, err + } + bridgeRequests.Cancel1s = append(bridgeRequests.Cancel1s, req) + case goattypes.UpdateDepositTaxEventTopic: + req, err := goattypes.UnpackIntoDepositTaxRequest(log.Data) + if err != nil { + return nil, err + } + bridgeRequests.DepositTax = append(bridgeRequests.DepositTax, req) + case goattypes.ConfirmationNumberEventTopic: + req, err := goattypes.UnpackIntoConfirmationNumberRequest(log.Data) + if err != nil { + return nil, err + } + bridgeRequests.Confirmation = append(bridgeRequests.Confirmation, req) + case goattypes.UpdateMinDepositEventTopic: + req, err := goattypes.UnpackIntoMinDepositRequest(log.Data) + if err != nil { + return nil, err + } + bridgeRequests.MinDeposit = append(bridgeRequests.MinDeposit, req) + } + case goattypes.LockingContract: + if len(log.Topics) != 1 { + continue + } + switch log.Topics[0] { + case goattypes.CreateEventTopic: + req, err := goattypes.UnpackIntoCreateRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.Creates = append(lockingRequests.Creates, req) + case goattypes.LockEventTopic: + req, err := goattypes.UnpackIntoLockRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.Locks = append(lockingRequests.Locks, req) + case goattypes.UnlockEventTopic: + req, err := goattypes.UnpackIntoUnlockRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.Unlocks = append(lockingRequests.Unlocks, req) + case goattypes.ClaimEventTopic: + req, err := goattypes.UnpackIntoClaimRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.Claims = append(lockingRequests.Claims, req) + case goattypes.GrantEventTopic: + req, err := goattypes.UnpackIntoGrantRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.Grants = append(lockingRequests.Grants, req) + case goattypes.UpdateTokenWeightEventTopic: + req, err := goattypes.UnpackIntoUpdateTokenWeightRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.UpdateWeights = append(lockingRequests.UpdateWeights, req) + case goattypes.UpdateTokenThresholdEventTopic: + req, err := goattypes.UnpackIntoUpdateTokenThresholdRequest(log.Data) + if err != nil { + return nil, err + } + lockingRequests.UpdateThresholds = append(lockingRequests.UpdateThresholds, req) + } + case goattypes.RelayerContract: + if len(log.Topics) != 2 { + continue + } + switch log.Topics[0] { + case goattypes.AddVoterEventTopoic: + req, err := goattypes.UnpackIntoAddVoterRequest(log.Topics, log.Data) + if err != nil { + return nil, err + } + relayerRequests.Adds = append(relayerRequests.Adds, req) + case goattypes.RemoveVoterEventTopic: + req, err := goattypes.UnpackIntoRemoveVoterRequest(log.Topics, log.Data) + if err != nil { + return nil, err + } + relayerRequests.Removes = append(relayerRequests.Removes, req) + } + } + } + + requests := make([][]byte, 0, 1) + requests = append(requests, lockingRequests.Encode()...) + requests = append(requests, bridgeRequests.Encode()...) + requests = append(requests, relayerRequests.Encode()...) + return requests, nil +} + +// CalculateGoatGasFees gets all fees in the block +func CalculateGoatGasFees(header *types.Header, txs []*types.Transaction, receipts []*types.Receipt) *big.Int { + gasFees := new(big.Int) + if header.BaseFee != nil && header.GasUsed > 0 { + gasUsed := new(big.Int).SetUint64(header.GasUsed) + gasFees.Mul(header.BaseFee, gasUsed) + } + + // eip4844 is disabled + // if header.ExcessBlobGas != nil && header.BlobGasUsed != nil && *header.BlobGasUsed > 0 { + // blobBaseFee := eip4844.CalcBlobFee(*header.ExcessBlobGas) + // blobUsed := new(big.Int).SetUint64(*header.BlobGasUsed) + // gasFees.Add(gasFees, blobUsed.Mul(blobUsed, blobBaseFee)) + // } + + for i, tx := range txs { + gasUsed := receipts[i].GasUsed + if gasUsed == 0 { // It's the goat tx + continue + } + minerFee := tx.EffectiveGasTipValue(header.BaseFee) + gasFees.Add(gasFees, new(big.Int).Mul(new(big.Int).SetUint64(gasUsed), minerFee)) + } + return gasFees +} diff --git a/core/state_processor_goat_test.go b/core/state_processor_goat_test.go new file mode 100644 index 0000000000000..702d792f7f4a5 --- /dev/null +++ b/core/state_processor_goat_test.go @@ -0,0 +1,392 @@ +package core + +import ( + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/beacon" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/types/goattypes" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +func TestProcessGoatRequests(t *testing.T) { + type args struct { + height uint64 + reward *big.Int + allLogs []*types.Log + } + type Requests struct { + bridge goattypes.BridgeRequests + relayer goattypes.RelayerRequests + locking goattypes.LockingRequests + } + tests := []struct { + name string + args args + reqs Requests + wantErr bool + }{ + { + name: "gas", + args: args{ + height: 100, + reward: big.NewInt(1e9), + allLogs: []*types.Log{}, + }, + reqs: Requests{ + locking: goattypes.LockingRequests{Gas: []*goattypes.GasRequest{goattypes.NewGasRequest(100, big.NewInt(1e9))}}, + }, + }, + { + name: "all", + args: args{ + height: 100, + reward: big.NewInt(1e9), + allLogs: []*types.Log{ + { + Address: goattypes.BridgeContract, + Topics: []common.Hash{ + common.HexToHash("0xbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000064"), + common.HexToHash("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"), + }, + Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000223146777442437355716851385a736877316f723461535566646b3155446938337668000000000000000000000000000000000000000000000000000000000000"), + }, + { + Address: goattypes.BridgeContract, + Topics: []common.Hash{ + common.HexToHash("0x19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001"), + }, + Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000a"), + }, + { + Address: goattypes.BridgeContract, + Topics: []common.Hash{ + common.HexToHash("0x0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c"), + common.HexToHash("0x000000000000000000000000000000000000000000000000000000000000000a"), + }, + }, + + { + Address: goattypes.BridgeContract, + Topics: []common.Hash{ + common.HexToHash("0x30b92002139b64ec601b714d1ecccba1212034e735773b3de088e8876f4dfb65"), + }, + Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000006"), + }, + { + Address: goattypes.BridgeContract, + Topics: []common.Hash{ + common.HexToHash("0x7aa20a242ea0b0f7b0141c56aaad636eb2b2077c9c27d09a8282f6931f486a21"), + }, + Data: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000005af3107a4000"), + }, + { + Address: goattypes.BridgeContract, + Topics: []common.Hash{ + common.HexToHash("0x1007ff7aec53e9626ce51f25d4e093f290f60da8019c8cf489f0ae2f21ebf76a"), + }, + Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000005af3107a4000"), + }, + + { + Address: goattypes.RelayerContract, + Topics: []common.Hash{ + common.HexToHash("0x101c617f43dd1b8a54a9d747d9121bbc55e93b88bc50560d782a79c4e28fc838"), + common.HexToHash("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"), + }, + Data: hexutil.MustDecode("0x13e21ffd05c7c3e6e7695535f91de949a7a31c577930b537482e1f192b5af389"), + }, + { + Address: goattypes.RelayerContract, + Topics: []common.Hash{ + common.HexToHash("0x183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e8"), + common.HexToHash("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"), + }, + }, + + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0xf3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd"), + }, + Data: hexutil.MustDecode("0x00000000000000000000000094d76e24f818426ae84aa404140e8d5f60e10e7e0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc474602edafa25d1f5fcde1730328bf2c3559b47f689319ce478bd62f8ba582d35c6842e0533b4e5706d99e914b24da42dd35da09c0947223aa2ff88933c6bd946"), + }, + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0xec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f3"), + }, + Data: hexutil.MustDecode("0x00000000000000000000000094d76e24f818426ae84aa404140e8d5f60e10e7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a"), + }, + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0x40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db7"), + }, + Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094d76e24f818426ae84aa404140e8d5f60e10e7e0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a"), + }, + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0xa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b"), + }, + Data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000094d76e24f818426ae84aa404140e8d5f60e10e7e0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"), + }, + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0xb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217"), + }, + Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a"), + }, + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0x326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d"), + }, + Data: hexutil.MustDecode("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4000000000000000000000000000000000000000000000000000000000000000a"), + }, + { + Address: goattypes.LockingContract, + Topics: []common.Hash{ + common.HexToHash("0x41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0"), + }, + Data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000023"), + }, + }, + }, + reqs: Requests{ + locking: goattypes.LockingRequests{ + Gas: []*goattypes.GasRequest{ + goattypes.NewGasRequest(100, big.NewInt(1e9)), + }, + Creates: []*goattypes.CreateRequest{ + { + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Pubkey: [64]byte(hexutil.MustDecode("0x74602edafa25d1f5fcde1730328bf2c3559b47f689319ce478bd62f8ba582d35c6842e0533b4e5706d99e914b24da42dd35da09c0947223aa2ff88933c6bd946")), + }, + }, + Locks: []*goattypes.LockRequest{ + { + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Amount: big.NewInt(10), + }, + }, + Unlocks: []*goattypes.UnlockRequest{ + { + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Amount: big.NewInt(10), + }, + }, + Claims: []*goattypes.ClaimRequest{ + { + Id: 1, + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + }, + }, + UpdateWeights: []*goattypes.UpdateTokenWeightRequest{ + { + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Weight: 10, + }, + }, + UpdateThresholds: []*goattypes.UpdateTokenThresholdRequest{ + { + Token: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Threshold: big.NewInt(10), + }, + }, + Grants: []*goattypes.GrantRequest{ + {Amount: big.NewInt(0x23)}, + }, + }, + bridge: goattypes.BridgeRequests{ + Withdraws: []*goattypes.WithdrawalRequest{ + {Id: 100, Amount: 10, TxPrice: 1, Address: "1FwtBCsUqhQ8Zshw1or4aSUfdk1UDi83vh"}, + }, + ReplaceByFees: []*goattypes.ReplaceByFeeRequest{ + {Id: 1, TxPrice: 10}, + }, + Cancel1s: []*goattypes.Cancel1Request{ + {Id: 10}, + }, + DepositTax: []*goattypes.DepositTaxRequest{ + {Rate: 2, Max: 10000}, + }, + Confirmation: []*goattypes.ConfirmationNumberRequest{ + {Number: 6}, + }, + MinDeposit: []*goattypes.MinDepositRequest{ + {Satoshi: 10000}, + }, + }, + relayer: goattypes.RelayerRequests{ + Adds: []*goattypes.AddVoterRequest{ + { + Voter: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Pubkey: common.HexToHash("0x13e21ffd05c7c3e6e7695535f91de949a7a31c577930b537482e1f192b5af389"), + }, + }, + Removes: []*goattypes.RemoveVoterRequest{ + {Voter: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4")}, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ProcessGoatRequests(tt.args.height, tt.args.reward, tt.args.allLogs) + if (err != nil) != tt.wantErr { + t.Errorf("ProcessGoatRequests() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if tt.wantErr { + return + } + + reqs := [][]byte{} + reqs = append(reqs, tt.reqs.locking.Encode()...) + reqs = append(reqs, tt.reqs.bridge.Encode()...) + reqs = append(reqs, tt.reqs.relayer.Encode()...) + + if len(got) != len(reqs) { + t.Errorf("ProcessGoatRequests() = %v, want %v", len(got), len(reqs)) + return + } + + for idx, req := range reqs { + if !reflect.DeepEqual(req, got[idx]) { + t.Errorf("ProcessGoatRequests() not deep equal: %d", idx) + return + } + } + }) + } +} + +func TestProcessGoatGasFee(t *testing.T) { + var ( + engine = beacon.NewFaker() + + // A sender who makes transactions, has some funds + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key.PublicKey) + funds = new(big.Int).Mul(big.NewInt(1e6), big.NewInt(params.Ether)) + config = *params.AllGoatDebugChainConfig + gspec = &Genesis{ + Config: &config, + Alloc: types.GenesisAlloc{addr: {Balance: funds}}, + GasLimit: 3000_0000, + GasUsed: 0, + BaseFee: big.NewInt(1e9), + } + ) + + signer := types.LatestSigner(gspec.Config) + + to := common.HexToAddress("0x4a284d2835a3497e08b8b7fb30459a1c8229553d") + coinbase := common.HexToAddress("0x41f12999e79d04ecac9a133e18588384cfb0da69") + _, blocks, _ := GenerateChainWithGenesis(gspec, engine, 1, func(i int, b *BlockGen) { + b.SetCoinbase(coinbase) + var nonce uint64 + for i := 0; i < 10; i++ { + txdata := &types.LegacyTx{ + Nonce: nonce, + To: &to, + Gas: 21000, + GasPrice: big.NewInt(2e9), + Value: big.NewInt(0), + } + tx := types.NewTx(txdata) + tx, _ = types.SignTx(tx, signer, key) + b.AddTx(tx) + nonce++ + } + + for i := 0; i < 5; i++ { + txdata := &types.DynamicFeeTx{ + ChainID: config.ChainID, + Nonce: nonce, + GasTipCap: big.NewInt(1e9), + GasFeeCap: big.NewInt(5e9), + Gas: 21000, + To: &to, + Value: big.NewInt(0), + } + + tx := types.NewTx(txdata) + tx, _ = types.SignTx(tx, signer, key) + b.AddTx(tx) + nonce++ + } + }) + + chain, err := NewBlockChain(rawdb.NewMemoryDatabase(), nil, gspec, nil, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + defer chain.Stop() + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + + state, _ := chain.State() + + // base fee = 1e9 * 7 / 8 = 875000000 (see consensus/misc/eip1559/eip1559.go) + // totalFee = (tipFee(2e9 - baseFee) + baseFee) * 21000 * LegacyTxCount + (tipFee(1e9) + baseFee) * 21000 * DynamicFeeTxCount = 616875000000000 + // tax = totalFee * 2 % = 12337500000000 + // gas reward = totalFee - tax = 604537500000000 + + if !state.GetBalance(coinbase).IsZero() { + t.Errorf("balance of coinbase should be 0") + } + + gfBalance := state.GetBalance(goattypes.GoatFoundationContract) + if expected := big.NewInt(12337500000000); gfBalance.CmpBig(expected) != 0 { + t.Errorf("balance of goat foundation: expected %s got %s", expected, gfBalance) + } + rwBalace := state.GetBalance(goattypes.LockingContract) + if expected := big.NewInt(604537500000000); rwBalace.CmpBig(expected) != 0 { + t.Errorf("balance of locking contract: expected %s got %s", expected, rwBalace) + } + + block := chain.GetBlockByNumber(1) + + const expectGasUsed = 15 * 21000 + if gas := block.GasUsed(); gas != expectGasUsed { + t.Errorf("block gas used: expected %v got %v", expectGasUsed, gas) + } + + const expectBaseFee = 875000000 + if basefee := block.BaseFee(); basefee.Cmp(big.NewInt(expectBaseFee)) != 0 { + t.Errorf("block base fee: expected %v got %v", expectBaseFee, basefee) + } + + locking := goattypes.LockingRequests{Gas: []*goattypes.GasRequest{goattypes.NewGasRequest(block.NumberU64(), rwBalace.ToBig())}} + requests := locking.Encode() + requestsHash := types.CalcRequestsHash(requests) + gotRequestsHash := block.Header().RequestsHash + if gotRequestsHash == nil { + t.Errorf("request hash is nil") + return + } + + if requestsHash != *gotRequestsHash { + t.Errorf("RequestsHash expected %x got %x", requestsHash, *gotRequestsHash) + } +} diff --git a/core/state_transition.go b/core/state_transition.go index ea7e3df2ff46a..8f13416244ef1 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -24,6 +24,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/types/goattypes" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/params" @@ -148,6 +149,11 @@ type Message struct { // When SkipFromEOACheck is true, the message sender is not checked to be an EOA. SkipFromEOACheck bool + + // goat + IsGoatTx bool + Deposit *goattypes.Mint // deposit from L1 + Withdraw *goattypes.Mint // withdraw from consensus layer } // TransactionToMessage converts a transaction into a Message. @@ -166,6 +172,11 @@ func TransactionToMessage(tx *types.Transaction, s types.Signer, baseFee *big.In SkipFromEOACheck: false, BlobHashes: tx.BlobHashes(), BlobGasFeeCap: tx.BlobGasFeeCap(), + + // goat + IsGoatTx: tx.IsGoatTx(), + Deposit: tx.Deposit(), + Withdraw: tx.Withdraw(), } // If baseFee provided, set gasPrice to effectiveGasPrice. if baseFee != nil { @@ -241,6 +252,16 @@ func (st *stateTransition) to() common.Address { } func (st *stateTransition) buyGas() error { + if st.msg.IsGoatTx { + st.initialGas = params.GoatTxGasLimit + st.gasRemaining = params.GoatTxGasLimit + + if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil { + st.evm.Config.Tracer.OnGasChange(0, st.gasRemaining, tracing.GasChangeTxInitialBalance) + } + return nil + } + mgval := new(big.Int).SetUint64(st.msg.GasLimit) mgval.Mul(mgval, st.msg.GasPrice) balanceCheck := new(big.Int).Set(mgval) @@ -287,6 +308,14 @@ func (st *stateTransition) buyGas() error { func (st *stateTransition) preCheck() error { // Only check transactions that are not fake msg := st.msg + + if !msg.IsGoatTx { + switch msg.From { + case goattypes.LockingExecutor, goattypes.RelayerExecutor: + return fmt.Errorf("system executors can't send txs") + } + } + if !msg.SkipNonceChecks { // Make sure this transaction's nonce is correct. stNonce := st.state.GetNonce(msg.From) @@ -310,7 +339,7 @@ func (st *stateTransition) preCheck() error { } } // Make sure that transaction gasFeeCap is greater than the baseFee (post london) - if st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) { + if !msg.IsGoatTx && st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) { // Skip the checks if gas fields are zero and baseFee was explicitly disabled (eth_call) skipCheck := st.evm.Config.NoBaseFee && msg.GasFeeCap.BitLen() == 0 && msg.GasTipCap.BitLen() == 0 if !skipCheck { @@ -454,6 +483,10 @@ func (st *stateTransition) execute() (*ExecutionResult, error) { ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), msg.Data, st.gasRemaining, value) } + if msg.IsGoatTx { + return st.goat(msg, ret, vmerr) + } + var gasRefund uint64 if !rules.IsLondon { // Before EIP-3529: refunds were capped to gasUsed / 2 @@ -462,20 +495,21 @@ func (st *stateTransition) execute() (*ExecutionResult, error) { // After EIP-3529: refunds are capped to gasUsed / 5 gasRefund = st.refundGas(params.RefundQuotientEIP3529) } - effectiveTip := msg.GasPrice - if rules.IsLondon { - effectiveTip = new(big.Int).Sub(msg.GasFeeCap, st.evm.Context.BaseFee) - if effectiveTip.Cmp(msg.GasTipCap) > 0 { - effectiveTip = msg.GasTipCap - } - } - effectiveTipU256, _ := uint256.FromBig(effectiveTip) if st.evm.Config.NoBaseFee && msg.GasFeeCap.Sign() == 0 && msg.GasTipCap.Sign() == 0 { // Skip fee payment when NoBaseFee is set and the fee fields // are 0. This avoids a negative effectiveTip being applied to // the coinbase when simulating calls. - } else { + } else if st.evm.ChainConfig().Goat == nil { // don't add balance to coinbase for goat network + effectiveTip := msg.GasPrice + if rules.IsLondon { + effectiveTip = new(big.Int).Sub(msg.GasFeeCap, st.evm.Context.BaseFee) + if effectiveTip.Cmp(msg.GasTipCap) > 0 { + effectiveTip = msg.GasTipCap + } + } + effectiveTipU256, _ := uint256.FromBig(effectiveTip) + fee := new(uint256.Int).SetUint64(st.gasUsed()) fee.Mul(fee, effectiveTipU256) st.state.AddBalance(st.evm.Context.Coinbase, fee, tracing.BalanceIncreaseRewardTransactionFee) diff --git a/core/state_transition_goat.go b/core/state_transition_goat.go new file mode 100644 index 0000000000000..88b9b45d2705a --- /dev/null +++ b/core/state_transition_goat.go @@ -0,0 +1,75 @@ +package core + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types/goattypes" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/log" + "github.com/holiman/uint256" +) + +func (st *stateTransition) goat(msg *Message, ret []byte, vmerr error) (*ExecutionResult, error) { + if vmerr != nil { + if vmerr == vm.ErrExecutionReverted { + reason, errUnpack := abi.UnpackRevert(ret) + if errUnpack == nil { + return nil, fmt.Errorf("goat tx reverted (to %s nonce %d data %x err %s)", msg.To, msg.Nonce, msg.Data, reason) + } + } + return nil, fmt.Errorf("goat tx reverted (to %s nonce %d data %x err %s ret %x)", msg.To, msg.Nonce, msg.Data, vmerr, ret) + } + + // deposit from L1 + if v := msg.Deposit; v != nil { + amount, overflow := uint256.FromBig(v.Amount) + if overflow { + return nil, fmt.Errorf("goat tx error (deposit overflowed to mint: %s)", v.Amount) + } + + // add the deposit value to the target + log.Debug("NewDeposit", "address", v.Address, "amount", amount, "tax", v.Tax) + st.state.AddBalance(v.Address, amount, tracing.BalanceGoatDepoist) + if v.Tax.Sign() > 0 { + // add the tax to GF + tax, overflow := uint256.FromBig(v.Tax) + if overflow { + return nil, fmt.Errorf("goat tx error (tax overflowed to mint: %s)", v.Tax) + } + st.state.AddBalance(goattypes.GoatFoundationContract, tax, tracing.BalanceGoatDepoist) + } + } + + // withdraw from consensus layer + if v := msg.Withdraw; v != nil && v.Amount.Sign() > 0 { + amount, overflow := uint256.FromBig(v.Amount) + if overflow { + return nil, fmt.Errorf("goat tx error (amount overflowed to distribute: %s)", v.Amount) + } + + // the amount in locking contract is from two: + // 1. validator locked the amount in the locking contract + // 2. gas fee addding in the runtime + + // add the value to the target + log.Debug("NewWithdraw", "address", v.Address, "amount", amount) + if !CanTransfer(st.state, goattypes.LockingContract, amount) { + return nil, fmt.Errorf("goat tx error (amount too large to distribute: %s)", v.Amount) + } + Transfer(st.state, goattypes.LockingContract, v.Address, amount) + } + + // refund all of gas used + if st.evm.Config.Tracer != nil && st.evm.Config.Tracer.OnGasChange != nil { + st.evm.Config.Tracer.OnGasChange(st.gasRemaining, st.initialGas, tracing.GasChangeTxRefunds) + } + + return &ExecutionResult{ + UsedGas: 0, + RefundedGas: st.gasUsed(), + Err: vmerr, + ReturnData: ret, + }, nil +} diff --git a/core/state_transition_goat_test.go b/core/state_transition_goat_test.go new file mode 100644 index 0000000000000..6d0f0c145b26f --- /dev/null +++ b/core/state_transition_goat_test.go @@ -0,0 +1,183 @@ +package core + +import ( + "encoding/json" + "math/big" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/beacon" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/types/goattypes" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" +) + +func TestGoatStateTransition(t *testing.T) { + allocJson, err := os.ReadFile("./testdata/goat-genesis.json") + if err != nil { + t.Fatal(err) + } + + var alloc types.GenesisAlloc + if err := json.Unmarshal(allocJson, &alloc); err != nil { + t.Fatal(err) + } + + var ( + engine = beacon.NewFaker() + config = *params.AllGoatDebugChainConfig + gspec = &Genesis{ + Config: &config, + Alloc: alloc, + GasLimit: params.GoatTxGasLimit, + } + depositValue = big.NewInt(1e18) + depositTaxBp = big.NewInt(20) + mxaBp = big.NewInt(1e4) + maxDepositTax = big.NewInt(0x38d7ea4c68000) + claimedValue = big.NewInt(1e9) + unlockValue = big.NewInt(1e9) + ) + + coinbase := common.HexToAddress("0x41f12999e79d04ecac9a133e18588384cfb0da69") + depositAddress := common.HexToAddress("0x0d1b10d13d3c393206ff5c5136c7f86e3ad390ad") + claimAddress := common.HexToAddress("0x1254d638c0f781f3a3b2298903ea00b3c36fc769") + unlockAddress := common.HexToAddress("0x1abd100f66ab25647a1c4baed7990df7b97d7dae") + + lockingBalance := new(big.Int).Set(alloc[goattypes.LockingContract].Balance) + + tax := new(big.Int).Mul(depositValue, depositTaxBp) + tax.Div(tax, mxaBp) + if tax.Cmp(maxDepositTax) > 0 { + tax = tax.Set(maxDepositTax) + } + + _, blocks, _ := GenerateChainWithGenesis(gspec, engine, 1, func(i int, b *BlockGen) { + b.SetCoinbase(coinbase) + b.AddTx(types.NewTx(types.NewGoatTx( + goattypes.BirdgeModule, + goattypes.BridgeDepoitAction, + 0, + &goattypes.DepositTx{ + Txid: common.HexToHash("0x344fb824c793fc370a38577eea12aba8842cb0516cf52099911a36c0c36f11ee"), + TxOut: 0, + Target: depositAddress, + Amount: new(big.Int).Sub(depositValue, tax), + Tax: tax, + }, + ))) + + var nonce uint64 + b.AddTx(types.NewTx( + types.NewGoatTx( + goattypes.LockingModule, + goattypes.LockingDistributeRewardAction, + nonce, + &goattypes.DistributeRewardTx{ + Id: 0, + Recipient: claimAddress, + Goat: claimedValue, + GasReward: claimedValue, + }, + ), + )) + nonce++ + b.AddTx(types.NewTx( + types.NewGoatTx( + goattypes.LockingModule, + goattypes.LockingCompleteUnlockAction, + nonce, + &goattypes.CompleteUnlockTx{ + Id: 1, + Recipient: unlockAddress, + Token: common.Address{}, + Amount: unlockValue, + }, + ), + )) + nonce++ + b.AddTx(types.NewTx( + types.NewGoatTx( + goattypes.LockingModule, + goattypes.LockingCompleteUnlockAction, + nonce, + &goattypes.CompleteUnlockTx{ + Id: 2, + Recipient: unlockAddress, + Token: goattypes.GoatTokenContract, + Amount: unlockValue, + }, + ), + )) + nonce++ + b.AddTx(types.NewTx( + types.NewGoatTx( + goattypes.LockingModule, + goattypes.LockingDistributeRewardAction, + nonce, + &goattypes.DistributeRewardTx{ + Id: 3, + Recipient: claimAddress, + Goat: claimedValue, + GasReward: new(big.Int), + }, + ), + )) + }) + + chain, err := NewBlockChain(rawdb.NewMemoryDatabase(), nil, gspec, nil, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + defer chain.Stop() + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + + state, _ := chain.State() + if !state.GetBalance(coinbase).IsZero() { + t.Errorf("balance of coinbase should be 0") + } + + if value, got := new(big.Int).Sub(depositValue, tax), state.GetBalance(depositAddress); got.CmpBig(value) != 0 { + t.Errorf("balance of deposited, expected to be %s got %s", value, got) + } + if got := state.GetBalance(goattypes.GoatFoundationContract); got.CmpBig(tax) != 0 { + t.Errorf("balance of goat foundation, expected to be %s got %s", tax, got) + } + + lockingBalance.Sub(lockingBalance, claimedValue) + if got := state.GetBalance(claimAddress); got.CmpBig(claimedValue) != 0 { + t.Errorf("balance of claimed, expected to be %s got %s", claimedValue, got) + } + + lockingBalance.Sub(lockingBalance, unlockValue) + if got := state.GetBalance(unlockAddress); got.CmpBig(unlockValue) != 0 { + t.Errorf("balance of unlocked address, expected to be %s got %s", unlockValue, got) + } + + if got := state.GetBalance(goattypes.LockingContract); got.CmpBig(lockingBalance) != 0 { + t.Errorf("balance of locking contract, expected to be %s got %s", lockingBalance, got) + } + + block := chain.GetBlockByNumber(1) + gotRequestshash := block.Header().RequestsHash + if gotRequestshash == nil { + t.Errorf("request hash is nil") + return + } + + if block.GasUsed() != 0 { + t.Errorf("gas used is not zero") + return + } + + requests := &goattypes.LockingRequests{Gas: []*goattypes.GasRequest{goattypes.NewGasRequest(1, new(big.Int))}} + requestsHash := types.CalcRequestsHash(requests.Encode()) + if requestsHash != *gotRequestshash { + t.Errorf("RequestsHash expected %x got %x", requestsHash, *gotRequestshash) + } +} diff --git a/core/testdata/goat-genesis.json b/core/testdata/goat-genesis.json new file mode 100644 index 0000000000000..a5946d56b12f0 --- /dev/null +++ b/core/testdata/goat-genesis.json @@ -0,0 +1,110 @@ +{ + "bC10000000000000000000000000000000000000": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6080604052600436106100e7575f3560e01c806370a0823111610087578063a9059cbb11610057578063a9059cbb1461026c578063d0e30db01461028b578063d505accf14610293578063dd62ed3e146102b2575f5ffd5b806370a08231146101de5780637ecebe001461021257806384b0196e1461023157806395d89b4114610258575f5ffd5b806323b872dd116100c257806323b872dd146101715780632e1a7d4d14610190578063313ce567146101af5780633644e515146101ca575f5ffd5b806306fdde03146100fa578063095ea7b31461012457806318160ddd14610153575f5ffd5b366100f6576100f46102f6565b005b5f5ffd5b348015610105575f5ffd5b5061010e610337565b60405161011b9190610e91565b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610ec5565b6103c7565b604051901515815260200161011b565b34801561015e575f5ffd5b506002545b60405190815260200161011b565b34801561017c575f5ffd5b5061014361018b366004610eed565b6103e0565b34801561019b575f5ffd5b506100f46101aa366004610f27565b610403565b3480156101ba575f5ffd5b506040516012815260200161011b565b3480156101d5575f5ffd5b5061016361044f565b3480156101e9575f5ffd5b506101636101f8366004610f3e565b6001600160a01b03165f9081526020819052604090205490565b34801561021d575f5ffd5b5061016361022c366004610f3e565b61045d565b34801561023c575f5ffd5b5061024561047a565b60405161011b9796959493929190610f57565b348015610263575f5ffd5b5061010e6104bc565b348015610277575f5ffd5b50610143610286366004610ec5565b6104cb565b6100f46102f6565b34801561029e575f5ffd5b506100f46102ad366004610fed565b6104d8565b3480156102bd575f5ffd5b506101636102cc36600461105a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6103003334610613565b60405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b6060600380546103469061108b565b80601f01602080910402602001604051908101604052809291908181526020018280546103729061108b565b80156103bd5780601f10610394576101008083540402835291602001916103bd565b820191905f5260205f20905b8154815290600101906020018083116103a057829003601f168201915b5050505050905090565b5f336103d481858561064b565b60019150505b92915050565b5f336103ed85828561065d565b6103f88585856106d8565b506001949350505050565b61040d3382610735565b6104173382610769565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b5f610458610803565b905090565b6001600160a01b0381165f908152600760205260408120546103da565b5f6060805f5f5f606061048b61092c565b610493610959565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6060600480546103469061108b565b5f336103d48185856106d8565b834211156105015760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861054c8c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6105a682610986565b90505f6105b5828787876109b2565b9050896001600160a01b0316816001600160a01b0316146105fc576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016104f8565b6106078a8a8a61064b565b50505050505050505050565b6001600160a01b03821661063c5760405163ec442f0560e01b81525f60048201526024016104f8565b6106475f83836109de565b5050565b6106588383836001610b04565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146106d257818110156106c457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016104f8565b6106d284848484035f610b04565b50505050565b6001600160a01b03831661070157604051634b637e8f60e11b81525f60048201526024016104f8565b6001600160a01b03821661072a5760405163ec442f0560e01b81525f60048201526024016104f8565b6106588383836109de565b6001600160a01b03821661075e57604051634b637e8f60e11b81525f60048201526024016104f8565b610647825f836109de565b804710156107935760405163cf47918160e01b8152476004820152602481018290526044016104f8565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146107dc576040519150601f19603f3d011682016040523d82523d5f602084013e6107e1565b606091505b50509050806106585760405163d6bda27560e01b815260040160405180910390fd5b5f306001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614801561085b57507f000000000000000000000000000000000000000000000000000000000000beaf46145b1561088557507f33686409093049fa3a11b8fbffd6b8f5af2bc7c5e15d5941e0122f995f52575d90565b610458604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fd3974318b35c22bdad78531c2e406ce004418eec475a02ecc063f209cbf20828918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60606104587f57474254430000000000000000000000000000000000000000000000000000056005610bd6565b60606104587f31000000000000000000000000000000000000000000000000000000000000016006610bd6565b5f6103da610992610803565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f6109c288888888610c7f565b9250925092506109d28282610d47565b50909695505050505050565b6001600160a01b038316610a08578060025f8282546109fd91906110c3565b90915550610a789050565b6001600160a01b0383165f9081526020819052604090205481811015610a5a5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016104f8565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610a9457600280548290039055610ab2565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610af791815260200190565b60405180910390a3505050565b6001600160a01b038416610b2d5760405163e602df0560e01b81525f60048201526024016104f8565b6001600160a01b038316610b5657604051634a1406b160e11b81525f60048201526024016104f8565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156106d257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bc891815260200190565b60405180910390a350505050565b606060ff8314610bf057610be983610dff565b90506103da565b818054610bfc9061108b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c289061108b565b8015610c735780601f10610c4a57610100808354040283529160200191610c73565b820191905f5260205f20905b815481529060010190602001808311610c5657829003601f168201915b505050505090506103da565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610cb857505f91506003905082610d3d565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610d09573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610d3457505f925060019150829050610d3d565b92505f91508190505b9450945094915050565b5f826003811115610d5a57610d5a6110e2565b03610d63575050565b6001826003811115610d7757610d776110e2565b03610d955760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610da957610da96110e2565b03610dca5760405163fce698f760e01b8152600481018290526024016104f8565b6003826003811115610dde57610dde6110e2565b03610647576040516335e2f38360e21b8152600481018290526024016104f8565b60605f610e0b83610e3c565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f8111156103da57604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610ea36020830184610e63565b9392505050565b80356001600160a01b0381168114610ec0575f5ffd5b919050565b5f5f60408385031215610ed6575f5ffd5b610edf83610eaa565b946020939093013593505050565b5f5f5f60608486031215610eff575f5ffd5b610f0884610eaa565b9250610f1660208501610eaa565b929592945050506040919091013590565b5f60208284031215610f37575f5ffd5b5035919050565b5f60208284031215610f4e575f5ffd5b610ea382610eaa565b60ff60f81b8816815260e060208201525f610f7560e0830189610e63565b8281036040840152610f878189610e63565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015610fdc578351835260209384019390920191600101610fbe565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215611003575f5ffd5b61100c88610eaa565b965061101a60208901610eaa565b95506040880135945060608801359350608088013560ff8116811461103d575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f6040838503121561106b575f5ffd5b61107483610eaa565b915061108260208401610eaa565b90509250929050565b600181811c9082168061109f57607f821691505b6020821081036110bd57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156103da57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x5772617070656420476f617420426974636f696e000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x574742544300000000000000000000000000000000000000000000000000000a" + } + }, + "bC10000000000000000000000000000000000001": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b506004361061019a575f3560e01c806370a08231116100e857806395d89b4111610093578063c3cda5201161006e578063c3cda52014610392578063d505accf146103a5578063dd62ed3e146103b8578063f1127ed8146103f0575f5ffd5b806395d89b41146103645780639ab24eb01461036c578063a9059cbb1461037f575f5ffd5b806384b0196e116100c357806384b0196e146103175780638e539e8c1461033257806391ddadf414610345575f5ffd5b806370a08231146102c957806379cc6790146102f15780637ecebe0014610304575f5ffd5b80633a46b1a811610148578063587cde1e11610123578063587cde1e1461024b5780635c19a95c1461028e5780636fcfff45146102a1575f5ffd5b80633a46b1a81461021b57806342966c681461022e5780634bf5d7e914610243575f5ffd5b806323b872dd1161017857806323b872dd146101f1578063313ce567146102045780633644e51514610213575f5ffd5b806306fdde031461019e578063095ea7b3146101bc57806318160ddd146101df575b5f5ffd5b6101a661042f565b6040516101b39190611a59565b60405180910390f35b6101cf6101ca366004611a86565b6104bf565b60405190151581526020016101b3565b6002545b6040519081526020016101b3565b6101cf6101ff366004611aae565b6104d8565b604051601281526020016101b3565b6101e36104fb565b6101e3610229366004611a86565b610509565b61024161023c366004611ae8565b61058d565b005b6101a661059a565b610276610259366004611aff565b6001600160a01b039081165f908152600860205260409020541690565b6040516001600160a01b0390911681526020016101b3565b61024161029c366004611aff565b610612565b6102b46102af366004611aff565b610621565b60405163ffffffff90911681526020016101b3565b6101e36102d7366004611aff565b6001600160a01b03165f9081526020819052604090205490565b6102416102ff366004611a86565b61062b565b6101e3610312366004611aff565b610640565b61031f61064a565b6040516101b39796959493929190611b18565b6101e3610340366004611ae8565b61068c565b61034d6106f5565b60405165ffffffffffff90911681526020016101b3565b6101a66106fe565b6101e361037a366004611aff565b61070d565b6101cf61038d366004611a86565b61073c565b6102416103a0366004611bbe565b610749565b6102416103b3366004611c12565b610805565b6101e36103c6366004611c78565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104036103fe366004611ca9565b61093b565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101b3565b60606003805461043e90611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611ce6565b80156104b55780601f1061048c576101008083540402835291602001916104b5565b820191905f5260205f20905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b5f336104cc818585610975565b60019150505b92915050565b5f336104e5858285610987565b6104f0858585610a02565b506001949350505050565b5f610504610a5f565b905090565b5f5f6105136106f5565b90508065ffffffffffff16831061055357604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044015b60405180910390fd5b61057c61055f84610b88565b6001600160a01b0386165f90815260096020526040902090610bbe565b6001600160d01b0316949350505050565b6105973382610c71565b50565b60606105a4610ca5565b65ffffffffffff166105b46106f5565b65ffffffffffff16146105da576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b3361061d8183610caf565b5050565b5f6104d282610d38565b610636823383610987565b61061d8282610c71565b5f6104d282610d59565b5f6060805f5f5f606061065b610d76565b610663610da3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f6106966106f5565b90508065ffffffffffff1683106106d157604051637669fc0f60e11b81526004810184905265ffffffffffff8216602482015260440161054a565b6106e56106dd84610b88565b600a90610bbe565b6001600160d01b03169392505050565b5f610504610ca5565b60606004805461043e90611ce6565b6001600160a01b0381165f90815260096020526040812061072d90610dd0565b6001600160d01b031692915050565b5f336104cc818585610a02565b8342111561076d57604051632341d78760e11b81526004810185905260240161054a565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906107e6906107de9060a00160405160208183030381529060405280519060200120610e0a565b858585610e36565b90506107f28187610e62565b6107fc8188610caf565b50505050505050565b834211156108295760405163313c898160e11b81526004810185905260240161054a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108748c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108ce82610e0a565b90505f6108dd82878787610e36565b9050896001600160a01b0316816001600160a01b031614610924576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161054a565b61092f8a8a8a610975565b50505050505050505050565b604080518082019091525f80825260208201526109588383610eb4565b9392505050565b5f6109588284611d32565b5f6109588284611d51565b6109828383836001610ee8565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146109fc57818110156109ee57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161054a565b6109fc84848484035f610ee8565b50505050565b6001600160a01b038316610a2b57604051634b637e8f60e11b81525f600482015260240161054a565b6001600160a01b038216610a545760405163ec442f0560e01b81525f600482015260240161054a565b610982838383610fba565b5f306001600160a01b037f0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa316148015610ab757507f000000000000000000000000000000000000000000000000000000000000beaf46145b15610ae157507f218557a47638620aec6dec1f88b9f8271386d1e17b043e0f943e8ec01c2c352890565b610504604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f37c469dadd9df9fb454182ffced72eec76a99c56ccde61f27666b040e87df709918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115610bba576040516306dfcc6560e41b8152603060048201526024810183905260440161054a565b5090565b81545f9081816005811115610c1a575f610bd784610fc5565b610be19085611d70565b5f8881526020902090915081015465ffffffffffff9081169087161015610c0a57809150610c18565b610c15816001611d83565b92505b505b5f610c278787858561112a565b90508015610c6457610c4b87610c3e600184611d70565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610c66565b5f5b979650505050505050565b6001600160a01b038216610c9a57604051634b637e8f60e11b81525f600482015260240161054a565b61061d825f83610fba565b5f61050443610b88565b6001600160a01b038281165f8181526008602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46109828183610d3386611189565b6111a6565b6001600160a01b0381165f908152600960205260408120546104d29061130f565b6001600160a01b0381165f908152600760205260408120546104d2565b60606105047f474f415400000000000000000000000000000000000000000000000000000004600561133f565b60606105047f3100000000000000000000000000000000000000000000000000000000000001600661133f565b80545f908015610e0257610de983610c3e600184611d70565b54660100000000000090046001600160d01b0316610958565b5f9392505050565b5f6104d2610e16610a5f565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610e46888888886113e8565b925092509250610e5682826114b0565b50909695505050505050565b6001600160a01b0382165f908152600760205260409020805460018101909155818114610982576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161054a565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206109589083611568565b6001600160a01b038416610f115760405163e602df0560e01b81525f600482015260240161054a565b6001600160a01b038316610f3a57604051634a1406b160e11b81525f600482015260240161054a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156109fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fac91815260200190565b60405180910390a350505050565b6109828383836115d8565b5f60018211610fd2575090565b8160017001000000000000000000000000000000008210610ff85760809190911c9060401b5b6801000000000000000082106110135760409190911c9060201b5b640100000000821061102a5760209190911c9060101b5b62010000821061103f5760109190911c9060081b5b61010082106110535760089190911c9060041b5b601082106110665760049190911c9060021b5b600482106110725760011b5b600302600190811c9081858161108a5761108a611d96565b048201901c905060018185816110a2576110a2611d96565b048201901c905060018185816110ba576110ba611d96565b048201901c905060018185816110d2576110d2611d96565b048201901c905060018185816110ea576110ea611d96565b048201901c9050600181858161110257611102611d96565b048201901c905061112181858161111b5761111b611d96565b04821190565b90039392505050565b5f5b81831015611181575f61113f848461163e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561116d5780925061117b565b611178816001611d83565b93505b5061112c565b509392505050565b6001600160a01b0381165f908152602081905260408120546104d2565b816001600160a01b0316836001600160a01b0316141580156111c757505f81115b15610982576001600160a01b0383161561126e576001600160a01b0383165f90815260096020526040812081906112099061096a61120486611658565b61168b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611263929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610982576001600160a01b0382165f90815260096020526040812081906112a69061095f61120486611658565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611300929190918252602082015260400190565b60405180910390a25050505050565b5f63ffffffff821115610bba576040516306dfcc6560e41b8152602060048201526024810183905260440161054a565b606060ff831461135957611352836116c3565b90506104d2565b81805461136590611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461139190611ce6565b80156113dc5780601f106113b3576101008083540402835291602001916113dc565b820191905f5260205f20905b8154815290600101906020018083116113bf57829003601f168201915b505050505090506104d2565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561142157505f915060039050826114a6565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611472573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661149d57505f9250600191508290506114a6565b92505f91508190505b9450945094915050565b5f8260038111156114c3576114c3611daa565b036114cc575050565b60018260038111156114e0576114e0611daa565b036114fe5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561151257611512611daa565b036115335760405163fce698f760e01b81526004810182905260240161054a565b600382600381111561154757611547611daa565b0361061d576040516335e2f38360e21b81526004810182905260240161054a565b604080518082019091525f8082526020820152825f018263ffffffff168154811061159557611595611dbe565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6115e3838383611700565b6001600160a01b038316611633575f6115fb60025490565b90506001600160d01b038082111561163057604051630e58ae9360e11b8152600481018390526024810182905260440161054a565b50505b610982838383611826565b5f61164c6002848418611dd2565b61095890848416611d83565b5f6001600160d01b03821115610bba576040516306dfcc6560e41b815260d060048201526024810183905260440161054a565b5f5f6116b66116986106f5565b6116ae6116a488610dd0565b868863ffffffff16565b87919061189b565b915091505b935093915050565b60605f6116cf836118a8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03831661172a578060025f82825461171f9190611d83565b9091555061179a9050565b6001600160a01b0383165f908152602081905260409020548181101561177c5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161054a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b6576002805482900390556117d4565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181991815260200190565b60405180910390a3505050565b6001600160a01b03831661184857611845600a61095f61120484611658565b50505b6001600160a01b03821661186a57611867600a61096a61120484611658565b50505b6001600160a01b038381165f90815260086020526040808220548584168352912054610982929182169116836111a6565b5f806116b68585856118cf565b5f60ff8216601f8111156104d257604051632cd44ac360e21b815260040160405180910390fd5b82545f90819080156119ce575f6118eb87610c3e600185611d70565b805490915065ffffffffffff80821691660100000000000090046001600160d01b031690881682111561193157604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361196d57825465ffffffffffff1666010000000000006001600160d01b038916021783556119c0565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506116bb92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816116bb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109586020830184611a2b565b80356001600160a01b0381168114611a81575f5ffd5b919050565b5f5f60408385031215611a97575f5ffd5b611aa083611a6b565b946020939093013593505050565b5f5f5f60608486031215611ac0575f5ffd5b611ac984611a6b565b9250611ad760208501611a6b565b929592945050506040919091013590565b5f60208284031215611af8575f5ffd5b5035919050565b5f60208284031215611b0f575f5ffd5b61095882611a6b565b60ff60f81b8816815260e060208201525f611b3660e0830189611a2b565b8281036040840152611b488189611a2b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611b9d578351835260209384019390920191600101611b7f565b50909b9a5050505050505050505050565b803560ff81168114611a81575f5ffd5b5f5f5f5f5f5f60c08789031215611bd3575f5ffd5b611bdc87611a6b565b95506020870135945060408701359350611bf860608801611bae565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215611c28575f5ffd5b611c3188611a6b565b9650611c3f60208901611a6b565b95506040880135945060608801359350611c5b60808901611bae565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611c89575f5ffd5b611c9283611a6b565b9150611ca060208401611a6b565b90509250929050565b5f5f60408385031215611cba575f5ffd5b611cc383611a6b565b9150602083013563ffffffff81168114611cdb575f5ffd5b809150509250929050565b600181811c90821680611cfa57607f821691505b602082108103611d1857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160d01b0381811683821601908111156104d2576104d2611d1e565b6001600160d01b0382811682821603908111156104d2576104d2611d1e565b818103818111156104d2576104d2611d1e565b808201808211156104d2576104d2611d1e565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82611dec57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x42df54d978308232df5f7d63c0445e00c9e9f8c4eb4d4c22b0f8badf086d40da": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x540b5a72faa2463ad7b6e96257f3df9adbe15e6f4ef1a160019203de6a3b6c17": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x55b0fb7ee6854a4c90517d06cee035cb67a225460ad0f72a5ba96fbf9c7f69fa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x8cfe215f5f534280f4e9685cff600d40c1ede1d1a99c7bbc5273fd192ed3754e": "0x00000000000000000000000000000000000000000295be96e640669720000000", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000033b2e3c9fd0803ce8000000000000000001", + "0xefb49f92e468cf855f57fd634a2f54d847833aa4a0125060c8f7020cb2790199": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "Bc10000000000000000000000000000000000002": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405260043610610071575f3560e01c80639db5dbe41161004c5780639db5dbe4146101245780639e976db114610143578063a9059cbb14610163578063f2fde38b14610182575f5ffd5b806301ffc9a7146100b4578063715018a6146100e85780638da5cb5b146100fe575f5ffd5b366100b057604080513381523460208201527f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef13910160405180910390a1005b5f5ffd5b3480156100bf575f5ffd5b506100d36100ce3660046106a3565b6101a1565b60405190151581526020015b60405180910390f35b3480156100f3575f5ffd5b506100fc6101d7565b005b348015610109575f5ffd5b505f546040516001600160a01b0390911681526020016100df565b34801561012f575f5ffd5b506100fc61013e3660046106de565b6101ea565b61015661015136600461071c565b61020b565b6040516100df91906107a3565b34801561016e575f5ffd5b506100fc61017d3660046107d8565b6102d8565b34801561018d575f5ffd5b506100fc61019c366004610802565b610339565b5f6001600160e01b031982166301ffc9a760e01b14806101d157506001600160e01b03198216635513957760e11b145b92915050565b6101df610376565b6101e85f6103a2565b565b6101f2610376565b6102066001600160a01b0384168383610409565b505050565b6060610215610376565b5f546001600160a01b03166001600160a01b0316856001600160a01b0316036102855760405162461bcd60e51b815260206004820152600660248201527f216f776e6572000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6102cf84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b03881691905084610470565b95945050505050565b6102e0610376565b6102f36001600160a01b03831682610512565b604080516001600160a01b0384168152602081018390527f69ca02dd4edd7bf0a4abb9ed3b7af3f14778db5d61921c7dc7cd545266326de2910160405180910390a15050565b610341610376565b6001600160a01b03811661036a57604051631e4fbdf760e01b81525f600482015260240161027c565b610373816103a2565b50565b5f546001600160a01b031633146101e85760405163118cdaa760e01b815233600482015260240161027c565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790526102069084906105ac565b60608147101561049c5760405163cf47918160e01b81524760048201526024810183905260440161027c565b5f5f856001600160a01b031684866040516104b7919061081d565b5f6040518083038185875af1925050503d805f81146104f1576040519150601f19603f3d011682016040523d82523d5f602084013e6104f6565b606091505b509150915061050686838361061e565b925050505b9392505050565b8047101561053c5760405163cf47918160e01b81524760048201526024810182905260440161027c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610585576040519150601f19603f3d011682016040523d82523d5f602084013e61058a565b606091505b50509050806102065760405163d6bda27560e01b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806105cb576040513d5f823e3d81fd5b50505f513d915081156105e25780600114156105ef565b6001600160a01b0384163b155b1561061857604051635274afe760e01b81526001600160a01b038516600482015260240161027c565b50505050565b6060826106335761062e8261067a565b61050b565b815115801561064a57506001600160a01b0384163b155b1561067357604051639996b31560e01b81526001600160a01b038516600482015260240161027c565b508061050b565b80511561068a5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f602082840312156106b3575f5ffd5b81356001600160e01b03198116811461050b575f5ffd5b6001600160a01b0381168114610373575f5ffd5b5f5f5f606084860312156106f0575f5ffd5b83356106fb816106ca565b9250602084013561070b816106ca565b929592945050506040919091013590565b5f5f5f5f6060858703121561072f575f5ffd5b843561073a816106ca565b9350602085013567ffffffffffffffff811115610755575f5ffd5b8501601f81018713610765575f5ffd5b803567ffffffffffffffff81111561077b575f5ffd5b87602082840101111561078c575f5ffd5b949760209190910196509394604001359392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156107e9575f5ffd5b82356107f4816106ca565b946020939093013593505050565b5f60208284031215610812575f5ffd5b813561050b816106ca565b5f82518060208501845e5f92019182525091905056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68" + } + }, + "BC10000000000000000000000000000000000003": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x60806040526004361061018e575f3560e01c80638da5cb5b116100dc578063b3dd64dd11610087578063b9cf8c8f11610062578063b9cf8c8f14610484578063c19dd32014610528578063c8c3c6b614610547578063f2fde38b14610566575f5ffd5b8063b3dd64dd14610427578063b3f33eda14610446578063b670ab5e14610465575f5ffd5b8063a2215ab4116100b7578063a2215ab4146103e7578063a5517aff146103fc578063a81de86914610414575f5ffd5b80638da5cb5b14610383578063904183cb146103a9578063a0ea8451146103c8575f5ffd5b80634e0cd7991161013c578063715018a611610117578063715018a61461033157806384a64c12146103455780638aa4af8914610364575f5ffd5b80634e0cd7991461027a5780635c6650ac1461028e5780635cc0707614610300575f5ffd5b8063278ecde11161016c578063278ecde1146102075780632eff14ec146102285780633396c80914610247575f5ffd5b806301ffc9a7146101925780631af87ddf146101c65780631ccc92c7146101e8575b5f5ffd5b34801561019d575f5ffd5b506101b16101ac366004611a62565b610585565b60405190151581526020015b60405180910390f35b3480156101d1575f5ffd5b506101da6105d6565b6040519081526020016101bd565b3480156101f3575f5ffd5b506101b1610202366004611aa8565b6105ea565b348015610212575f5ffd5b50610226610221366004611ad2565b610644565b005b348015610233575f5ffd5b50610226610242366004611afa565b610750565b348015610252575f5ffd5b506101da7f000000000000000000000000000000000000000000000000000000000000002081565b348015610285575f5ffd5b506101da610820565b348015610299575f5ffd5b506005546102d29067ffffffffffffffff8082169161ffff68010000000000000000820416916a01000000000000000000009091041683565b6040805167ffffffffffffffff948516815261ffff90931660208401529216918101919091526060016101bd565b34801561030b575f5ffd5b5061031f61031a366004611ad2565b610831565b6040516101bd96959493929190611b27565b34801561033c575f5ffd5b50610226610889565b348015610350575f5ffd5b5061022661035f366004611ad2565b61089c565b34801561036f575f5ffd5b5061022661037e366004611b97565b6109bd565b34801561038e575f5ffd5b505f546040516001600160a01b0390911681526020016101bd565b3480156103b4575f5ffd5b506102266103c3366004611bd5565b610b34565b3480156103d3575f5ffd5b506102266103e2366004611c1f565b610c8e565b3480156103f2575f5ffd5b506101da61012c81565b348015610407575f5ffd5b506101da6402540be40081565b610226610422366004611c38565b610d5f565b348015610432575f5ffd5b50610226610441366004611cb4565b611109565b348015610451575f5ffd5b50610226610460366004611b97565b611316565b348015610470575f5ffd5b5061022661047f366004611cd5565b6114a5565b34801561048f575f5ffd5b506004546104e69060e081901b9067ffffffffffffffff640100000000820481169161ffff6c0100000000000000000000000082048116926e01000000000000000000000000000083041691600160b01b90041685565b604080516001600160e01b0319909616865267ffffffffffffffff948516602087015261ffff938416908601529216606084015216608082015260a0016101bd565b348015610533575f5ffd5b50610226610542366004611ad2565b61161c565b348015610552575f5ffd5b50610226610561366004611c1f565b611714565b348015610571575f5ffd5b50610226610580366004611d0f565b6117eb565b5f6001600160e01b031982166301ffc9a760e01b14806105b557506001600160e01b03198216634388643560e01b145b806105d057506001600160e01b03198216630ff038eb60e31b145b92915050565b6105e76402540be40061012c611d3c565b81565b5f5f838360405160200161061592919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f1901815291815281516020928301205f908152600690925290205460ff16949350505050565b5f6007828154811061065857610658611d53565b5f9182526020909120600490910201905060038154600160b01b900460ff16600581111561068857610688611b13565b146106a657604051631dd2188d60e31b815260040160405180910390fd5b805476040000000000000000000000000000000000000000000060ff60b01b1982161782556001600160a01b03163381146106f457604051634ca8886760e01b815260040160405180910390fd5b426003830155600282015460018301546107219161071191611d67565b6001600160a01b03831690611828565b60405183907f2e1897b0591d764356194f7a795238a87c1987c7a877568e50d829d547c92b97905f90a2505050565b6107586118c7565b5f8161ffff16116107b05760405162461bcd60e51b815260206004820152600e60248201527f6e756d62657220746f6f206c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b600480547fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b61ffff8416908102919091179091556040519081527f30b92002139b64ec601b714d1ecccba1212034e735773b3de088e8876f4dfb659060200160405180910390a150565b6105e76402540be4006103e8611d3c565b60078181548110610840575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b0383169450600160a01b830461ffff1693600160b01b90930460ff16929086565b6108916118c7565b61089a5f6118f3565b565b6108a733600161195a565b5f600782815481106108bb576108bb611d53565b5f9182526020909120600490910201905060018154600160b01b900460ff1660058111156108eb576108eb611b13565b1461090957604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b0316331461093357604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426109469190611d7a565b101561096557604051633234675360e21b815260040160405180910390fd5b426003820155805460ff60b01b191676020000000000000000000000000000000000000000000017815560405182907f0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c905f90a25050565b6109c56118c7565b818161ffff821615610a6557670de0b6b3a76400008167ffffffffffffffff161080156109fb57505f8167ffffffffffffffff16115b8015610a1d5750610a1b6402540be40067ffffffffffffffff8316611da1565b155b610a3a576040516337d4ed5b60e01b815260040160405180910390fd5b6127108261ffff1610610a60576040516337d4ed5b60e01b815260040160405180910390fd5b610a8e565b67ffffffffffffffff811615610a8e576040516337d4ed5b60e01b815260040160405180910390fd5b6005805471ffffffffffffffffffff000000000000000019166801000000000000000061ffff871690810271ffffffffffffffff000000000000000000001916919091176a010000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f59b73ca79bcb3dcb02c4d2b81e1a2da4c9fd9857ed81cfb16c5431b502f8c71b91015b60405180910390a150505050565b3373bc1000000000000000000000000000000000100014610b6857604051634ca8886760e01b815260040160405180910390fd5b5f8585604051602001610b9292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815291815281516020928301205f818152600690935291205490915060ff1615610c095760405162461bcd60e51b815260206004820152600a60248201527f6475706c6963617465640000000000000000000000000000000000000000000060448201526064016107a7565b5f8181526006602052604090819020805460ff19166001179055516001600160a01b038516907f4d2c35ab224c2e654f91bb91c9f4081beef0e0abfc8a59df04254f6d0232213290610c7e90899089908890889093845263ffffffff9290921660208401526040830152606082015260800190565b60405180910390a2505050505050565b610c966118c7565b80670de0b6b3a76400008167ffffffffffffffff16108015610cc85750655af3107a40008167ffffffffffffffff1610155b8015610cea5750610ce86402540be40067ffffffffffffffff8316611da1565b155b610d075760405163aabd5a0960e01b815260040160405180910390fd5b6005805467ffffffffffffffff191667ffffffffffffffff84169081179091556040519081527f69458aa02de2093876897ec9cd5653bbdd83360ef731be0da0e3c94bf9a22dba906020015b60405180910390a15050565b610d6a33600161195a565b81602181118015610d7b5750605b81105b610dc75760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642061646472657373000000000000000000000000000000000060448201526064016107a7565b6040805160608101825260055467ffffffffffffffff80821680845261ffff6801000000000000000084041660208501526a0100000000000000000000909204169282019290925234915f9190831015610e635760405162461bcd60e51b815260206004820152600e60248201527f616d6f756e7420746f6f206c6f7700000000000000000000000000000000000060448201526064016107a7565b602081015161ffff1615610ec957612710816020015161ffff1684610e889190611d3c565b610e929190611db4565b9150806040015167ffffffffffffffff16821115610ebc57806040015167ffffffffffffffff1691505b610ec68284611d7a565b92505b5f610ed96402540be40085611da1565b90508015610efa57610eeb8184611d67565b9250610ef78185611d7a565b93505b5f8661ffff1611610f405760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b610f516402540be40061012c611d3c565b610f5f9061ffff8816611d3c565b610f706402540be4006103e8611d3c565b610f7a9190611d67565b8411610fb75760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b600780546040805160c08101825233815261ffff8a8116602083019081526001938301848152606084018b9052608084018a90524260a085015293850186555f9590955281517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600486020180549651909216600160a01b027fffffffffffffffffffff000000000000000000000000000000000000000000009096166001600160a01b0390911617949094178085559151929390929091829060ff60b01b1916600160b01b83600581111561108f5761108f611b13565b0217905550606082015181600101556080820151816002015560a082015181600301555050336001600160a01b0316817fbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b87878b8e8e6040516110f6959493929190611dc7565b60405180910390a3505050505050505050565b61111433600161195a565b5f6007838154811061112857611128611d53565b5f9182526020909120600490910201905060018154600160b01b900460ff16600581111561115857611158611b13565b1461117657604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b031633146111a057604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426111b39190611d7a565b10156111d257604051633234675360e21b815260040160405180910390fd5b805461ffff600160a01b9091048116908316116112245760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b6112356402540be40061012c611d3c565b6112439061ffff8416611d3c565b6112546402540be4006103e8611d3c565b61125e9190611d67565b81600101541161129f5760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff841690810291909117825542600383015560405190815283907f19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa9060200160405180910390a2505050565b61131e6118c7565b818161ffff8216156113be57670de0b6b3a76400008167ffffffffffffffff1610801561135457505f8167ffffffffffffffff16115b801561137657506113746402540be40067ffffffffffffffff8316611da1565b155b611393576040516337d4ed5b60e01b815260040160405180910390fd5b6127108261ffff16106113b9576040516337d4ed5b60e01b815260040160405180910390fd5b6113e7565b67ffffffffffffffff8116156113e7576040516337d4ed5b60e01b815260040160405180910390fd5b600480547fffffffffffffffffffff00000000000000000000ffffffffffffffffffffffff166c0100000000000000000000000061ffff87169081027fffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff16919091176e01000000000000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f1007ff7aec53e9626ce51f25d4e093f290f60da8019c8cf489f0ae2f21ebf76a9101610b26565b3373bc10000000000000000000000000000000001000146114d957604051634ca8886760e01b815260040160405180910390fd5b5f600785815481106114ed576114ed611d53565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561151f5761151f611b13565b148061153c5750600281600581111561153a5761153a611b13565b145b611544575f5ffd5b815460ff60b01b1916760500000000000000000000000000000000000000000000178255426003830155600282015480156115975761159773bc1000000000000000000000000000000000000282611828565b60018301546040515f91906115ab90611a56565b82906040518091039083f5915050801580156115c9573d5f5f3e3d5ffd5b50506040805187815263ffffffff8716602082015290810185905287907fb74f5dbf34aabe02f20ff775b898acf1a9f70e4fbd48ad50548acae86e1ccd789060600160405180910390a250505050505050565b3373bc100000000000000000000000000000000010001461165057604051634ca8886760e01b815260040160405180910390fd5b5f6007828154811061166457611664611d53565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561169657611696611b13565b14806116b3575060028160058111156116b1576116b1611b13565b145b6116bb575f5ffd5b815460ff60b01b191676030000000000000000000000000000000000000000000017825542600383015560405183907f829a8683c544ad289ce92d3ce06e9ebad69b18a6916e60ec766c2c217461d8e9905f90a2505050565b61171c6118c7565b80670de0b6b3a76400008167ffffffffffffffff1610801561174e5750655af3107a40008167ffffffffffffffff1610155b8015611770575061176e6402540be40067ffffffffffffffff8316611da1565b155b61178d5760405163aabd5a0960e01b815260040160405180910390fd5b600480546bffffffffffffffff00000000191664010000000067ffffffffffffffff8516908102919091179091556040519081527f7aa20a242ea0b0f7b0141c56aaad636eb2b2077c9c27d09a8282f6931f486a2190602001610d53565b6117f36118c7565b6001600160a01b03811661181c57604051631e4fbdf760e01b81525f60048201526024016107a7565b611825816118f3565b50565b804710156118525760405163cf47918160e01b8152476004820152602481018290526044016107a7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461189b576040519150601f19603f3d011682016040523d82523d5f602084013e6118a0565b606091505b50509050806118c25760405163d6bda27560e01b815260040160405180910390fd5b505050565b5f546001600160a01b0316331461089a5760405163118cdaa760e01b81523360048201526024016107a7565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f0000000000000000000000000000000000000000000000000000000000000000156119d3576001600160a01b0382165f908152600360205260409020544390036119b857604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f036119de575050565b6001544303611a055780600180015f8282546119fa9190611d67565b90915550611a0f9050565b4360015560028190555b6002547f00000000000000000000000000000000000000000000000000000000000000201015611a525760405163a74c1c5f60e01b815260040160405180910390fd5b5050565b600880611e0f83390190565b5f60208284031215611a72575f5ffd5b81356001600160e01b031981168114611a89575f5ffd5b9392505050565b803563ffffffff81168114611aa3575f5ffd5b919050565b5f5f60408385031215611ab9575f5ffd5b82359150611ac960208401611a90565b90509250929050565b5f60208284031215611ae2575f5ffd5b5035919050565b803561ffff81168114611aa3575f5ffd5b5f60208284031215611b0a575f5ffd5b611a8982611ae9565b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b038716815261ffff8616602082015260c0810160068610611b5d57634e487b7160e01b5f52602160045260245ffd5b8560408301528460608301528360808301528260a0830152979650505050505050565b803567ffffffffffffffff81168114611aa3575f5ffd5b5f5f60408385031215611ba8575f5ffd5b611bb183611ae9565b9150611ac960208401611b80565b80356001600160a01b0381168114611aa3575f5ffd5b5f5f5f5f5f60a08688031215611be9575f5ffd5b85359450611bf960208701611a90565b9350611c0760408701611bbf565b94979396509394606081013594506080013592915050565b5f60208284031215611c2f575f5ffd5b611a8982611b80565b5f5f5f60408486031215611c4a575f5ffd5b833567ffffffffffffffff811115611c60575f5ffd5b8401601f81018613611c70575f5ffd5b803567ffffffffffffffff811115611c86575f5ffd5b866020828401011115611c97575f5ffd5b602091820194509250611cab908501611ae9565b90509250925092565b5f5f60408385031215611cc5575f5ffd5b82359150611ac960208401611ae9565b5f5f5f5f60808587031215611ce8575f5ffd5b8435935060208501359250611cff60408601611a90565b9396929550929360600135925050565b5f60208284031215611d1f575f5ffd5b611a8982611bbf565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105d0576105d0611d28565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105d0576105d0611d28565b818103818111156105d0576105d0611d28565b634e487b7160e01b5f52601260045260245ffd5b5f82611daf57611daf611d8d565b500690565b5f82611dc257611dc2611d8d565b500490565b85815284602082015261ffff8416604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f1916010194935050505056fe608060405230fffea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000100038d7ea4c68000001400005af3107a400047545630", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000071afd498d0000000200005af3107a4000" + } + }, + "bC10000000000000000000000000000000000004": { + "balance": "0x8ac7230489e80000", + "nonce": "0x1", + "code": "0x6080604052600436106101d9575f3560e01c80635ba3a6a5116100fd578063bc01763711610092578063e486033911610062578063e4860339146105c4578063e4a28a521461063d578063e6a36cb61461066c578063f2fde38b1461068b575f5ffd5b8063bc01763714610548578063bd12835014610567578063bd9fadb514610586578063daea85c5146105a5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b146104e15780639d879990146104fd578063aa94def21461051c578063af38d7571461052f575f5ffd5b80635ba3a6a51461045c5780635d0341ba1461047b578063715018a6146104b957806380e9071b146104cd575f5ffd5b806323435e2f1161017357806349a0bf8e1161014357806349a0bf8e146103d1578063505bd3da146103e5578063551b3cd21461041057806359e5332d1461043b575f5ffd5b806323435e2f14610341578063293cdbf1146103775780633396c8091461038b578063423905f2146103be575f5ffd5b80631485ff78116101ae5780631485ff78146102a1578063160e3f3d146102c45780631eeea1f3146102e357806321c0b34214610322575f5ffd5b806252c9e1146101dd578062aba51a146101fe578063022914a71461021d57806309e3faa71461026e575b5f5ffd5b3480156101e8575f5ffd5b506101fc6101f73660046125d6565b6106aa565b005b348015610209575f5ffd5b506101fc61021836600461261e565b61078d565b348015610228575f5ffd5b50610251610237366004612666565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610279575f5ffd5b506102517f000000000000000000000000bc1000000000000000000000000000000000000181565b3480156102ac575f5ffd5b506102b660055481565b604051908152602001610265565b3480156102cf575f5ffd5b506101fc6102de366004612686565b6108aa565b3480156102ee575f5ffd5b506103026102fd3660046126b3565b610954565b604080516001600160a01b03938416815292909116602083015201610265565b34801561032d575f5ffd5b506101fc61033c3660046125d6565b610971565b34801561034c575f5ffd5b506102b661035b3660046125d6565b600b60209081525f928352604080842090915290825290205481565b348015610382575f5ffd5b506101fc610a99565b348015610396575f5ffd5b506102b67f000000000000000000000000000000000000000000000000000000000000002081565b6101fc6103cc3660046126db565b610afc565b3480156103dc575f5ffd5b506102b6600881565b3480156103f0575f5ffd5b506102b66103ff366004612666565b600c6020525f908152604090205481565b34801561041b575f5ffd5b506102b661042a366004612666565b600a6020525f908152604090205481565b348015610446575f5ffd5b5061044f610d1c565b6040516102659190612721565b348015610467575f5ffd5b506101fc610476366004612778565b610e0d565b348015610486575f5ffd5b506104a9610495366004612666565b600d6020525f908152604090205460ff1681565b6040519015158152602001610265565b3480156104c4575f5ffd5b506101fc611115565b3480156104d8575f5ffd5b506101fc611128565b3480156104ec575f5ffd5b505f546001600160a01b0316610251565b348015610508575f5ffd5b506101fc6105173660046127b7565b6111bf565b6101fc61052a366004612827565b611450565b34801561053a575f5ffd5b506007546104a99060ff1681565b348015610553575f5ffd5b506101fc6105623660046127b7565b611537565b348015610572575f5ffd5b506101fc610581366004612876565b6115e0565b348015610591575f5ffd5b506101fc6105a036600461289e565b611883565b3480156105b0575f5ffd5b506101fc6105bf366004612666565b611a0b565b3480156105cf575f5ffd5b506106126105de366004612666565b60096020525f908152604090208054600182015460029092015460ff82169261010090920467ffffffffffffffff16919084565b60408051941515855267ffffffffffffffff9093166020850152918301526060820152608001610265565b348015610648575f5ffd5b50610653620f424081565b60405167ffffffffffffffff9091168152602001610265565b348015610677575f5ffd5b506101fc6106863660046128c8565b611a9f565b348015610696575f5ffd5b506101fc6106a5366004612666565b611ce7565b6001600160a01b038083165f90815260086020526040902054839116803381146106f8576040516370a4337d60e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0383166107205760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038481165f8181526008602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fadd4071c89e561d58065ade5130c43b17b1101714bca7d91d2515ba1cb9fc97691015b60405180910390a150505050565b833373bc10000000000000000000000000000000001001146107c25760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561080b57604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556001600160a01b0383161580159061084657505f82115b1561085f5761085f6001600160a01b0384168584611d21565b6040805167ffffffffffffffff87168152602081018490527f31fa984883dfea329532d399d9106031006364f445ef2351a45c0d9cbc4ec72791015b60405180910390a15050505050565b6108b2611d9a565b5f81116108d257604051630dd484e760e41b815260040160405180910390fd5b6109076001600160a01b037f000000000000000000000000bc1000000000000000000000000000000000000116333084611dc6565b8060055f8282546109189190612939565b90915550506040518181527f41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0906020015b60405180910390a150565b5f5f61095f83611dff565b61096884611f17565b91509150915091565b6001600160a01b038083165f90815260086020526040902054839116803381146109ba576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508360016109c88282611f47565b6001600160a01b0385166109ef5760405163f6b2911f60e01b815260040160405180910390fd5b600480547fa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b9167ffffffffffffffff909116905f610a2c8361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508787604051610a899392919067ffffffffffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a1505050505050565b610aa1611d9a565b60075460ff1615610ac55760405163eef336d960e01b815260040160405180910390fd5b6007805460ff191660011790556040517f8b1bc2671f5913bb778240df66342565720db9b7a01e7e78190ae6aa1e4bd0f3905f90a1565b600654610b1c576040516314d2abd360e21b815260040160405180910390fd5b5f610b2685611dff565b90505f468233604051602001610b6593929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b604051602081830303815290604052805190602001209050610b898184878761203f565b6001600160a01b0316610b9b87611f17565b6001600160a01b031614610bc257604051630e751dc360e31b815260040160405180910390fd5b6001600160a01b038281165f9081526008602052604090205483911615610c085760405163107f863360e21b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600d602052604090205460ff1680610c5857505f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff165b8290610c8357604051633e55e12b60e11b81526001600160a01b0390911660048201526024016106ef565b50600654610c9d908390610c98906001612939565b611f47565b6001600160a01b0382165f908152600860205260409081902080546001600160a01b0319163390811790915590517ff3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd91610cfb918591908a90612978565b60405180910390a1610d1482610d0f610d1c565b61206b565b505050505050565b6006546060905f9067ffffffffffffffff811115610d3c57610d3c61299f565b604051908082528060200260200182016040528015610d8057816020015b604080518082019091525f8082526020820152815260200190600190039081610d5a5790505b5090505f5b600654811015610e07575f60068281548110610da357610da36129b3565b5f9182526020808320909101546040805180820182526001600160a01b039092168083528085526009845293206002015491810191909152845191925090849084908110610df357610df36129b3565b602090810291909101015250600101610d85565b50919050565b610e15611d9a565b6001600160a01b0384165f9081526009602052604090205460ff1615610e4e57604051632ae3f45d60e11b815260040160405180910390fd5b6001600160a01b0384161580610ec65750836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906129c7565b60ff166012145b610ee357604051638785ff4f60e01b815260040160405180910390fd5b5f8367ffffffffffffffff16118015610f085750620f424067ffffffffffffffff8416105b610f255760405163018a49e560e01b815260040160405180910390fd5b60408051608081018252600180825267ffffffffffffffff8681166020808501828152858701898152606087018981526001600160a01b038d165f818152600986528a902098518954945168ffffffffffffffffff1990951690151568ffffffffffffffff0019161761010094909716939093029590951787555194860194909455915160029094019390935583519182528101919091527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a1604080516001600160a01b0386168152602081018490527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a1801561110f5781158061103d5750808210155b828290916110675760405163068ade6560e31b8152600481019290925260248201526044016106ef565b505060065460081161108c57604051632970307360e11b815260040160405180910390fd5b600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03861690811790915560408051918252602082018390527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b50505050565b61111d611d9a565b6111265f612380565b565b60075460ff1661114b576040516335b43c0360e11b815260040160405180910390fd5b335f908152600c602052604090205480611178576040516301e1880f60e51b815260040160405180910390fd5b335f818152600c60205260408120556111bc907f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03169083611d21565b50565b6111c7611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661120d5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600960205260409020600201548181036112495760405163aabb9c6360e01b815260040160405180910390fd5b6001600160a01b0383165f81815260096020908152604091829020600201859055815192835282018490527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910160405180910390a1801580156112ac57505f82115b15611325576006546008116112d457604051632970307360e11b815260040160405180910390fd5b50600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091161790555050565b5f8111801561133357505f82115b1561133d57505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611366576113666129b3565b5f918252602090912001546001600160a01b0316036114445760065461138e906001906129e2565b811461140b57600680546113a4906001906129e2565b815481106113b4576113b46129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106113df576113df6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061141c5761141c6129f5565b5f8281526020902081015f1990810180546001600160a01b03191690550190555061144c9050565b60010161133f565b5050565b6001600160a01b038084165f9081526008602052604090205484911680338114611499576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b5084836114a68282611f47565b84158015906114b6575060088511155b6114d357604051632970307360e11b815260040160405180910390fd5b61152e878787808060200260200160405190810160405280939291908181526020015f905b828210156115245761151560408302860136819003810190612a09565b815260200190600101906114f8565b505050505061206b565b50505050505050565b61153f611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff166115855760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f81815260096020908152604091829020600101849055815192835282018390527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a15050565b6115e8611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661162e5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b50620f424067ffffffffffffffff82161061165c5760405163018a49e560e01b815260040160405180910390fd5b604080516001600160a01b038416815267ffffffffffffffff831660208201527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a167ffffffffffffffff8116156116f4576001600160a01b0382165f908152600960205260409020805467ffffffffffffffff83166101000268ffffffffffffffff00199091161790555050565b6001600160a01b0382165f908152600960205260408120600281018054825468ffffffffffffffffff1916835560019092018390559190915515158061173957505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611762576117626129b3565b5f918252602090912001546001600160a01b03160361187b5760065461178a906001906129e2565b811461180757600680546117a0906001906129e2565b815481106117b0576117b06129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106117db576117db6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6006805480611818576118186129f5565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516001600160a01b0388168152918201929092527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b60010161173b565b833373bc10000000000000000000000000000000001001146118b85760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561190157604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556005548311156119355760055492505b82156119c35760075460ff161561197f5761197a6001600160a01b037f000000000000000000000000bc10000000000000000000000000000000000001168585611d21565b6119ac565b6001600160a01b0384165f908152600c6020526040812080548592906119a6908490612939565b90915550505b8260055f8282546119bd91906129e2565b90915550505b6040805167ffffffffffffffff87168152602081018590529081018390527f2b02cde117ae53d66dc4d0bdf72b2146e0e1070c1428d6274b0f98d628ad99c49060600161089b565b611a13611d9a565b6001600160a01b0381165f908152600d602052604090205460ff1615611a4c57604051632ef470fd60e11b815260040160405180910390fd5b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce79101610949565b6001600160a01b038085165f9081526008602052604090205485911680338114611ae8576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508583611af58282611f47565b8415801590611b05575060088511155b611b2257604051632970307360e11b815260040160405180910390fd5b6001600160a01b038716611b495760405163f6b2911f60e01b815260040160405180910390fd5b5f5b85811015611cdc575f878783818110611b6657611b666129b3565b905060400201803603810190611b7c9190612a09565b90505f816020015111611ba257604051630dd484e760e41b815260040160405180910390fd5b6020808201516001600160a01b03808d165f908152600b8452604080822086519093168252919093528220805491929091611bde9084906129e2565b909155505060208082015182516001600160a01b03165f908152600a90925260408220805491929091611c129084906129e2565b9091555050600480547f40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db79167ffffffffffffffff909116905f611c548361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508b8b845f01518560200151604051611ccb95949392919067ffffffffffffffff9590951685526001600160a01b03938416602086015291831660408501529091166060830152608082015260a00190565b60405180910390a150600101611b4b565b505050505050505050565b611cef611d9a565b6001600160a01b038116611d1857604051631e4fbdf760e01b81525f60048201526024016106ef565b6111bc81612380565b6040516001600160a01b03838116602483015260448201839052611d9591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123cf565b505050565b5f546001600160a01b031633146111265760405163118cdaa760e01b81523360048201526024016106ef565b6040516001600160a01b03848116602483015283811660448301526064820183905261110f9186918216906323b872dd90608401611d4e565b5f80602083013560011615611e1857600360f81b611e1e565b600160f91b5b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152843560218201529091505f9060029060410160408051601f1981840301815290829052611e7591612a6b565b602060405180830381855afa158015611e90573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611eb39190612a81565b9050600381604051602001611eca91815260200190565b60408051601f1981840301815290829052611ee491612a6b565b602060405180830381855afa158015611eff573d5f5f3e3d5ffd5b5050604051516001600160a01b031695945050505050565b5f81604051602001611f299190612a98565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000115611fc0576001600160a01b0382165f90815260036020526040902054439003611fa557604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f03611fcb575050565b6001544303611ff25780600180015f828254611fe79190612939565b90915550611ffc9050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561144c5760405163a74c1c5f60e01b815260040160405180910390fd5b5f5f5f5f61204f8888888861243b565b92509250925061205f8282612503565b50909695505050505050565b345f5b825181101561235c575f83828151811061208a5761208a6129b3565b60209081029190910181015180516001600160a01b03165f908152600983526040908190208151608081018352815460ff811615158252610100900467ffffffffffffffff16818601526001820154928101929092526002015460608201529181015190925061210d57604051630dd484e760e41b815260040160405180910390fd5b602081015182519067ffffffffffffffff166121485760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b038087165f908152600b6020908152604080832086519094168352929052205460608201518110156121ce575f81836060015161218d91906129e2565b6020850151855191925082908111156121ca576040516349cd40ff60e01b81526001600160a01b03909216600483015260248201526044016106ef565b5050505b82516001600160a01b031661220e57602083015185811461220557604051630a61be9f60e41b81526004016106ef91815260200190565b505f945061222e565b6020830151835161222e916001600160a01b039091169033903090611dc6565b60208084015184516001600160a01b03165f908152600a90925260408220546122579190612939565b905082604001515f148061226f575080836040015110155b8451604085015190916122a65760405163421dca0560e11b81526001600160a01b03909216600483015260248201526044016106ef565b505083516001600160a01b039081165f908152600a60209081526040808320859055818801518c85168452600b83528184208951909516845293909152812080549091906122f5908490612939565b90915550508351602080860151604080516001600160a01b038d811682529094169284019290925282820152517fec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f39181900360600190a150506001909201915061206e9050565b505f811561110f57604051630a61be9f60e41b81526004016106ef91815260200190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f60205f8451602086015f885af1806123ee576040513d5f823e3d81fd5b50505f513d91508115612405578060011415612412565b6001600160a01b0384163b155b1561110f57604051635274afe760e01b81526001600160a01b03851660048201526024016106ef565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561247457505f915060039050826124f9565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124c5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124f057505f9250600191508290506124f9565b92505f91508190505b9450945094915050565b5f82600381111561251657612516612aa5565b0361251f575050565b600182600381111561253357612533612aa5565b036125515760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561256557612565612aa5565b036125865760405163fce698f760e01b8152600481018290526024016106ef565b600382600381111561259a5761259a612aa5565b0361144c576040516335e2f38360e21b8152600481018290526024016106ef565b80356001600160a01b03811681146125d1575f5ffd5b919050565b5f5f604083850312156125e7575f5ffd5b6125f0836125bb565b91506125fe602084016125bb565b90509250929050565b803567ffffffffffffffff811681146125d1575f5ffd5b5f5f5f5f60808587031215612631575f5ffd5b61263a85612607565b9350612648602086016125bb565b9250612656604086016125bb565b9396929550929360600135925050565b5f60208284031215612676575f5ffd5b61267f826125bb565b9392505050565b5f60208284031215612696575f5ffd5b5035919050565b80604081018310156126ad575f5ffd5b92915050565b5f604082840312156126c3575f5ffd5b61267f838361269d565b60ff811681146111bc575f5ffd5b5f5f5f5f60a085870312156126ee575f5ffd5b6126f8868661269d565b935060408501359250606085013591506080850135612716816126cd565b939692955090935050565b602080825282518282018190525f918401906040840190835b8181101561276d57835180516001600160a01b03168452602090810151818501529093019260409092019160010161273a565b509095945050505050565b5f5f5f5f6080858703121561278b575f5ffd5b612794856125bb565b93506127a260208601612607565b93969395505050506040820135916060013590565b5f5f604083850312156127c8575f5ffd5b6127d1836125bb565b946020939093013593505050565b5f5f83601f8401126127ef575f5ffd5b50813567ffffffffffffffff811115612806575f5ffd5b6020830191508360208260061b8501011115612820575f5ffd5b9250929050565b5f5f5f60408486031215612839575f5ffd5b612842846125bb565b9250602084013567ffffffffffffffff81111561285d575f5ffd5b612869868287016127df565b9497909650939450505050565b5f5f60408385031215612887575f5ffd5b612890836125bb565b91506125fe60208401612607565b5f5f5f5f608085870312156128b1575f5ffd5b6128ba85612607565b93506127a2602086016125bb565b5f5f5f5f606085870312156128db575f5ffd5b6128e4856125bb565b93506128f2602086016125bb565b9250604085013567ffffffffffffffff81111561290d575f5ffd5b612919878288016127df565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126ad576126ad612925565b5f67ffffffffffffffff821667ffffffffffffffff810361296f5761296f612925565b60010192915050565b6001600160a01b038481168252831660208201526080810160408381840137949350505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156129d7575f5ffd5b815161267f816126cd565b818103818111156126ad576126ad612925565b634e487b7160e01b5f52603160045260245ffd5b5f6040828403128015612a1a575f5ffd5b506040805190810167ffffffffffffffff81118282101715612a4a57634e487b7160e01b5f52604160045260245ffd5b604052612a56836125bb565b81526020928301359281019290925250919050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612a91575f5ffd5b5051919050565b6040828237604001919050565b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0d13acf57871ac7f9cb5a329186ae37a4dfd4e617dee2ebbab684b46d75d9ed2": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0x344a0f405a413603c3bef9eae8dae8b6710151a0da8ae38fe8ac9167dacfe84f": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xe3bc585728cfb9d26f5badbad3829b0cb1fa86b3744a0180bfa0b307b1b25a40": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b": "0x00000000000000000000000000000000000000000000000000000000002ee001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c": "0x00000000000000000000000000000000000000000000002b5e3af16b18800000", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf3c61d3b73124820d8a810ab1915a9d8c6bfb75d03344e78e5f73f6d90e1bb8d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "bc10000000000000000000000000000000000005": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b5060043610610064575f3560e01c806385df51fd1161004d57806385df51fd1461009d57806394f490bd146100bc578063e405bbc3146100d1575f5ffd5b8063107bf28c1461006857806326a6557a14610086575b5f5ffd5b6100706100da565b60405161007d91906101fe565b60405180910390f35b61008f60015481565b60405190815260200161007d565b61008f6100ab366004610233565b5f9081526003602052604090205490565b6100cf6100ca366004610233565b610165565b005b61008f60025481565b5f80546100e69061024a565b80601f01602080910402602001604051908101604052809291908181526020018280546101129061024a565b801561015d5780601f106101345761010080835404028352916020019161015d565b820191905f5260205f20905b81548152906001019060200180831161014057829003601f168201915b505050505081565b3373bc100000000000000000000000000000000010001461019957604051634ca8886760e01b815260040160405180910390fd5b5f60025f81546101a890610282565b91829055505f8181526003602052604090819020849055519091507fdd5483f1119d050d70b0fe3ed9db0b5f41b3ec55838346cbb624efe0565b0133906101f29083815260200190565b60405180910390a15050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610243575f5ffd5b5035919050565b600181811c9082168061025e57607f821691505b60208210810361027c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6001820161029f57634e487b7160e01b5f52601160045260245ffd5b506001019056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x726567746573740000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff": "0x06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f" + } + }, + "BC10000000000000000000000000000000000006": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c80638da5cb5b11610072578063a3ec138d11610058578063a3ec138d1461015e578063cd57654314610180578063f2fde38b146101a2575f5ffd5b80638da5cb5b1461011257806398611f121461012c575f5ffd5b8063715018a6116100a2578063715018a6146100ee578063827fb811146100f657806386c1ff68146100ff575f5ffd5b80632ddbd13a146100bd5780637090a943146100d9575b5f5ffd5b6100c660015481565b6040519081526020015b60405180910390f35b6100ec6100e7366004610602565b6101b5565b005b6100ec6103c4565b6100c661010081565b6100ec61010d36600461062a565b6103d7565b5f546040516001600160a01b0390911681526020016100d0565b61014e61013a36600461064a565b60026020525f908152604090205460ff1681565b60405190151581526020016100d0565b61014e61016c36600461062a565b60036020525f908152604090205460ff1681565b61014e61018e36600461062a565b60046020525f908152604090205460ff1681565b6100ec6101b036600461062a565b610517565b6101bd610554565b5f8181526002602052604090205460ff16156102205760405162461bcd60e51b815260206004820152600e60248201527f6475706c696361746564206b657900000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0382165f9081526003602052604090205460ff16156102885760405162461bcd60e51b815260206004820152601060248201527f6475706c69636174656420766f746572000000000000000000000000000000006044820152606401610217565b6001600160a01b0382165f9081526004602052604090205460ff16156102f05760405162461bcd60e51b815260206004820152600d60248201527f64656c6574656420766f746572000000000000000000000000000000000000006044820152606401610217565b61010060015f815461030190610675565b9182905550106103535760405162461bcd60e51b815260206004820152600f60248201527f746f6f206d616e7920766f7465727300000000000000000000000000000000006044820152606401610217565b6001600160a01b0382165f8181526003602090815260408083208054600160ff199182168117909255868552600284529382902080549094161790925590518381527f101c617f43dd1b8a54a9d747d9121bbc55e93b88bc50560d782a79c4e28fc838910160405180910390a25050565b6103cc610554565b6103d55f610580565b565b6103df610554565b6001600160a01b0381165f9081526003602052604090205460ff166104465760405162461bcd60e51b815260206004820152600f60248201527f766f746572206e6f7420666f756e6400000000000000000000000000000000006044820152606401610217565b60018054116104975760405162461bcd60e51b815260206004820152600e60248201527f746f6f2066657720766f746572730000000000000000000000000000000000006044820152606401610217565b6001600160a01b0381165f908152600360209081526040808320805460ff1990811690915560049092528220805490911660019081179091558054916104dc8361068d565b90915550506040516001600160a01b038216907f183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e8905f90a250565b61051f610554565b6001600160a01b03811661054857604051631e4fbdf760e01b81525f6004820152602401610217565b61055181610580565b50565b5f546001600160a01b031633146103d55760405163118cdaa760e01b8152336004820152602401610217565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146105fd575f5ffd5b919050565b5f5f60408385031215610613575f5ffd5b61061c836105e7565b946020939093013593505050565b5f6020828403121561063a575f5ffd5b610643826105e7565b9392505050565b5f6020828403121561065a575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161068657610686610661565b5060010190565b5f8161069b5761069b610661565b505f19019056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0a3ec6b08b560ee53be475991ed8c4892ed4cdeecf9f37f002142a7842b0530f": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x2484d2d2758ec2706bbffec70b3d738153e1bf065b889ccf652638970e882a61": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xee118486ad39d47fbc1cbdc1ebac839b559a3af9c0fb95cc855fa762df9ca7c7": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "Bc10000000000000000000000000000000000007": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063023276f01461002d575b5f5ffd5b61004061003b3660046100f0565b610042565b005b5f5f5f1b82604051610053906100e3565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103905ff590508015801561008d573d5f5f3e3d5ffd5b5060405173ffffffffffffffffffffffffffffffffffffffff8083168252919250908316907f587ece4cd19692c5be1a4184503d607d45542d2aca0698c0068f52e09ccb541c9060200160405180910390a25050565b6111178061012b83390190565b5f60208284031215610100575f5ffd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610123575f5ffd5b939250505056fe60c060405234801561000f575f5ffd5b5060405161111738038061111783398101604081905261002e91610233565b806001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610069573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526100909190810190610274565b6040516020016100a0919061033b565b604051602081830303815290604052816001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100ea573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101119190810190610274565b6040516020016101219190610370565b60408051601f19818403018152919052600361013d8382610411565b50600461014a8282610411565b5050505f816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561018a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ae91906104cb565b60ff1690506012811080156101c257505f81115b6102055760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b604482015260640160405180910390fd5b6001600160a01b03821660805261021d8160126104ff565b61022890600a6105fb565b60a052506106069050565b5f60208284031215610243575f5ffd5b81516001600160a01b0381168114610259575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215610284575f5ffd5b81516001600160401b03811115610299575f5ffd5b8201601f810184136102a9575f5ffd5b80516001600160401b038111156102c2576102c2610260565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102f0576102f0610260565b604052818152828201602001861015610307575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f81518060208401855e5f93019283525090919050565b5f6103468284610324565b600160fd1b81526f29ba30b73230b932102bb930b83832b960811b60018201526011019392505050565b5f61037b8284610324565b61535760f01b81526002019392505050565b600181811c908216806103a157607f821691505b6020821081036103bf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561040c57805f5260205f20601f840160051c810160208510156103ea5750805b601f840160051c820191505b81811015610409575f81556001016103f6565b50505b505050565b81516001600160401b0381111561042a5761042a610260565b61043e81610438845461038d565b846103c5565b6020601f821160018114610470575f83156104595750848201515b5f19600385901b1c1916600184901b178455610409565b5f84815260208120601f198516915b8281101561049f578785015182556020948501946001909201910161047f565b50848210156104bc57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156104db575f5ffd5b815160ff81168114610259575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610512576105126104eb565b92915050565b6001815b600184111561055357808504811115610537576105376104eb565b600184161561054557908102905b60019390931c92800261051c565b935093915050565b5f8261056957506001610512565b8161057557505f610512565b816001811461058b5760028114610595576105b1565b6001915050610512565b60ff8411156105a6576105a66104eb565b50506001821b610512565b5060208310610133831016604e8410600b84101617156105d4575081810a610512565b6105e05f198484610518565b805f19048211156105f3576105f36104eb565b029392505050565b5f610259838361055b565b60805160a051610acd61064a5f395f818161016d015281816103370152818161038f015261046401525f8181610194015281816103be015261042b0152610acd5ff3fe608060405234801561000f575f5ffd5b50600436106100da575f3560e01c80633ba0b9a91161008857806395d89b411161006357806395d89b41146101f6578063a9059cbb146101fe578063b6b55f2514610211578063dd62ed3e14610224575f5ffd5b80633ba0b9a9146101685780636f307dc31461018f57806370a08231146101ce575f5ffd5b806323b872dd116100b857806323b872dd146101315780632e1a7d4d14610144578063313ce56714610159575f5ffd5b806306fdde03146100de578063095ea7b3146100fc57806318160ddd1461011f575b5f5ffd5b6100e661025c565b6040516100f391906108f6565b60405180910390f35b61010f61010a366004610946565b6102ec565b60405190151581526020016100f3565b6002545b6040519081526020016100f3565b61010f61013f36600461096e565b610305565b6101576101523660046109a8565b610328565b005b604051601281526020016100f3565b6101237f000000000000000000000000000000000000000000000000000000000000000081565b6101b67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100f3565b6101236101dc3660046109bf565b6001600160a01b03165f9081526020819052604090205490565b6100e66103e9565b61010f61020c366004610946565b6103f8565b61015761021f3660046109a8565b610405565b6101236102323660046109df565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461026b90610a10565b80601f016020809104026020016040519081016040528092919081815260200182805461029790610a10565b80156102e25780601f106102b9576101008083540402835291602001916102e2565b820191905f5260205f20905b8154815290600101906020018083116102c557829003601f168201915b5050505050905090565b5f336102f981858561048e565b60019150505b92915050565b5f336103128582856104a0565b61031d858585610520565b506001949350505050565b5f8111801561035e575061035c7f000000000000000000000000000000000000000000000000000000000000000082610a5c565b155b61037b57604051632a9ffab760e21b815260040160405180910390fd5b33610386818361057d565b6103e5816103b47f000000000000000000000000000000000000000000000000000000000000000085610a83565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906105b1565b5050565b60606004805461026b90610a10565b5f336102f9818585610520565b5f811161042557604051632a9ffab760e21b815260040160405180910390fd5b3361045b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316823085610625565b6103e5816104897f000000000000000000000000000000000000000000000000000000000000000085610a96565b61065e565b61049b8383836001610692565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461051a578181101561050c57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61051a84848484035f610692565b50505050565b6001600160a01b03831661054957604051634b637e8f60e11b81525f6004820152602401610503565b6001600160a01b0382166105725760405163ec442f0560e01b81525f6004820152602401610503565b61049b838383610764565b6001600160a01b0382166105a657604051634b637e8f60e11b81525f6004820152602401610503565b6103e5825f83610764565b6040516001600160a01b0383811660248301526044820183905261049b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061088a565b6040516001600160a01b03848116602483015283811660448301526064820183905261051a9186918216906323b872dd906084016105de565b6001600160a01b0382166106875760405163ec442f0560e01b81525f6004820152602401610503565b6103e55f8383610764565b6001600160a01b0384166106bb5760405163e602df0560e01b81525f6004820152602401610503565b6001600160a01b0383166106e457604051634a1406b160e11b81525f6004820152602401610503565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561051a57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161075691815260200190565b60405180910390a350505050565b6001600160a01b03831661078e578060025f8282546107839190610aad565b909155506107fe9050565b6001600160a01b0383165f90815260208190526040902054818110156107e05760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610503565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661081a57600280548290039055610838565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161087d91815260200190565b60405180910390a3505050565b5f5f60205f8451602086015f885af1806108a9576040513d5f823e3d81fd5b50505f513d915081156108c05780600114156108cd565b6001600160a01b0384163b155b1561051a57604051635274afe760e01b81526001600160a01b0385166004820152602401610503565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610941575f5ffd5b919050565b5f5f60408385031215610957575f5ffd5b6109608361092b565b946020939093013593505050565b5f5f5f60608486031215610980575f5ffd5b6109898461092b565b92506109976020850161092b565b929592945050506040919091013590565b5f602082840312156109b8575f5ffd5b5035919050565b5f602082840312156109cf575f5ffd5b6109d88261092b565b9392505050565b5f5f604083850312156109f0575f5ffd5b6109f98361092b565b9150610a076020840161092b565b90509250929050565b600181811c90821680610a2457607f821691505b602082108103610a4257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601260045260245ffd5b5f82610a6a57610a6a610a48565b500690565b634e487b7160e01b5f52601160045260245ffd5b5f82610a9157610a91610a48565b500490565b80820281158282048414176102ff576102ff610a6f565b808201808211156102ff576102ff610a6f56fea164736f6c634300081b000aa164736f6c634300081b000a", + "storage": {} + }, + "BC10000000000000000000000000000000000Da0": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6080604052600436106102f0575f3560e01c80637d5e81e211610186578063bc197c81116100dc578063e540d01d11610087578063f23a6e6111610062578063f23a6e611461097e578063f8ce560a146109a9578063fc0c546a146109c8575f5ffd5b8063e540d01d14610921578063eb9019d414610940578063ece40cc11461095f575f5ffd5b8063c59057e4116100b7578063c59057e41461088a578063dd4e2ba5146108a9578063deaaa7cc146108ee575f5ffd5b8063bc197c811461082d578063c01f9e3714610858578063c28bc2fa14610877575f5ffd5b806397c3d3341161013c578063a9a9529411610117578063a9a95294146107c4578063ab58fb8e146107e3578063b58131b014610819575f5ffd5b806397c3d3341461077e5780639a802a6d14610791578063a7713a70146107b0575f5ffd5b806384b0196e1161016c57806384b0196e1461070d5780638ff262e31461073457806391ddadf414610753575f5ffd5b80637d5e81e2146106ba5780637ecebe00146106d9575f5ffd5b80633e4f49e61161024657806356781388116101f157806360c4247f116101cc57806360c4247f1461065d578063790518871461067c5780637b3c71d31461069b575f5ffd5b806356781388146106005780635b8d0e0d1461061f5780635f398a141461063e575f5ffd5b80634bf5d7e9116102215780634bf5d7e914610570578063544ffc9c1461058457806354fd4d50146105d7575f5ffd5b80633e4f49e6146104dd5780634385963214610509578063452115d614610551575f5ffd5b8063150b7a02116102a65780632d63f693116102815780632d63f6931461045c5780632fe3e261146104965780633932abb1146104c9575f5ffd5b8063150b7a02146103e7578063160cbed71461042a5780632656227d14610449575f5ffd5b806306f3f9e6116102d657806306f3f9e61461035b57806306fdde031461037a578063143489d01461039b575f5ffd5b806301ffc9a7146102fc57806302a251a314610330575f5ffd5b366102f8575b005b5f5ffd5b348015610307575f5ffd5b5061031b610316366004612c6c565b6109fa565b60405190151581526020015b60405180910390f35b34801561033b575f5ffd5b50600854600160301b900463ffffffff165b604051908152602001610327565b348015610366575f5ffd5b506102f6610375366004612c93565b610a50565b348015610385575f5ffd5b5061038e610a64565b6040516103279190612cd8565b3480156103a6575f5ffd5b506103cf6103b5366004612c93565b5f908152600460205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610327565b3480156103f2575f5ffd5b50610411610401366004612dc5565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610327565b348015610435575f5ffd5b5061034d610444366004612f88565b610af4565b61034d610457366004612f88565b610b3c565b348015610467575f5ffd5b5061034d610476366004612c93565b5f90815260046020526040902054600160a01b900465ffffffffffff1690565b3480156104a1575f5ffd5b5061034d7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b3480156104d4575f5ffd5b5061034d610c7f565b3480156104e8575f5ffd5b506104fc6104f7366004612c93565b610c91565b6040516103279190613052565b348015610514575f5ffd5b5061031b610523366004613060565b5f8281526009602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561055c575f5ffd5b5061034d61056b366004612f88565b610dda565b34801561057b575f5ffd5b5061038e610e46565b34801561058f575f5ffd5b506105bc61059e366004612c93565b5f908152600960205260409020805460018201546002909201549092565b60408051938452602084019290925290820152606001610327565b3480156105e2575f5ffd5b506040805180820190915260018152603160f81b602082015261038e565b34801561060b575f5ffd5b5061034d61061a36600461309a565b610f06565b34801561062a575f5ffd5b5061034d610639366004613100565b610f2d565b348015610649575f5ffd5b5061034d6106583660046131bd565b611089565b348015610668575f5ffd5b5061034d610677366004612c93565b6110dc565b348015610687575f5ffd5b506102f6610696366004613253565b611168565b3480156106a6575f5ffd5b5061034d6106b536600461326e565b611179565b3480156106c5575f5ffd5b5061034d6106d43660046132c4565b6111bf565b3480156106e4575f5ffd5b5061034d6106f3366004613384565b6001600160a01b03165f9081526002602052604090205490565b348015610718575f5ffd5b50610721611275565b60405161032797969594939291906133d7565b34801561073f575f5ffd5b5061034d61074e366004613444565b6112b7565b34801561075e575f5ffd5b50610767611386565b60405165ffffffffffff9091168152602001610327565b348015610789575f5ffd5b50606461034d565b34801561079c575f5ffd5b5061034d6107ab366004613490565b61140d565b3480156107bb575f5ffd5b5061034d611423565b3480156107cf575f5ffd5b5061031b6107de366004612c93565b505f90565b3480156107ee575f5ffd5b5061034d6107fd366004612c93565b5f9081526004602052604090206001015465ffffffffffff1690565b348015610824575f5ffd5b5061034d61143c565b348015610838575f5ffd5b506104116108473660046134e3565b63bc197c8160e01b95945050505050565b348015610863575f5ffd5b5061034d610872366004612c93565b611446565b6102f6610885366004613579565b611488565b348015610895575f5ffd5b5061034d6108a4366004612f88565b611504565b3480156108b4575f5ffd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e9082015261038e565b3480156108f9575f5ffd5b5061034d7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b34801561092c575f5ffd5b506102f661093b3660046135b7565b61153d565b34801561094b575f5ffd5b5061034d61095a3660046135da565b61154e565b34801561096a575f5ffd5b506102f6610979366004612c93565b61156d565b348015610989575f5ffd5b50610411610998366004613602565b63f23a6e6160e01b95945050505050565b3480156109b4575f5ffd5b5061034d6109c3366004612c93565b61157e565b3480156109d3575f5ffd5b507f000000000000000000000000bc100000000000000000000000000000000000016103cf565b5f6001600160e01b031982166332a2ad4360e11b1480610a2a57506001600160e01b03198216630271189760e51b145b80610a4557506301ffc9a760e01b6001600160e01b03198316145b92915050565b905090565b610a58611588565b610a61816115bf565b50565b606060038054610a7390613656565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90613656565b8015610aea5780601f10610ac157610100808354040283529160200191610aea565b820191905f5260205f20905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b5f5f610b0286868686611504565b9050610b1781610b126004611654565b611676565b505f604051634844252360e11b815260040160405180910390fd5b5095945050505050565b5f5f610b4a86868686611504565b9050610b6a81610b5a6005611654565b610b646004611654565b17611676565b505f81815260046020526040902080547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f01b17905530610bac3090565b6001600160a01b031614610c35575f5b8651811015610c3357306001600160a01b0316878281518110610be157610be161368e565b60200260200101516001600160a01b031603610c2b57610c2b858281518110610c0c57610c0c61368e565b60200260200101518051906020012060056116b390919063ffffffff16565b600101610bbc565b505b610c428187878787611726565b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b5f610a4b60085465ffffffffffff1690565b5f818152600460205260408120805460ff600160f01b8204811691600160f81b9004168115610cc557506007949350505050565b8015610cd657506002949350505050565b5f85815260046020526040812054600160a01b900465ffffffffffff169050805f03610d1d57604051636ad0607560e01b8152600481018790526024015b60405180910390fd5b5f610d26611386565b65ffffffffffff169050808210610d4357505f9695505050505050565b5f610d4d88611446565b9050818110610d6457506001979650505050505050565b610d6d886117fb565b1580610d8c57505f888152600960205260409020805460019091015411155b15610d9f57506003979650505050505050565b5f8881526004602052604090206001015465ffffffffffff165f03610dcc57506004979650505050505050565b506005979650505050505050565b5f5f610de886868686611504565b9050610df781610b125f611654565b505f818152600460205260409020546001600160a01b03163314610e305760405163233d98e360e01b8152336004820152602401610d14565b610e3c8686868661184b565b9695505050505050565b60607f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b0316634bf5d7e96040518163ffffffff1660e01b81526004015f60405180830381865afa925050508015610ec557506040513d5f823e601f3d908101601f19168201604052610ec291908101906136a2565b60015b610f01575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b5f80339050610f2584828560405180602001604052805f815250611912565b949350505050565b5f5f61100e876110087f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c610f808e6001600160a01b03165f90815260026020526040902080546001810190915590565b8d8d604051610f90929190613717565b60405180910390208c80519060200120604051602001610fed9796959493929190968752602087019590955260ff9390931660408601526001600160a01b03919091166060850152608084015260a083015260c082015260e00190565b6040516020818303038152906040528051906020012061193c565b85611968565b905080611039576040516394ab6c0760e01b81526001600160a01b0388166004820152602401610d14565b61107c89888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508b92506119d8915050565b9998505050505050505050565b5f803390506110d187828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92506119d8915050565b979650505050505050565b600a80545f9182906110ef60018461373a565b815481106110ff576110ff61368e565b5f918252602090912001805490915065ffffffffffff811690600160301b90046001600160d01b0316858211611141576001600160d01b031695945050505050565b61115561114d87611acb565b600a90611b01565b6001600160d01b03169695505050505050565b611170611588565b610a6181611bb0565b5f80339050610e3c86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061191292505050565b5f336111cb8184611c16565b6111f35760405163d9b3955760e01b81526001600160a01b0382166004820152602401610d14565b5f6111fc61143c565b90508015611268575f61122a836001611213611386565b61121d919061374d565b65ffffffffffff1661154e565b90508181101561126657604051636121770b60e11b81526001600160a01b03841660048201526024810182905260448101839052606401610d14565b505b6110d18787878786611d34565b5f6060805f5f5f6060611286611f8a565b61128e611fb6565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f611341846110087ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d789898961130a8b6001600160a01b03165f90815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff90911660608401526001600160a01b0316608083015260a082015260c001610fed565b90508061136c576040516394ab6c0760e01b81526001600160a01b0385166004820152602401610d14565b610e3c86858760405180602001604052805f815250611912565b5f7f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611401575060408051601f3d908101601f191682019092526113fe9181019061376b565b60015b610f0157610a4b611fe3565b5f611419848484611fed565b90505b9392505050565b5f61142e600a612080565b6001600160d01b0316905090565b5f610a4b60075490565b5f8181526004602052604081205461147a90600160d01b810463ffffffff1690600160a01b900465ffffffffffff16613786565b65ffffffffffff1692915050565b611490611588565b5f5f856001600160a01b03168585856040516114ad929190613717565b5f6040518083038185875af1925050503d805f81146114e7576040519150601f19603f3d011682016040523d82523d5f602084013e6114ec565b606091505b50915091506114fb82826120b7565b50505050505050565b5f8484848460405160200161151c9493929190613837565b60408051601f19818403018152919052805160209091012095945050505050565b611545611588565b610a61816120d3565b5f61141c838361156860408051602081019091525f815290565b611fed565b611575611588565b610a618161216f565b5f610a45826121b0565b3033146115aa576040516347096e4760e01b8152336004820152602401610d14565b565b806115b76005612257565b036115ac5750565b6064808211156115ec5760405163243e544560e01b81526004810183905260248101829052604401610d14565b5f6115f5611423565b9050611614611602611386565b61160b856122d6565b600a9190612309565b505060408051828152602081018590527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a1505050565b5f8160078111156116675761166761301e565b600160ff919091161b92915050565b5f5f61168184610c91565b90505f8361168e83611654565b160361141c578381846040516331b75e4d60e01b8152600401610d1493929190613881565b81546fffffffffffffffffffffffffffffffff600160801b8204811691811660018301909116036116e8576116e86041612323565b6fffffffffffffffffffffffffffffffff8082165f90815260018086016020526040909120939093558354919092018216600160801b029116179055565b5f5b84518110156117f3575f5f8683815181106117455761174561368e565b60200260200101516001600160a01b03168684815181106117685761176861368e565b60200260200101518685815181106117825761178261368e565b602002602001015160405161179791906138a3565b5f6040518083038185875af1925050503d805f81146117d1576040519150601f19603f3d011682016040523d82523d5f602084013e6117d6565b606091505b50915091506117e582826120b7565b505050806001019050611728565b505050505050565b5f8181526009602052604081206002810154600182015461181c91906138b9565b5f8481526004602052604090205461184290600160a01b900465ffffffffffff1661157e565b11159392505050565b5f5f61185986868686611504565b90506118a7816118696007611654565b6118736006611654565b61187d6002611654565b600161188a6007826138cc565b6118959060026139c0565b61189f919061373a565b181818611676565b505f818152600460205260409081902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610c6e9083815260200190565b5f6119338585858561192e60408051602081019091525f815290565b6119d8565b95945050505050565b5f610a45611948612334565b8360405161190160f01b8152600281019290925260228201526042902090565b5f836001600160a01b03163b5f036119c6575f5f611986858561245d565b5090925090505f81600381111561199f5761199f61301e565b1480156119bd5750856001600160a01b0316826001600160a01b0316145b9250505061141c565b6119d18484846124a6565b905061141c565b5f6119e786610b126001611654565b505f86815260046020526040812054611a11908790600160a01b900465ffffffffffff1685611fed565b90505f611a218888888588612591565b905083515f03611a7757866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051611a6a94939291906139ce565b60405180910390a26110d1565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051611ab89594939291906139f5565b60405180910390a2979650505050505050565b5f65ffffffffffff821115611afd576040516306dfcc6560e41b81526030600482015260248101839052604401610d14565b5090565b81545f9081816005811115611b5d575f611b1a8461268d565b611b24908561373a565b5f8881526020902090915081015465ffffffffffff9081169087161015611b4d57809150611b5b565b611b588160016138b9565b92505b505b5f611b6a878785856127e5565b90508015611ba457611b8e87611b8160018461373a565b5f91825260209091200190565b54600160301b90046001600160d01b03166110d1565b5f979650505050505050565b6008546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b80515f906034811015611c2d576001915050610a45565b828101601319015173ffffffffffffffffffffffffffffffffffffffff1981167f2370726f706f7365723d3078000000000000000000000000000000000000000014611c7e57600192505050610a45565b5f80611c8b60288561373a565b90505b83811015611d13575f5f611cd9888481518110611cad57611cad61368e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016612844565b9150915081611cf15760019650505050505050610a45565b8060ff166004856001600160a01b0316901b1793505050806001019050611c8e565b50856001600160a01b0316816001600160a01b031614935050505092915050565b5f611d488686868680519060200120611504565b905084518651141580611d5d57508351865114155b80611d6757508551155b15611d9c57855184518651604051630447b05d60e41b8152600481019390935260248301919091526044820152606401610d14565b5f81815260046020526040902054600160a01b900465ffffffffffff1615611de55780611dc882610c91565b6040516331b75e4d60e01b8152610d149291905f90600401613881565b5f611dee610c7f565b611df6611386565b65ffffffffffff16611e0891906138b9565b90505f611e2260085463ffffffff600160301b9091041690565b5f848152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716178155909150611e6183611acb565b815465ffffffffffff91909116600160a01b027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff909116178155611ea4826128d4565b815463ffffffff91909116600160d01b027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff90911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c9067ffffffffffffffff811115611f2057611f20612d00565b604051908082528060200260200182016040528015611f5357816020015b6060815260200190600190039081611f3e5790505b508c89611f608a826138b9565b8e604051611f7699989796959493929190613a3a565b60405180910390a150505095945050505050565b6060610a4b7f476f617444414f000000000000000000000000000000000000000000000000075f612904565b6060610a4b7f31000000000000000000000000000000000000000000000000000000000000016001612904565b5f610a4b43611acb565b5f7f000000000000000000000000bc10000000000000000000000000000000000001604051630748d63560e31b81526001600160a01b038681166004830152602482018690529190911690633a46b1a890604401602060405180830381865afa15801561205c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114199190613b14565b80545f9080156120af5761209983611b8160018461373a565b54600160301b90046001600160d01b031661141c565b5f9392505050565b6060826120cc576120c7826129ad565b610a45565b5080610a45565b8063ffffffff165f036120fb5760405163f1cfbf0560e01b81525f6004820152602401610d14565b6008546040805163ffffffff600160301b9093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a16008805463ffffffff909216600160301b0269ffffffff00000000000019909216919091179055565b60075460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600755565b5f60646121bc836110dc565b604051632394e7a360e21b8152600481018590526001600160a01b037f000000000000000000000000bc100000000000000000000000000000000000011690638e539e8c90602401602060405180830381865afa15801561221f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122439190613b14565b61224d9190613b2b565b610a459190613b56565b80545f906fffffffffffffffffffffffffffffffff80821691600160801b9004168103612288576122886031612323565b6fffffffffffffffffffffffffffffffff8181165f908152600185810160205260408220805492905585546fffffffffffffffffffffffffffffffff19169301909116919091179092555090565b5f6001600160d01b03821115611afd576040516306dfcc6560e41b815260d0600482015260248101839052604401610d14565b5f806123168585856129d6565b915091505b935093915050565b634e487b715f52806020526024601cfd5b5f306001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614801561238c57507f000000000000000000000000000000000000000000000000000000000000beaf46145b156123b657507f2f139c28f34b8858758b30158b970a80e002ce4752cb1788a55c2947cacb2a5090565b610a4b604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f7081057b801cf71f391bb13ad68bb1be4f896665916f118ed4c6811f09fe527c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f5f5f8351604103612494576020840151604085015160608601515f1a61248688828585612b26565b95509550955050505061249f565b505081515f91506002905b9250925092565b5f5f5f856001600160a01b031685856040516024016124c6929190613b75565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16630b135d3f60e11b1790525161251091906138a3565b5f60405180830381855afa9150503d805f8114612548576040519150601f19603f3d011682016040523d82523d5f602084013e61254d565b606091505b509150915081801561256157506020815110155b8015610e3c57508051630b135d3f60e11b906125869083016020908101908401613b14565b149695505050505050565b5f8581526009602090815260408083206001600160a01b03881684526003810190925282205460ff16156125e3576040516371c6af4960e01b81526001600160a01b0387166004820152602401610d14565b6001600160a01b0386165f9081526003820160205260409020805460ff1916600117905560ff851661262c5783815f015f82825461262191906138b9565b909155506126829050565b5f1960ff86160161264a5783816001015f82825461262191906138b9565b60011960ff8616016126695783816002015f82825461262191906138b9565b6040516303599be160e11b815260040160405180910390fd5b509195945050505050565b5f6001821161269a575090565b816001600160801b82106126b35760809190911c9060401b5b6801000000000000000082106126ce5760409190911c9060201b5b64010000000082106126e55760209190911c9060101b5b6201000082106126fa5760109190911c9060081b5b610100821061270e5760089190911c9060041b5b601082106127215760049190911c9060021b5b6004821061272d5760011b5b600302600190811c9081858161274557612745613b42565b048201901c9050600181858161275d5761275d613b42565b048201901c9050600181858161277557612775613b42565b048201901c9050600181858161278d5761278d613b42565b048201901c905060018185816127a5576127a5613b42565b048201901c905060018185816127bd576127bd613b42565b048201901c90506127dc8185816127d6576127d6613b42565b04821190565b90039392505050565b5f5b8183101561283c575f6127fa8484612bee565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561282857809250612836565b6128338160016138b9565b93505b506127e7565b509392505050565b5f8060f883901c602f8111801561285e5750603a8160ff16105b1561287357600194602f199091019350915050565b8060ff166040108015612889575060478160ff16105b1561289e576001946036199091019350915050565b8060ff1660601080156128b4575060678160ff16105b156128c9576001946056199091019350915050565b505f93849350915050565b5f63ffffffff821115611afd576040516306dfcc6560e41b81526020600482015260248101839052604401610d14565b606060ff831461291e5761291783612c08565b9050610a45565b81805461292a90613656565b80601f016020809104026020016040519081016040528092919081815260200182805461295690613656565b80156129a15780601f10612978576101008083540402835291602001916129a1565b820191905f5260205f20905b81548152906001019060200180831161298457829003601f168201915b50505050509050610a45565b8051156129bd5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b82545f9081908015612acc575f6129f287611b8160018561373a565b805490915065ffffffffffff80821691600160301b90046001600160d01b0316908816821115612a3557604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff1603612a6e57825465ffffffffffff16600160301b6001600160d01b03891602178355612abe565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f81529190912094519151909216600160301b029216919091179101555b945085935061231b92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a815291822095519251909316600160301b02919093161792019190915590508161231b565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115612b5f57505f91506003905082612be4565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015612bb0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612bdb57505f925060019150829050612be4565b92505f91508190505b9450945094915050565b5f612bfc6002848418613b56565b61141c908484166138b9565b60605f612c1483612c45565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f811115610a4557604051632cd44ac360e21b815260040160405180910390fd5b5f60208284031215612c7c575f5ffd5b81356001600160e01b03198116811461141c575f5ffd5b5f60208284031215612ca3575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61141c6020830184612caa565b80356001600160a01b0381168114610f01575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612d3d57612d3d612d00565b604052919050565b5f67ffffffffffffffff821115612d5e57612d5e612d00565b50601f01601f191660200190565b5f612d7e612d7984612d45565b612d14565b9050828152838383011115612d91575f5ffd5b828260208301375f602084830101529392505050565b5f82601f830112612db6575f5ffd5b61141c83833560208501612d6c565b5f5f5f5f60808587031215612dd8575f5ffd5b612de185612cea565b9350612def60208601612cea565b925060408501359150606085013567ffffffffffffffff811115612e11575f5ffd5b612e1d87828801612da7565b91505092959194509250565b5f67ffffffffffffffff821115612e4257612e42612d00565b5060051b60200190565b5f82601f830112612e5b575f5ffd5b8135612e69612d7982612e29565b8082825260208201915060208360051b860101925085831115612e8a575f5ffd5b602085015b83811015610b3257612ea081612cea565b835260209283019201612e8f565b5f82601f830112612ebd575f5ffd5b8135612ecb612d7982612e29565b8082825260208201915060208360051b860101925085831115612eec575f5ffd5b602085015b83811015610b32578035835260209283019201612ef1565b5f82601f830112612f18575f5ffd5b8135612f26612d7982612e29565b8082825260208201915060208360051b860101925085831115612f47575f5ffd5b602085015b83811015610b3257803567ffffffffffffffff811115612f6a575f5ffd5b612f79886020838a0101612da7565b84525060209283019201612f4c565b5f5f5f5f60808587031215612f9b575f5ffd5b843567ffffffffffffffff811115612fb1575f5ffd5b612fbd87828801612e4c565b945050602085013567ffffffffffffffff811115612fd9575f5ffd5b612fe587828801612eae565b935050604085013567ffffffffffffffff811115613001575f5ffd5b61300d87828801612f09565b949793965093946060013593505050565b634e487b7160e01b5f52602160045260245ffd5b6008811061304e57634e487b7160e01b5f52602160045260245ffd5b9052565b60208101610a458284613032565b5f5f60408385031215613071575f5ffd5b8235915061308160208401612cea565b90509250929050565b803560ff81168114610f01575f5ffd5b5f5f604083850312156130ab575f5ffd5b823591506130816020840161308a565b5f5f83601f8401126130cb575f5ffd5b50813567ffffffffffffffff8111156130e2575f5ffd5b6020830191508360208285010111156130f9575f5ffd5b9250929050565b5f5f5f5f5f5f5f60c0888a031215613116575f5ffd5b873596506131266020890161308a565b955061313460408901612cea565b9450606088013567ffffffffffffffff81111561314f575f5ffd5b61315b8a828b016130bb565b909550935050608088013567ffffffffffffffff81111561317a575f5ffd5b6131868a828b01612da7565b92505060a088013567ffffffffffffffff8111156131a2575f5ffd5b6131ae8a828b01612da7565b91505092959891949750929550565b5f5f5f5f5f608086880312156131d1575f5ffd5b853594506131e16020870161308a565b9350604086013567ffffffffffffffff8111156131fc575f5ffd5b613208888289016130bb565b909450925050606086013567ffffffffffffffff811115613227575f5ffd5b61323388828901612da7565b9150509295509295909350565b65ffffffffffff81168114610a61575f5ffd5b5f60208284031215613263575f5ffd5b813561141c81613240565b5f5f5f5f60608587031215613281575f5ffd5b843593506132916020860161308a565b9250604085013567ffffffffffffffff8111156132ac575f5ffd5b6132b8878288016130bb565b95989497509550505050565b5f5f5f5f608085870312156132d7575f5ffd5b843567ffffffffffffffff8111156132ed575f5ffd5b6132f987828801612e4c565b945050602085013567ffffffffffffffff811115613315575f5ffd5b61332187828801612eae565b935050604085013567ffffffffffffffff81111561333d575f5ffd5b61334987828801612f09565b925050606085013567ffffffffffffffff811115613365575f5ffd5b8501601f81018713613375575f5ffd5b612e1d87823560208401612d6c565b5f60208284031215613394575f5ffd5b61141c82612cea565b5f8151808452602084019350602083015f5b828110156133cd5781518652602095860195909101906001016133af565b5093949350505050565b60ff60f81b8816815260e060208201525f6133f560e0830189612caa565b82810360408401526134078189612caa565b90508660608401526001600160a01b03861660808401528460a084015282810360c0840152613436818561339d565b9a9950505050505050505050565b5f5f5f5f60808587031215613457575f5ffd5b843593506134676020860161308a565b925061347560408601612cea565b9150606085013567ffffffffffffffff811115612e11575f5ffd5b5f5f5f606084860312156134a2575f5ffd5b6134ab84612cea565b925060208401359150604084013567ffffffffffffffff8111156134cd575f5ffd5b6134d986828701612da7565b9150509250925092565b5f5f5f5f5f60a086880312156134f7575f5ffd5b61350086612cea565b945061350e60208701612cea565b9350604086013567ffffffffffffffff811115613529575f5ffd5b61353588828901612eae565b935050606086013567ffffffffffffffff811115613551575f5ffd5b61355d88828901612eae565b925050608086013567ffffffffffffffff811115613227575f5ffd5b5f5f5f5f6060858703121561358c575f5ffd5b61359585612cea565b935060208501359250604085013567ffffffffffffffff8111156132ac575f5ffd5b5f602082840312156135c7575f5ffd5b813563ffffffff8116811461141c575f5ffd5b5f5f604083850312156135eb575f5ffd5b6135f483612cea565b946020939093013593505050565b5f5f5f5f5f60a08688031215613616575f5ffd5b61361f86612cea565b945061362d60208701612cea565b93506040860135925060608601359150608086013567ffffffffffffffff811115613227575f5ffd5b600181811c9082168061366a57607f821691505b60208210810361368857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156136b2575f5ffd5b815167ffffffffffffffff8111156136c8575f5ffd5b8201601f810184136136d8575f5ffd5b80516136e6612d7982612d45565b8181528560208385010111156136fa575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4557610a45613726565b65ffffffffffff8281168282160390811115610a4557610a45613726565b5f6020828403121561377b575f5ffd5b815161141c81613240565b65ffffffffffff8181168382160190811115610a4557610a45613726565b5f8151808452602084019350602083015f5b828110156133cd5781516001600160a01b03168652602095860195909101906001016137b6565b5f82825180855260208501945060208160051b830101602085015f5b8381101561382b57601f19858403018852613815838351612caa565b60209889019890935091909101906001016137f9565b50909695505050505050565b608081525f61384960808301876137a4565b828103602084015261385b818761339d565b9050828103604084015261386f81866137dd565b91505082606083015295945050505050565b838152606081016138956020830185613032565b826040830152949350505050565b5f82518060208501845e5f920191825250919050565b80820180821115610a4557610a45613726565b60ff8181168382160190811115610a4557610a45613726565b6001815b600184111561231b5780850481111561390457613904613726565b600184161561391257908102905b60019390931c9280026138e9565b5f8261392e57506001610a45565b8161393a57505f610a45565b8160018114613950576002811461395a57613976565b6001915050610a45565b60ff84111561396b5761396b613726565b50506001821b610a45565b5060208310610133831016604e8410600b8410161715613999575081810a610a45565b6139a55f1984846138e5565b805f19048211156139b8576139b8613726565b029392505050565b5f61141c60ff841683613920565b84815260ff84166020820152826040820152608060608201525f610e3c6080830184612caa565b85815260ff8516602082015283604082015260a060608201525f613a1c60a0830185612caa565b8281036080840152613a2e8185612caa565b98975050505050505050565b8981526001600160a01b038916602082015261012060408201525f613a6361012083018a6137a4565b8281036060840152613a75818a61339d565b9050828103608084015280885180835260208301915060208160051b84010160208b015f5b83811015613acc57601f19868403018552613ab6838351612caa565b6020958601959093509190910190600101613a9a565b505085810360a0870152613ae0818b6137dd565b93505050508560c08401528460e0840152828103610100840152613b048185612caa565b9c9b505050505050505050505050565b5f60208284031215613b24575f5ffd5b5051919050565b8082028115828204841417610a4557610a45613726565b634e487b7160e01b5f52601260045260245ffd5b5f82613b7057634e487b7160e01b5f52601260045260245ffd5b500490565b828152604060208201525f6114196040830184612caa56fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x476f617444414f0000000000000000000000000000000000000000000000000e", + "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000093a80000000015180", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000000000000000000000000004000000000004" + } + } +} diff --git a/core/tracing/gen_balance_change_reason_stringer.go b/core/tracing/gen_balance_change_reason_stringer.go index d3a515a12d37b..02507b583b20f 100644 --- a/core/tracing/gen_balance_change_reason_stringer.go +++ b/core/tracing/gen_balance_change_reason_stringer.go @@ -23,15 +23,25 @@ func _() { _ = x[BalanceIncreaseSelfdestruct-12] _ = x[BalanceDecreaseSelfdestruct-13] _ = x[BalanceDecreaseSelfdestructBurn-14] + _ = x[BalanceGoatDepoist-200] } -const _BalanceChangeReason_name = "BalanceChangeUnspecifiedBalanceIncreaseRewardMineUncleBalanceIncreaseRewardMineBlockBalanceIncreaseWithdrawalBalanceIncreaseGenesisBalanceBalanceIncreaseRewardTransactionFeeBalanceDecreaseGasBuyBalanceIncreaseGasReturnBalanceIncreaseDaoContractBalanceDecreaseDaoAccountBalanceChangeTransferBalanceChangeTouchAccountBalanceIncreaseSelfdestructBalanceDecreaseSelfdestructBalanceDecreaseSelfdestructBurn" +const ( + _BalanceChangeReason_name_0 = "BalanceChangeUnspecifiedBalanceIncreaseRewardMineUncleBalanceIncreaseRewardMineBlockBalanceIncreaseWithdrawalBalanceIncreaseGenesisBalanceBalanceIncreaseRewardTransactionFeeBalanceDecreaseGasBuyBalanceIncreaseGasReturnBalanceIncreaseDaoContractBalanceDecreaseDaoAccountBalanceChangeTransferBalanceChangeTouchAccountBalanceIncreaseSelfdestructBalanceDecreaseSelfdestructBalanceDecreaseSelfdestructBurn" + _BalanceChangeReason_name_1 = "BalanceGoatDepoist" +) -var _BalanceChangeReason_index = [...]uint16{0, 24, 54, 84, 109, 138, 173, 194, 218, 244, 269, 290, 315, 342, 369, 400} +var ( + _BalanceChangeReason_index_0 = [...]uint16{0, 24, 54, 84, 109, 138, 173, 194, 218, 244, 269, 290, 315, 342, 369, 400} +) func (i BalanceChangeReason) String() string { - if i >= BalanceChangeReason(len(_BalanceChangeReason_index)-1) { + switch { + case i <= 14: + return _BalanceChangeReason_name_0[_BalanceChangeReason_index_0[i]:_BalanceChangeReason_index_0[i+1]] + case i == 200: + return _BalanceChangeReason_name_1 + default: return "BalanceChangeReason(" + strconv.FormatInt(int64(i), 10) + ")" } - return _BalanceChangeReason_name[_BalanceChangeReason_index[i]:_BalanceChangeReason_index[i+1]] } diff --git a/core/tracing/hooks.go b/core/tracing/hooks.go index 728f15069b75e..bce4714446c02 100644 --- a/core/tracing/hooks.go +++ b/core/tracing/hooks.go @@ -250,6 +250,9 @@ const ( // account within the same tx (captured at end of tx). // Note it doesn't account for a self-destruct which appoints itself as recipient. BalanceDecreaseSelfdestructBurn BalanceChangeReason = 14 + + // goat + BalanceGoatDepoist BalanceChangeReason = 200 ) // GasChangeReason is used to indicate the reason for a gas change, useful diff --git a/core/txpool/legacypool/legacypool.go b/core/txpool/legacypool/legacypool.go index 70be7034eea9a..17f172fc0005f 100644 --- a/core/txpool/legacypool/legacypool.go +++ b/core/txpool/legacypool/legacypool.go @@ -144,7 +144,8 @@ var DefaultConfig = Config{ Journal: "transactions.rlp", Rejournal: time.Hour, - PriceLimit: 1, + NoLocals: true, + PriceLimit: 1e5, PriceBump: 10, AccountSlots: 16, diff --git a/core/txpool/legacypool/legacypool_test.go b/core/txpool/legacypool/legacypool_test.go index 39673d176db96..c821ab99c13d4 100644 --- a/core/txpool/legacypool/legacypool_test.go +++ b/core/txpool/legacypool/legacypool_test.go @@ -54,6 +54,8 @@ var ( func init() { testTxPoolConfig = DefaultConfig testTxPoolConfig.Journal = "" + testTxPoolConfig.PriceLimit = 1 + testTxPoolConfig.NoLocals = false cpy := *params.TestChainConfig eip1559Config = &cpy diff --git a/core/txpool/validation.go b/core/txpool/validation.go index 33b383d5cf583..9fbd81c6cd2c9 100644 --- a/core/txpool/validation.go +++ b/core/txpool/validation.go @@ -59,6 +59,10 @@ type ValidationFunction func(tx *types.Transaction, head *types.Header, signer t // This check is public to allow different transaction pools to check the basic // rules without duplicating code and running the risk of missed updates. func ValidateTransaction(tx *types.Transaction, head *types.Header, signer types.Signer, opts *ValidationOptions) error { + if opts.Config.Goat != nil && !tx.IsMemPoolTx() { + return core.ErrTxTypeNotSupported + } + // Ensure transactions not implemented by the calling pool are rejected if opts.Accept&(1< 0 { + data := []byte{WithdrawalRequestType} + for i := range l { + data = append(data, reqs.Withdraws[i].Encode()...) + } + res = append(res, data) + } + + if l := len(reqs.ReplaceByFees); l > 0 { + data := []byte{ReplaceByFeeRequestType} + for i := range l { + data = append(data, reqs.ReplaceByFees[i].Encode()...) + } + res = append(res, data) + } + + if l := len(reqs.Cancel1s); l > 0 { + data := []byte{Cancel1RequestType} + for i := range l { + data = append(data, reqs.Cancel1s[i].Encode()...) + } + res = append(res, data) + } + + if l := len(reqs.DepositTax); l > 0 { + data := []byte{DepositTaxRequestType} + for i := range l { + data = append(data, reqs.DepositTax[i].Encode()...) + } + res = append(res, data) + } + + if l := len(reqs.Confirmation); l > 0 { + data := []byte{ConfirmationNumberRequestType} + for i := range l { + data = append(data, reqs.Confirmation[i].Encode()...) + } + res = append(res, data) + } + + if l := len(reqs.MinDeposit); l > 0 { + data := []byte{MinDepositRequestType} + for i := range l { + data = append(data, reqs.MinDeposit[i].Encode()...) + } + res = append(res, data) + } + return res +} + +type WithdrawalRequest struct { + Id uint64 + Amount uint64 + TxPrice uint64 + Address string +} + +var ( + withdrawalReqAddrLoc = big.NewInt(128) + satoshi = big.NewInt(1e10) + maxTaxRate = big.NewInt(1e4) +) + +func UnpackIntoWithdrawRequest(topics []common.Hash, data []byte) (*WithdrawalRequest, error) { + if len(topics) != 3 { + return nil, fmt.Errorf("invalid Withdraw event topics length: expect 3 got %d", len(topics)) + } + + if dl := len(data); dl < 192 || dl%32 != 0 { + return nil, fmt.Errorf("invalid Withdraw event data length: %d", len(data)) + } + + id := new(big.Int).SetBytes(topics[1][:]) + if !id.IsUint64() { + return nil, fmt.Errorf("withdrawal id is too large") + } + + amount := new(big.Int).SetBytes(data[:32]) // amount + _, dust := amount.DivMod(amount, satoshi, new(big.Int)) + if !amount.IsUint64() { + return nil, fmt.Errorf("withdrawal amount is too large: %d", amount) + } + + if dust.Sign() != 0 { + return nil, fmt.Errorf("withdrawal amount has dust: %d", dust) + } + + maxTxPrice := new(big.Int).SetBytes(data[64:96]) + if !maxTxPrice.IsUint64() { + return nil, fmt.Errorf("max tx price is too large: %d", maxTxPrice) + } + + // receiver + if addrLoc := new(big.Int).SetBytes(data[96:128]); addrLoc.Cmp(withdrawalReqAddrLoc) != 0 { + return nil, fmt.Errorf("address location in the withdraw event should be 128 but goat %d", addrLoc) + } + + addrLen := new(big.Int).SetBytes(data[128:160]) // length + addrLenInt64 := addrLen.Int64() + if addrLenInt64 > 90 { + return nil, errors.New("address length too large") + } + if int64(len(data[160:])) < addrLenInt64 { + return nil, errors.New("address slice is out of range") + } + + return &WithdrawalRequest{ + Id: id.Uint64(), + Amount: amount.Uint64(), + TxPrice: maxTxPrice.Uint64(), + Address: string(data[160 : 160+addrLenInt64]), + }, nil +} + +func (req *WithdrawalRequest) RequestType() byte { + return WithdrawalRequestType +} + +func (req *WithdrawalRequest) Encode() []byte { + buf := bytes.NewBuffer(nil) + buf.Write(EncodeUint64(req.Id, req.Amount, req.TxPrice)) + buf.WriteByte(byte(len(req.Address))) // max length is 90 + buf.WriteString(req.Address) + return buf.Bytes() +} + +func (req *WithdrawalRequest) Decode(input []byte) error { + if len(input) < 26 { + return errors.New("WithdrawalRequest bytes length too short") + } + + res, err := DecodeUint64(input[:24], 3) + if err != nil { + return err + } + req.Id, req.Amount, req.TxPrice = res[0], res[1], res[2] + + if addrLength := int(input[24]); len(input[25:]) != addrLength { + return errors.New("invalid WithdrawalRequest length") + } + req.Address = string(input[25:]) + return nil +} + +func (req *WithdrawalRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 25) + if _, err := reader.Read(input); err != nil { + return err + } + res, err := DecodeUint64(input[:24], 3) + if err != nil { + return err + } + req.Id, req.Amount, req.TxPrice = res[0], res[1], res[2] + + address := make([]byte, input[24]) + if _, err := reader.Read(address); err != nil { + return err + } + req.Address = string(address) + return nil +} + +func (req *WithdrawalRequest) Copy() Request { + return &WithdrawalRequest{ + Id: req.Id, + Amount: req.Amount, + TxPrice: req.TxPrice, + Address: req.Address, + } +} + +type ReplaceByFeeRequest struct { + Id uint64 + TxPrice uint64 +} + +func UnpackIntoReplaceByFeeRequest(topics []common.Hash, data []byte) (*ReplaceByFeeRequest, error) { + if len(topics) != 2 { + return nil, fmt.Errorf("invalid ReplaceByFee event topics length: expect 3 got %d", len(topics)) + } + + if len(data) != 32 { + return nil, fmt.Errorf("invalid ReplaceByFee event data length: %d", len(data)) + } + + id := new(big.Int).SetBytes(topics[1][:]) + if !id.IsUint64() { + return nil, fmt.Errorf("withdrawal id is too large") + } + + txPrice := new(big.Int).SetBytes(data) // maxTxPrice + if !txPrice.IsUint64() { + return nil, fmt.Errorf("max tx price is too large") + } + return &ReplaceByFeeRequest{Id: id.Uint64(), TxPrice: txPrice.Uint64()}, nil +} + +func (req *ReplaceByFeeRequest) RequestType() byte { return ReplaceByFeeRequestType } +func (req *ReplaceByFeeRequest) Encode() []byte { + return EncodeUint64(req.Id, req.TxPrice) +} + +func (req *ReplaceByFeeRequest) Decode(input []byte) error { + if len(input) != 16 { + return errors.New("invalid ReplaceByFeeRequest bytes length") + } + + res, err := DecodeUint64(input[:], 2) + if err != nil { + return err + } + req.Id, req.TxPrice = res[0], res[1] + return nil +} + +func (req *ReplaceByFeeRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 16) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *ReplaceByFeeRequest) Copy() Request { + return &ReplaceByFeeRequest{ + Id: req.Id, + TxPrice: req.TxPrice, + } +} + +type Cancel1Request struct { + Id uint64 +} + +func UnpackIntoCancel1Request(topics []common.Hash, data []byte) (*Cancel1Request, error) { + if len(topics) != 2 { + return nil, fmt.Errorf("invalid Cancel1 event topics length: expect 2 got %d", len(topics)) + } + + if len(data) != 0 { + return nil, fmt.Errorf("invalid Cancel1 event data length, expect 0 got %d", len(data)) + } + + id := new(big.Int).SetBytes(topics[1][:]) + if !id.IsUint64() { + return nil, fmt.Errorf("withdrawal id is too large") + } + return &Cancel1Request{Id: id.Uint64()}, nil +} + +func (req *Cancel1Request) RequestType() byte { return Cancel1RequestType } +func (req *Cancel1Request) Encode() []byte { + return EncodeUint64(req.Id) +} +func (req *Cancel1Request) Decode(input []byte) error { + if len(input) != 8 { + return errors.New("invalid Cancel1 bytes length") + } + + res, err := DecodeUint64(input, 1) + if err != nil { + return err + } + req.Id = res[0] + return nil +} + +func (req *Cancel1Request) DecodeReader(reader io.Reader) error { + input := make([]byte, 8) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *Cancel1Request) Copy() Request { + return &Cancel1Request{ + Id: req.Id, + } +} + +type DepositTaxRequest struct { + Rate uint64 + Max uint64 +} + +func UnpackIntoDepositTaxRequest(data []byte) (*DepositTaxRequest, error) { + if len(data) != 64 { + return nil, fmt.Errorf("invalid DepositTaxRequest event data length: %d", len(data)) + } + rate := new(big.Int).SetBytes(data[:32]) + if rate.Cmp(maxTaxRate) > 0 { + return nil, fmt.Errorf("deposit tax rate is too large") + } + + max := new(big.Int).SetBytes(data[32:]) + _, dust := max.DivMod(max, satoshi, new(big.Int)) + if !max.IsUint64() { + return nil, fmt.Errorf("maxDepositTax is too large: %d", max) + } + if dust.Sign() != 0 { + return nil, fmt.Errorf("maxDepositTax has dust: %d", dust) + } + + return &DepositTaxRequest{Rate: rate.Uint64(), Max: max.Uint64()}, nil +} + +func (req *DepositTaxRequest) RequestType() byte { return DepositTaxRequestType } +func (req *DepositTaxRequest) Encode() []byte { + return EncodeUint64(req.Rate, req.Max) +} + +func (req *DepositTaxRequest) Decode(input []byte) error { + if len(input) != 16 { + return errors.New("invalid DepositTaxRequest bytes length") + } + res, err := DecodeUint64(input[:], 2) + if err != nil { + return err + } + req.Rate = res[0] + req.Max = res[1] + return nil +} + +func (req *DepositTaxRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 16) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *DepositTaxRequest) Copy() Request { + return &DepositTaxRequest{ + Rate: req.Rate, + Max: req.Max, + } +} + +type ConfirmationNumberRequest struct { + Number uint64 +} + +func UnpackIntoConfirmationNumberRequest(data []byte) (*ConfirmationNumberRequest, error) { + if len(data) != 32 { + return nil, fmt.Errorf("invalid ConfirmationNumberRequest event data length: %d", len(data)) + } + number := new(big.Int).SetBytes(data) + if !number.IsUint64() { + return nil, fmt.Errorf("confirmation number is too large") + } + return &ConfirmationNumberRequest{Number: number.Uint64()}, nil +} + +func (req *ConfirmationNumberRequest) RequestType() byte { return ConfirmationNumberRequestType } +func (req *ConfirmationNumberRequest) Encode() []byte { + return EncodeUint64(req.Number) +} + +func (req *ConfirmationNumberRequest) Decode(input []byte) error { + if len(input) != 8 { + return errors.New("invalid ConfirmationNumberRequest bytes length") + } + res, err := DecodeUint64(input[:], 1) + if err != nil { + return err + } + req.Number = res[0] + return nil +} + +func (req *ConfirmationNumberRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 8) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *ConfirmationNumberRequest) Copy() Request { + return &ConfirmationNumberRequest{ + Number: req.Number, + } +} + +type MinDepositRequest struct { + Satoshi uint64 +} + +func UnpackIntoMinDepositRequest(data []byte) (*MinDepositRequest, error) { + if len(data) != 32 { + return nil, fmt.Errorf("invalid MinDepositRequest event data length: %d", len(data)) + } + amount := new(big.Int).SetBytes(data) + _, dust := amount.DivMod(amount, satoshi, new(big.Int)) + if dust.Sign() != 0 { + return nil, fmt.Errorf("min deposit amount has dust: %d", dust) + } + if !amount.IsUint64() { + return nil, fmt.Errorf("min deposit value is too large") + } + return &MinDepositRequest{Satoshi: amount.Uint64()}, nil +} + +func (req *MinDepositRequest) RequestType() byte { return MinDepositRequestType } +func (req *MinDepositRequest) Encode() []byte { + return EncodeUint64(req.Satoshi) +} + +func (req *MinDepositRequest) Decode(input []byte) error { + if len(input) != 8 { + return errors.New("invalid MinDepositRequest bytes length") + } + res, err := DecodeUint64(input[:], 1) + if err != nil { + return err + } + req.Satoshi = res[0] + return nil +} + +func (req *MinDepositRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 8) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *MinDepositRequest) Copy() Request { + return &MinDepositRequest{ + Satoshi: req.Satoshi, + } +} diff --git a/core/types/goattypes/req_bridge_test.go b/core/types/goattypes/req_bridge_test.go new file mode 100644 index 0000000000000..7c58891af55ae --- /dev/null +++ b/core/types/goattypes/req_bridge_test.go @@ -0,0 +1,502 @@ +package goattypes + +import ( + "bytes" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestUnpackIntoWithdrawRequest(t *testing.T) { + type args struct { + topics []common.Hash + data []byte + } + tests := []struct { + name string + args args + want *WithdrawalRequest + wantErr bool + }{ + { + name: "1", + args: args{ + topics: []common.Hash{ + common.HexToHash("0xbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000064"), + common.HexToHash("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"), + }, + data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000003e62633171656e356b76336330657064397966717675327130353971736a7077753968646a797778327639703570396c386d73786e383866733979356b78360000"), + }, + want: &WithdrawalRequest{ + Id: 100, + Amount: 10, + TxPrice: 1, + Address: "bc1qen5kv3c0epd9yfqvu2q059qsjpwu9hdjywx2v9p5p9l8msxn88fs9y5kx6", + }, + }, + { + name: "2", + args: args{ + topics: []common.Hash{ + common.HexToHash("0xbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001"), + common.HexToHash("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"), + }, + data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000002e90edd00000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002a626331716d76733230387765336a67376867637a686c683765397566773033346b666d3276777376676500000000000000000000000000000000000000000000"), + }, + want: &WithdrawalRequest{ + Id: 1, + Amount: 20, + TxPrice: 10, + Address: "bc1qmvs208we3jg7hgczhlh7e9ufw034kfm2vwsvge", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoWithdrawRequest(tt.args.topics, tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoWithdrawRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoWithdrawRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoWithdrawRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != WithdrawalRequestType { + t.Errorf("UnpackIntoWithdrawRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(WithdrawalRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoWithdrawRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoWithdrawRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(WithdrawalRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoWithdrawRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoWithdrawRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte("Withdraw(uint256,address,uint256,uint256,uint16,string)"))) + if eventTopic != WithdrawEventTopic { + t.Errorf("invalid WithdrawalRequestType event topic") + } + }) + } +} + +func TestUnpackIntoReplaceByFeeRequest(t *testing.T) { + type args struct { + topics []common.Hash + data []byte + } + tests := []struct { + name string + args args + want *ReplaceByFeeRequest + wantErr bool + }{ + { + name: "1", + args: args{ + topics: []common.Hash{ + common.HexToHash("0x19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001"), + }, + data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000014"), + }, + want: &ReplaceByFeeRequest{ + Id: 1, + TxPrice: 20, + }, + wantErr: false, + }, + { + name: "2", + args: args{ + topics: []common.Hash{ + common.HexToHash("0x19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000002"), + }, + data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000a"), + }, + want: &ReplaceByFeeRequest{ + Id: 2, + TxPrice: 10, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoReplaceByFeeRequest(tt.args.topics, tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoReplaceByFeeRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoReplaceByFeeRequest() = %v, want %v", got, tt.want) + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoWithdrawRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != ReplaceByFeeRequestType { + t.Errorf("UnpackIntoReplaceByFeeRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(ReplaceByFeeRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoReplaceByFeeRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoReplaceByFeeRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(ReplaceByFeeRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoReplaceByFeeRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoReplaceByFeeRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte("RBF(uint256,uint16)"))) + if eventTopic != ReplaceByFeeEventTopic { + t.Errorf("invalid ReplaceByFeeRequest event topic") + } + }) + } +} + +func TestUnpackIntoCancel1Request(t *testing.T) { + type args struct { + topics []common.Hash + data []byte + } + tests := []struct { + name string + args args + want *Cancel1Request + wantErr bool + }{ + { + name: "1", + args: args{ + topics: []common.Hash{ + common.HexToHash("0x0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000001"), + }, + }, + want: &Cancel1Request{ + Id: 1, + }, + wantErr: false, + }, + { + name: "2", + args: args{ + topics: []common.Hash{ + common.HexToHash("0x0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c"), + common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000002"), + }, + }, + want: &Cancel1Request{ + Id: 2, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoCancel1Request(tt.args.topics, tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoCancel1Request() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoCancel1Request() = %v, want %v", got, tt.want) + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoWithdrawRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != Cancel1RequestType { + t.Errorf("UnpackIntoCancel1Request() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(Cancel1Request) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoCancel1Request(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoCancel1Request(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(Cancel1Request) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoCancel1Request(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoCancel1Request(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte("Canceling(uint256)"))) + if eventTopic != Cancel1EventTopic { + t.Errorf("invalid Cancel1Request event topic") + } + }) + } +} + +func TestUnpackIntoDepositTaxRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *DepositTaxRequest + wantErr bool + }{ + { + name: "1", + args: args{ + data: hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000005af3107a4000"), + }, + want: &DepositTaxRequest{Rate: 2, Max: 10000}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoDepositTaxRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoDepositTaxRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoDepositTaxRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoDepositTaxRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != DepositTaxRequestType { + t.Errorf("UnpackIntoDepositTaxRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(DepositTaxRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoDepositTaxRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoDepositTaxRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(DepositTaxRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoDepositTaxRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoDepositTaxRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte("DepositTaxUpdated(uint16,uint64)"))) + if eventTopic != UpdateDepositTaxEventTopic { + t.Errorf("invalid DepositTaxRequestType event topic") + } + }) + } +} + +func TestUnpackIntoConfirmationNumberRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *ConfirmationNumberRequest + wantErr bool + }{ + { + name: "1", + args: args{ + data: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000006"), + }, + want: &ConfirmationNumberRequest{Number: 6}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoConfirmationNumberRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoConfirmationNumberRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoConfirmationNumberRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoConfirmationNumberRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != ConfirmationNumberRequestType { + t.Errorf("UnpackIntoConfirmationNumberRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(ConfirmationNumberRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoConfirmationNumberRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoConfirmationNumberRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(ConfirmationNumberRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoConfirmationNumberRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoConfirmationNumberRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte("ConfirmationNumberUpdated(uint16)"))) + if eventTopic != ConfirmationNumberEventTopic { + t.Errorf("invalid ConfirmationNumberRequestType event topic") + } + }) + } +} + +func TestUnpackIntoMinDepositRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *MinDepositRequest + wantErr bool + }{ + { + name: "1", + args: args{ + data: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000005af3107a4000"), + }, + want: &MinDepositRequest{Satoshi: 1e4}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoMinDepositRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoMinDepositRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoMinDepositRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoMinDepositRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != MinDepositRequestType { + t.Errorf("UnpackIntoMinDepositRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(MinDepositRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoMinDepositRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoMinDepositRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(MinDepositRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoMinDepositRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoMinDepositRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte("MinDepositUpdated(uint64)"))) + if eventTopic != UpdateMinDepositEventTopic { + t.Errorf("invalid MinDepositRequestType event topic") + } + }) + } +} diff --git a/core/types/goattypes/req_locking.go b/core/types/goattypes/req_locking.go new file mode 100644 index 0000000000000..b376905703d02 --- /dev/null +++ b/core/types/goattypes/req_locking.go @@ -0,0 +1,502 @@ +package goattypes + +import ( + "errors" + "fmt" + "io" + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +type LockingRequests struct { + Gas []*GasRequest + Creates []*CreateRequest + Locks []*LockRequest + Unlocks []*UnlockRequest + Claims []*ClaimRequest + Grants []*GrantRequest + UpdateWeights []*UpdateTokenWeightRequest + UpdateThresholds []*UpdateTokenThresholdRequest +} + +func (reqs *LockingRequests) Encode() (res [][]byte) { + if l := len(reqs.Gas); l > 0 { + gas := []byte{GasRequestType} + for i := range l { + gas = append(gas, reqs.Gas[i].Encode()...) + } + res = append(res, gas) + } + + if l := len(reqs.Creates); l > 0 { + creates := []byte{CreateRequestType} + for i := range l { + creates = append(creates, reqs.Creates[i].Encode()...) + } + res = append(res, creates) + } + + if l := len(reqs.Locks); l > 0 { + locks := []byte{LockRequestType} + for i := range l { + locks = append(locks, reqs.Locks[i].Encode()...) + } + res = append(res, locks) + } + + if l := len(reqs.Unlocks); l > 0 { + unlocks := []byte{UnlockRequestType} + for i := range l { + unlocks = append(unlocks, reqs.Unlocks[i].Encode()...) + } + res = append(res, unlocks) + } + + if l := len(reqs.Claims); l > 0 { + claims := []byte{ClaimRequestType} + for i := range l { + claims = append(claims, reqs.Claims[i].Encode()...) + } + res = append(res, claims) + } + + if l := len(reqs.Grants); l > 0 { + grants := []byte{GrantRequestType} + for i := range l { + grants = append(grants, reqs.Grants[i].Encode()...) + } + res = append(res, grants) + } + + if l := len(reqs.UpdateWeights); l > 0 { + weights := []byte{UpdateTokenWeightRequestType} + for i := range l { + weights = append(weights, reqs.UpdateWeights[i].Encode()...) + } + res = append(res, weights) + } + + if l := len(reqs.UpdateThresholds); l > 0 { + thresholds := []byte{UpdateTokenThresholdRequestType} + for i := range l { + thresholds = append(thresholds, reqs.UpdateThresholds[i].Encode()...) + } + res = append(res, thresholds) + } + + return res +} + +type GasRequest struct { + Height uint64 + Amount *big.Int +} + +func NewGasRequest(height uint64, amount *big.Int) *GasRequest { + return &GasRequest{Height: height, Amount: new(big.Int).Set(amount)} +} + +func (req *GasRequest) RequestType() byte { return GasRequestType } + +func (req *GasRequest) Encode() []byte { + res := make([]byte, 0, 40) + res = append(res, EncodeUint64(req.Height)...) + res = append(res, req.Amount.FillBytes(make([]byte, 32))...) + return res +} + +func (req *GasRequest) Decode(input []byte) error { + if len(input) != 40 { + return errors.New("invalid GasRequest bytes length") + } + + res, err := DecodeUint64(input[:8], 1) + if err != nil { + return err + } + req.Height = res[0] + + req.Amount = new(big.Int).SetBytes(input[8:]) + return nil +} + +func (req *GasRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 40) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *GasRequest) Copy() Request { + return &GasRequest{ + Height: req.Height, + Amount: new(big.Int).Set(req.Amount), + } +} + +type CreateRequest struct { + Validator common.Address + Pubkey [64]byte +} + +func UnpackIntoCreateRequest(data []byte) (*CreateRequest, error) { + if len(data) != 128 { + return nil, fmt.Errorf("invalid CreateValidator event data length: want 128, have %d", len(data)) + } + return &CreateRequest{Validator: common.BytesToAddress(data[:32]), Pubkey: [64]byte(data[64:])}, nil +} + +func (req *CreateRequest) RequestType() byte { return CreateRequestType } +func (req *CreateRequest) Encode() []byte { + res := make([]byte, 0, 84) + res = append(res, req.Validator.Bytes()...) + res = append(res, req.Pubkey[:]...) + return res +} + +func (req *CreateRequest) Decode(input []byte) error { + if len(input) != 84 { + return errors.New("invalid CreateRequest bytes length") + } + req.Validator = common.BytesToAddress(input[:20]) + req.Pubkey = [64]byte(input[20:]) + return nil +} + +func (req *CreateRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 84) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *CreateRequest) Copy() Request { + return &CreateRequest{ + Validator: req.Validator, + Pubkey: req.Pubkey, + } +} + +type LockRequest struct { + Validator common.Address + Token common.Address + Amount *big.Int +} + +func (req *LockRequest) RequestType() byte { return LockRequestType } +func (req *LockRequest) Encode() []byte { + res := make([]byte, 0, 72) + res = append(res, req.Validator.Bytes()...) + res = append(res, req.Token.Bytes()...) + res = append(res, req.Amount.FillBytes(make([]byte, 32))...) + return res +} + +func (req *LockRequest) Decode(input []byte) error { + if len(input) != 72 { + return errors.New("invalid LockRequest bytes length") + } + + req.Validator = common.BytesToAddress(input[:20]) + input = input[20:] + req.Token = common.BytesToAddress(input[:20]) + req.Amount = new(big.Int).SetBytes(input[20:]) + return nil +} + +func (req *LockRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 72) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *LockRequest) Copy() Request { + return &LockRequest{ + Validator: req.Validator, + Token: req.Token, + Amount: new(big.Int).Set(req.Amount), + } +} + +func UnpackIntoLockRequest(data []byte) (*LockRequest, error) { + if len(data) != 96 { + return nil, fmt.Errorf("invalid Lock event data length: want 96, have %d", len(data)) + } + return &LockRequest{ + Validator: common.BytesToAddress(data[:32]), + Token: common.BytesToAddress(data[32:64]), + Amount: new(big.Int).SetBytes(data[64:]), + }, nil +} + +type UnlockRequest struct { + Id uint64 + Validator common.Address + Recipient common.Address + Token common.Address + Amount *big.Int +} + +func UnpackIntoUnlockRequest(data []byte) (*UnlockRequest, error) { + if len(data) != 160 { + return nil, fmt.Errorf("invalid Unlock event data length: want 160, have %d", len(data)) + } + return &UnlockRequest{ + Id: new(big.Int).SetBytes(data[:32]).Uint64(), + Validator: common.BytesToAddress(data[32:64]), + Recipient: common.BytesToAddress(data[64:96]), + Token: common.BytesToAddress(data[96:128]), + Amount: new(big.Int).SetBytes(data[128:160]), + }, nil +} + +func (req *UnlockRequest) RequestType() byte { return UnlockRequestType } +func (req *UnlockRequest) Encode() []byte { + res := make([]byte, 0, 100) + res = append(res, EncodeUint64(req.Id)...) + res = append(res, req.Validator.Bytes()...) + res = append(res, req.Recipient.Bytes()...) + res = append(res, req.Token.Bytes()...) + res = append(res, req.Amount.FillBytes(make([]byte, 32))...) + return res +} + +func (req *UnlockRequest) Decode(input []byte) error { + if len(input) != 100 { + return errors.New("invalid UnlockRequest bytes length") + } + + res, err := DecodeUint64(input[:8], 1) + if err != nil { + return err + } + req.Id = res[0] + + input = input[8:] + req.Validator = common.BytesToAddress(input[:20]) + input = input[20:] + req.Recipient = common.BytesToAddress(input[:20]) + input = input[20:] + req.Token = common.BytesToAddress(input[:20]) + req.Amount = new(big.Int).SetBytes(input[20:]) + return nil +} + +func (req *UnlockRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 100) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *UnlockRequest) Copy() Request { + return &UnlockRequest{ + Id: req.Id, + Validator: req.Validator, + Token: req.Token, + Recipient: req.Recipient, + Amount: new(big.Int).Set(req.Amount), + } +} + +type ClaimRequest struct { + Id uint64 + Validator common.Address + Recipient common.Address +} + +func (req *ClaimRequest) RequestType() byte { return ClaimRequestType } +func (req *ClaimRequest) Encode() []byte { + res := make([]byte, 0, 48) + res = append(res, EncodeUint64(req.Id)...) + res = append(res, req.Validator.Bytes()...) + res = append(res, req.Recipient.Bytes()...) + return res +} + +func (req *ClaimRequest) Decode(input []byte) error { + if len(input) != 48 { + return errors.New("invalid UnlockRequest bytes length") + } + res, err := DecodeUint64(input[:8], 1) + if err != nil { + return err + } + req.Id = res[0] + + input = input[8:] + req.Validator = common.BytesToAddress(input[:20]) + req.Recipient = common.BytesToAddress(input[20:]) + return nil +} + +func (req *ClaimRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 48) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *ClaimRequest) Copy() Request { + return &ClaimRequest{ + Id: req.Id, + Validator: req.Validator, + Recipient: req.Recipient, + } +} + +func UnpackIntoClaimRequest(data []byte) (*ClaimRequest, error) { + if len(data) != 96 { + return nil, fmt.Errorf("GoatRewardClaim wrong length: want 96, have %d", len(data)) + } + return &ClaimRequest{ + Id: new(big.Int).SetBytes(data[:32]).Uint64(), + Validator: common.BytesToAddress(data[32:64]), + Recipient: common.BytesToAddress(data[64:96]), + }, nil +} + +type UpdateTokenWeightRequest struct { + Token common.Address + Weight uint64 +} + +func UnpackIntoUpdateTokenWeightRequest(data []byte) (*UpdateTokenWeightRequest, error) { + if len(data) != 64 { + return nil, fmt.Errorf("UpdateTokenWeight wrong length: want 64, have %d", len(data)) + } + return &UpdateTokenWeightRequest{ + Token: common.BytesToAddress(data[:32]), + Weight: new(big.Int).SetBytes(data[32:64]).Uint64(), + }, nil +} + +func (req *UpdateTokenWeightRequest) RequestType() byte { return UpdateTokenWeightRequestType } +func (req *UpdateTokenWeightRequest) Encode() []byte { + res := make([]byte, 0, 28) + res = append(res, req.Token.Bytes()...) + res = append(res, EncodeUint64(req.Weight)...) + return res +} + +func (req *UpdateTokenWeightRequest) Decode(input []byte) error { + if len(input) != 28 { + return errors.New("invalid UpdateTokenWeightRequest bytes length") + } + + req.Token = common.BytesToAddress(input[:20]) + res, err := DecodeUint64(input[20:], 1) + if err != nil { + return err + } + req.Weight = res[0] + return nil +} + +func (req *UpdateTokenWeightRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 28) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *UpdateTokenWeightRequest) Copy() Request { + return &UpdateTokenWeightRequest{ + Token: req.Token, + Weight: req.Weight, + } +} + +type UpdateTokenThresholdRequest struct { + Token common.Address + Threshold *big.Int +} + +func UnpackIntoUpdateTokenThresholdRequest(data []byte) (*UpdateTokenThresholdRequest, error) { + if len(data) != 64 { + return nil, fmt.Errorf("invalid UpdateTokenThreshold event data length: want 64, have %d", len(data)) + } + return &UpdateTokenThresholdRequest{ + Token: common.BytesToAddress(data[:32]), + Threshold: new(big.Int).SetBytes(data[32:64]), + }, nil +} + +func (req *UpdateTokenThresholdRequest) RequestType() byte { return UpdateTokenThresholdRequestType } +func (req *UpdateTokenThresholdRequest) Encode() []byte { + res := make([]byte, 0, 52) + res = append(res, req.Token.Bytes()...) + res = append(res, req.Threshold.FillBytes(make([]byte, 32))...) + return res +} + +func (req *UpdateTokenThresholdRequest) Decode(input []byte) error { + if len(input) != 52 { + return errors.New("invalid UpdateTokenThresholdRequest bytes length") + } + req.Token = common.BytesToAddress(input[:20]) + req.Threshold = new(big.Int).SetBytes(input[20:]) + return nil +} + +func (req *UpdateTokenThresholdRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 52) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *UpdateTokenThresholdRequest) Copy() Request { + return &UpdateTokenThresholdRequest{ + Token: req.Token, + Threshold: new(big.Int).Set(req.Threshold), + } +} + +type GrantRequest struct { + Amount *big.Int +} + +func UnpackIntoGrantRequest(data []byte) (*GrantRequest, error) { + if len(data) != 32 { + return nil, fmt.Errorf("invalid GoatGrant event data length: want 32, have %d", len(data)) + } + return &GrantRequest{Amount: new(big.Int).SetBytes(data[:])}, nil +} + +func (req *GrantRequest) RequestType() byte { return GrantRequestType } + +func (req *GrantRequest) Encode() []byte { + return req.Amount.FillBytes(make([]byte, 32)) +} + +func (req *GrantRequest) Decode(input []byte) error { + if len(input) != 32 { + return errors.New("invalid UpdateTokenThresholdRequest bytes length") + } + req.Amount = new(big.Int).SetBytes(input[1:]) + return nil +} + +func (req *GrantRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 32) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *GrantRequest) Copy() Request { + return &GrantRequest{ + Amount: new(big.Int).Set(req.Amount), + } +} diff --git a/core/types/goattypes/req_locking_test.go b/core/types/goattypes/req_locking_test.go new file mode 100644 index 0000000000000..a688bd31cdf66 --- /dev/null +++ b/core/types/goattypes/req_locking_test.go @@ -0,0 +1,565 @@ +package goattypes + +import ( + "bytes" + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestNewGasRequest(t *testing.T) { + type args struct { + height uint64 + amount *big.Int + } + tests := []struct { + name string + args args + want *GasRequest + }{ + {"1", args{1, big.NewInt(2)}, &GasRequest{1, big.NewInt(2)}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewGasRequest(tt.args.height, tt.args.amount) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewGasRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got.Copy(), got) { + t.Errorf("NewGasRequest(): copy is not DeepEqual") + return + } + + if got.RequestType() != GasRequestType { + t.Errorf("NewGasRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(GasRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("NewGasRequest(): codec: %s", err) + return + } + + newReq2 := new(GasRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("NewGasRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("NewGasRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("NewGasRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + }) + } +} + +func TestUnpackIntoCreateRequest(t *testing.T) { + tests := []struct { + name string + args []byte + want *CreateRequest + wantErr bool + }{ + { + name: "1", + args: hexutil.MustDecode("0x0000000000000000000000008945a1288dc78a6d8952a92c77aee6730b4147780000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4b21124a8e21a475a08e4bf1ad6940f52b105d065075f610227089981948d81b0df0b6e43fc4c228a48ff159c3e6a38eb0e6ce15d78312a445d3d1671fe756842"), + want: &CreateRequest{ + Validator: common.HexToAddress("0x8945a1288dc78a6d8952a92c77aee6730b414778"), + Pubkey: [64]byte(hexutil.MustDecode("0xb21124a8e21a475a08e4bf1ad6940f52b105d065075f610227089981948d81b0df0b6e43fc4c228a48ff159c3e6a38eb0e6ce15d78312a445d3d1671fe756842")), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoCreateRequest(tt.args) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoCreateRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoCreateRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoCreateRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != CreateRequestType { + t.Errorf("UnpackIntoCreateRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(CreateRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoCreateRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoCreateRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(CreateRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoCreateRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoCreateRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`Create(address,address,bytes32[2])`))) + if eventTopic != CreateEventTopic { + t.Errorf("invalid CreateRequest event topic") + } + }) + } +} + +func TestUnpackIntoLockRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *LockRequest + wantErr bool + }{ + { + name: "1", + args: args{hexutil.MustDecode("0x0000000000000000000000008945a1288dc78a6d8952a92c77aee6730b4147780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a")}, + want: &LockRequest{ + Validator: common.HexToAddress("0x8945A1288dc78A6D8952a92C77aEe6730B414778"), + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Amount: big.NewInt(10), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoLockRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoLockRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoLockRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoLockRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != LockRequestType { + t.Errorf("UnpackIntoLockRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(LockRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoLockRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoLockRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(LockRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoLockRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoLockRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`Lock(address,address,uint256)`))) + if eventTopic != LockEventTopic { + t.Errorf("invalid LockRequest event topic") + } + }) + } +} + +func TestUnpackIntoUnlockRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *UnlockRequest + wantErr bool + }{ + { + name: "1", + args: args{hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008945a1288dc78a6d8952a92c77aee6730b4147780000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a")}, + want: &UnlockRequest{ + Id: 0, + Validator: common.HexToAddress("0x8945A1288dc78A6D8952a92C77aEe6730B414778"), + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Amount: big.NewInt(10), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoUnlockRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoUnlockRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoUnlockRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoUnlockRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != UnlockRequestType { + t.Errorf("UnpackIntoUnlockRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(UnlockRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoUnlockRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoUnlockRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(UnlockRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoUnlockRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoUnlockRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`Unlock(uint64,address,address,address,uint256)`))) + if eventTopic != UnlockEventTopic { + t.Errorf("invalid UnlockRequest event topic") + } + }) + } +} + +func TestUnpackIntoClaimRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *ClaimRequest + wantErr bool + }{ + { + name: "1", + args: args{hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000008945a1288dc78a6d8952a92c77aee6730b4147780000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4")}, + want: &ClaimRequest{ + Id: 1, + Validator: common.HexToAddress("0x8945A1288dc78A6D8952a92C77aEe6730B414778"), + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoClaimRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoClaimRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoClaimRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoClaimRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != ClaimRequestType { + t.Errorf("UnpackIntoClaimRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(ClaimRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoClaimRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoClaimRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(ClaimRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoClaimRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoClaimRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`Claim(uint64,address,address)`))) + if eventTopic != ClaimEventTopic { + t.Errorf("invalid ClaimRequest event topic") + } + }) + } +} + +func TestUnpackIntoUpdateTokenWeightRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *UpdateTokenWeightRequest + wantErr bool + }{ + { + name: "1", + args: args{hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a")}, + want: &UpdateTokenWeightRequest{ + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Weight: 10, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoUpdateTokenWeightRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoUpdateTokenWeightRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoUpdateTokenWeightRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoUpdateTokenWeightRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != UpdateTokenWeightRequestType { + t.Errorf("UnpackIntoUpdateTokenWeightRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(UpdateTokenWeightRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoUpdateTokenWeightRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoUpdateTokenWeightRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(UpdateTokenWeightRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoUpdateTokenWeightRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoUpdateTokenWeightRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`UpdateTokenWeight(address,uint64)`))) + if eventTopic != UpdateTokenWeightEventTopic { + t.Errorf("invalid UpdateTokenWeightRequestType event topic") + } + }) + } +} + +func TestUnpackIntoSetTokenThreshold(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *UpdateTokenThresholdRequest + wantErr bool + }{ + { + name: "1", + args: args{hexutil.MustDecode("0x0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4000000000000000000000000000000000000000000000000000000000000000a")}, + want: &UpdateTokenThresholdRequest{ + Token: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Threshold: big.NewInt(10), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoUpdateTokenThresholdRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoSetTokenThreshold() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoSetTokenThreshold() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoSetTokenThreshold() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != UpdateTokenThresholdRequestType { + t.Errorf("UnpackIntoSetTokenThreshold() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(UpdateTokenThresholdRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoSetTokenThreshold(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoSetTokenThreshold(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(UpdateTokenThresholdRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoSetTokenThreshold(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoSetTokenThreshold(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`UpdateTokenThreshold(address,uint256)`))) + if eventTopic != UpdateTokenThresholdEventTopic { + t.Errorf("invalid UpdateTokenThresholdEventTopic event topic") + } + }) + } +} + +func TestUnpackIntoGrantRequest(t *testing.T) { + type args struct { + data []byte + } + tests := []struct { + name string + args args + want *GrantRequest + wantErr bool + }{ + { + name: "1", + args: args{hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000000000a")}, + want: &GrantRequest{ + Amount: big.NewInt(10), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoGrantRequest(tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoGrantRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoGrantRequest() = %v, want %v", got, tt.want) + return + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoGrantRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != GrantRequestType { + t.Errorf("UnpackIntoGrantRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(GrantRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoGrantRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoGrantRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(GrantRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoGrantRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoGrantRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`Grant(uint256)`))) + if eventTopic != GrantEventTopic { + t.Errorf("invalid GrantRequest event topic") + } + }) + } +} diff --git a/core/types/goattypes/req_relayer.go b/core/types/goattypes/req_relayer.go new file mode 100644 index 0000000000000..1fd31f0903a43 --- /dev/null +++ b/core/types/goattypes/req_relayer.go @@ -0,0 +1,130 @@ +package goattypes + +import ( + "errors" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/common" +) + +type RelayerRequests struct { + Adds []*AddVoterRequest + Removes []*RemoveVoterRequest +} + +func (reqs *RelayerRequests) Encode() (res [][]byte) { + if l := len(reqs.Adds); l > 0 { + adds := []byte{AddVoterRequestType} + for i := 0; i < len(reqs.Adds); i++ { + adds = append(adds, reqs.Adds[i].Encode()...) + } + res = append(res, adds) + } + + if l := len(reqs.Removes); l > 0 { + removes := []byte{RemoveVoterRequestType} + for i := range l { + removes = append(removes, reqs.Removes[i].Encode()...) + } + res = append(res, removes) + } + + return res +} + +type AddVoterRequest struct { + Voter common.Address + Pubkey common.Hash +} + +func UnpackIntoAddVoterRequest(topics []common.Hash, data []byte) (*AddVoterRequest, error) { + if len(topics) != 2 { + return nil, fmt.Errorf("invalid AddVoter event topics length: expect 2 got %d", len(topics)) + } + + if len(data) != 32 { + return nil, fmt.Errorf("invalid AddVoter event data length: want 32 have %d", len(data)) + } + + return &AddVoterRequest{ + Voter: common.BytesToAddress(topics[1][:]), + Pubkey: common.BytesToHash(data[:]), + }, nil +} + +func (req *AddVoterRequest) RequestType() byte { return AddVoterRequestType } +func (req *AddVoterRequest) Encode() []byte { + res := make([]byte, 0, 52) + res = append(res, req.Voter.Bytes()...) + res = append(res, req.Pubkey.Bytes()...) + return res +} + +func (req *AddVoterRequest) Decode(input []byte) error { + if len(input) != 52 { + return errors.New("invalid AddVoterRequest length") + } + req.Voter = common.BytesToAddress(input[:20]) + req.Pubkey = common.BytesToHash(input[20:]) + return nil +} + +func (req *AddVoterRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 52) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *AddVoterRequest) Copy() Request { + return &AddVoterRequest{ + Voter: req.Voter, + Pubkey: req.Pubkey, + } +} + +type RemoveVoterRequest struct { + Voter common.Address +} + +func UnpackIntoRemoveVoterRequest(topics []common.Hash, data []byte) (*RemoveVoterRequest, error) { + if len(topics) != 2 { + return nil, fmt.Errorf("invalid RemoveVoter event topics length: expect 2 got %d", len(topics)) + } + if len(data) != 0 { + return nil, fmt.Errorf("invalid RemoveVoter event data length: want 0, have %d", len(data)) + } + return &RemoveVoterRequest{Voter: common.BytesToAddress(topics[1][:])}, nil +} + +func (req *RemoveVoterRequest) RequestType() byte { return RemoveVoterRequestType } + +func (req *RemoveVoterRequest) Encode() []byte { + res := make([]byte, 0, 20) + res = append(res, req.Voter.Bytes()...) + return res +} + +func (req *RemoveVoterRequest) Decode(input []byte) error { + if len(input) != 20 { + return errors.New("invalid RemoveVoterRequest length") + } + req.Voter = common.BytesToAddress(input) + return nil +} + +func (req *RemoveVoterRequest) DecodeReader(reader io.Reader) error { + input := make([]byte, 20) + if _, err := reader.Read(input); err != nil { + return err + } + return req.Decode(input) +} + +func (req *RemoveVoterRequest) Copy() Request { + return &RemoveVoterRequest{ + Voter: req.Voter, + } +} diff --git a/core/types/goattypes/req_relayer_test.go b/core/types/goattypes/req_relayer_test.go new file mode 100644 index 0000000000000..b8d1ad1a16188 --- /dev/null +++ b/core/types/goattypes/req_relayer_test.go @@ -0,0 +1,165 @@ +package goattypes + +import ( + "bytes" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestUnpackIntoAddVoterRequest(t *testing.T) { + type args struct { + topics []common.Hash + data []byte + } + tests := []struct { + name string + args args + want *AddVoterRequest + wantErr bool + }{ + { + name: "1", + args: args{ + topics: []common.Hash{ + common.HexToHash("0x101c617f43dd1b8a54a9d747d9121bbc55e93b88bc50560d782a79c4e28fc838"), + common.HexToHash("0x000000000000000000000000d12a5a92d4621fbe3068914988d538c410245443"), + }, + data: hexutil.MustDecode("0x023504e3cadac49656b8f0ac939b1665870c5eb60cd47541e401babb7ff99f23"), + }, + want: &AddVoterRequest{ + Voter: common.HexToAddress("0xd12a5a92D4621fBE3068914988D538c410245443"), + Pubkey: common.HexToHash("0x023504e3cadac49656b8f0ac939b1665870c5eb60cd47541e401babb7ff99f23"), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoAddVoterRequest(tt.args.topics, tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoAddVoterRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoAddVoterRequest() = %v, want %v", got, tt.want) + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoAddVoterRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != AddVoterRequestType { + t.Errorf("UnpackIntoAddVoterRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(AddVoterRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoAddVoterRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoAddVoterRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(AddVoterRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoAddVoterRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoAddVoterRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`AddedVoter(address,bytes32)`))) + if eventTopic != AddVoterEventTopoic { + t.Errorf("invalid AddVoterRequest event topic") + } + }) + } +} + +func TestUnpackIntoRemoveVoterRequest(t *testing.T) { + type args struct { + topics []common.Hash + data []byte + } + tests := []struct { + name string + args args + want *RemoveVoterRequest + wantErr bool + }{ + { + name: "1", + args: args{ + topics: []common.Hash{ + common.HexToHash("0x183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e8"), + common.HexToHash("0x000000000000000000000000c96397756df86d3ac4c04958ee5bf9ac7421e328"), + }, + }, + want: &RemoveVoterRequest{ + Voter: common.HexToAddress("0xc96397756df86d3ac4c04958ee5bf9ac7421e328"), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := UnpackIntoRemoveVoterRequest(tt.args.topics, tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("UnpackIntoRemoveVoterRequest() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("UnpackIntoRemoveVoterRequest() = %v, want %v", got, tt.want) + } + + if !reflect.DeepEqual(got, got.Copy()) { + t.Errorf("UnpackIntoRemoveVoterRequest() copy notDeepEqual= %v, want %v", got, tt.want) + return + } + + if got.RequestType() != RemoveVoterRequestType { + t.Errorf("UnpackIntoRemoveVoterRequest() inconsistent requestType: %d", got.RequestType()) + return + } + + newReq := new(RemoveVoterRequest) + if err := newReq.Decode(got.Encode()); err != nil { + t.Errorf("UnpackIntoRemoveVoterRequest(): codec: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq) { + t.Errorf("UnpackIntoRemoveVoterRequest(): not deepEqual: = %v, want %v", got, newReq) + return + } + + newReq2 := new(RemoveVoterRequest) + if err := newReq2.DecodeReader(bytes.NewReader(got.Encode())); err != nil { + t.Errorf("UnpackIntoRemoveVoterRequest(): DecodeReader: %s", err) + return + } + + if !reflect.DeepEqual(got, newReq2) { + t.Errorf("UnpackIntoRemoveVoterRequest(): DecodeReader: not deepEqual: = %v, want %v", got, newReq2) + return + } + + eventTopic := common.Hash(crypto.Keccak256([]byte(`RemovedVoter(address)`))) + if eventTopic != RemoveVoterEventTopic { + t.Errorf("invalid RemoveVoterRequest event topic") + } + }) + } +} diff --git a/core/types/goattypes/request.go b/core/types/goattypes/request.go new file mode 100644 index 0000000000000..cd7239652aa6e --- /dev/null +++ b/core/types/goattypes/request.go @@ -0,0 +1,246 @@ +package goattypes + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "math" + + "github.com/ethereum/go-ethereum/common" +) + +var ( + ErrUnsupportedRequestType = errors.New("unsupported request type") +) + +const ( + GasRequestType byte = iota + CreateRequestType + LockRequestType + UnlockRequestType + ClaimRequestType + GrantRequestType + UpdateTokenWeightRequestType + UpdateTokenThresholdRequestType + _ + _ + _ + WithdrawalRequestType + ReplaceByFeeRequestType + Cancel1RequestType + DepositTaxRequestType + ConfirmationNumberRequestType + MinDepositRequestType + _ + _ + _ + AddVoterRequestType + RemoveVoterRequestType +) + +var ( + WithdrawEventTopic = common.HexToHash("0xbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b") + ReplaceByFeeEventTopic = common.HexToHash("0x19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa") + Cancel1EventTopic = common.HexToHash("0x0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c") + + ConfirmationNumberEventTopic = common.HexToHash("0x30b92002139b64ec601b714d1ecccba1212034e735773b3de088e8876f4dfb65") + UpdateMinDepositEventTopic = common.HexToHash("0x7aa20a242ea0b0f7b0141c56aaad636eb2b2077c9c27d09a8282f6931f486a21") + UpdateDepositTaxEventTopic = common.HexToHash("0x1007ff7aec53e9626ce51f25d4e093f290f60da8019c8cf489f0ae2f21ebf76a") +) + +var ( + AddVoterEventTopoic = common.HexToHash("0x101c617f43dd1b8a54a9d747d9121bbc55e93b88bc50560d782a79c4e28fc838") + RemoveVoterEventTopic = common.HexToHash("0x183393fc5cffbfc7d03d623966b85f76b9430f42d3aada2ac3f3deabc78899e8") +) + +var ( + CreateEventTopic = common.HexToHash("0xf3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd") + LockEventTopic = common.HexToHash("0xec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f3") + UnlockEventTopic = common.HexToHash("0x40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db7") + ClaimEventTopic = common.HexToHash("0xa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b") + GrantEventTopic = common.HexToHash("0x41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0") + UpdateTokenWeightEventTopic = common.HexToHash("0xb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217") + UpdateTokenThresholdEventTopic = common.HexToHash("0x326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d") +) + +type Request interface { + RequestType() byte + Encode() []byte + Decode([]byte) error + DecodeReader(io.Reader) error + Copy() Request +} + +func EncodeUint64(n ...uint64) []byte { + raw := make([]byte, len(n)*8) + for i := 0; i < len(n); i++ { + start := i * 8 + end := start + 8 + binary.LittleEndian.PutUint64(raw[start:end], n[i]) + } + return raw +} + +func DecodeUint64(data []byte, expectLen int) ([]uint64, error) { + if ln := len(data); ln/8 != expectLen || ln%8 != 0 { + return nil, errors.New("invalid data length") + } + res := make([]uint64, expectLen) + for i := 0; i < expectLen; i++ { + start := i * 8 + end := start + 8 + res[i] = binary.LittleEndian.Uint64(data[start:end]) + } + return res, nil +} + +func DecodeRequests(reqs [][]byte) (bridge BridgeRequests, relayer RelayerRequests, locking LockingRequests, err error) { + if len(reqs) > math.MaxUint8 { + err = errors.New("typed request too long") + return + } + + for i := 0; i < len(reqs); i++ { + if len(reqs[i]) < 1 { + err = errors.New("request bytes too short") + return + } + reader := bytes.NewReader(reqs[i][1:]) + switch reqs[i][0] { + case GasRequestType: + for reader.Len() != 0 { + inner := new(GasRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.Gas = append(locking.Gas, inner) + } + case WithdrawalRequestType: + for reader.Len() != 0 { + inner := new(WithdrawalRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + bridge.Withdraws = append(bridge.Withdraws, inner) + } + case ReplaceByFeeRequestType: + for reader.Len() != 0 { + inner := new(ReplaceByFeeRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + bridge.ReplaceByFees = append(bridge.ReplaceByFees, inner) + } + case Cancel1RequestType: + for reader.Len() != 0 { + inner := new(Cancel1Request) + if err = inner.DecodeReader(reader); err != nil { + return + } + bridge.Cancel1s = append(bridge.Cancel1s, inner) + } + case DepositTaxRequestType: + for reader.Len() != 0 { + inner := new(DepositTaxRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + bridge.DepositTax = append(bridge.DepositTax, inner) + } + case ConfirmationNumberRequestType: + for reader.Len() != 0 { + inner := new(ConfirmationNumberRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + bridge.Confirmation = append(bridge.Confirmation, inner) + } + case MinDepositRequestType: + for reader.Len() != 0 { + inner := new(MinDepositRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + bridge.MinDeposit = append(bridge.MinDeposit, inner) + } + case CreateRequestType: + for reader.Len() != 0 { + inner := new(CreateRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.Creates = append(locking.Creates, inner) + } + case LockRequestType: + for reader.Len() != 0 { + inner := new(LockRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.Locks = append(locking.Locks, inner) + } + case UnlockRequestType: + for reader.Len() != 0 { + inner := new(UnlockRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.Unlocks = append(locking.Unlocks, inner) + } + case ClaimRequestType: + for reader.Len() != 0 { + inner := new(ClaimRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.Claims = append(locking.Claims, inner) + } + case GrantRequestType: + for reader.Len() != 0 { + inner := new(GrantRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.Grants = append(locking.Grants, inner) + } + case UpdateTokenWeightRequestType: + for reader.Len() != 0 { + inner := new(UpdateTokenWeightRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.UpdateWeights = append(locking.UpdateWeights, inner) + } + case UpdateTokenThresholdRequestType: + for reader.Len() != 0 { + inner := new(UpdateTokenThresholdRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + locking.UpdateThresholds = append(locking.UpdateThresholds, inner) + } + case AddVoterRequestType: + for reader.Len() != 0 { + inner := new(AddVoterRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + relayer.Adds = append(relayer.Adds, inner) + } + case RemoveVoterRequestType: + for reader.Len() != 0 { + inner := new(RemoveVoterRequest) + if err = inner.DecodeReader(reader); err != nil { + return + } + relayer.Removes = append(relayer.Removes, inner) + } + default: + err = fmt.Errorf("request type %d not supported", i) + return + } + } + return +} diff --git a/core/types/goattypes/request_test.go b/core/types/goattypes/request_test.go new file mode 100644 index 0000000000000..5c73a172f6134 --- /dev/null +++ b/core/types/goattypes/request_test.go @@ -0,0 +1,271 @@ +package goattypes + +import ( + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func TestUint64Codec(t *testing.T) { + type args struct { + n []uint64 + } + tests := []struct { + name string + args args + want []byte + }{ + { + name: "1", + args: args{[]uint64{100, 1e4}}, + want: []byte{100, 0, 0, 0, 0, 0, 0, 0, 16, 39, 0, 0, 0, 0, 0, 0}, + }, + { + name: "2", + args: args{[]uint64{4294967297}}, + want: []byte{1, 0, 0, 0, 1, 0, 0, 0}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := EncodeUint64(tt.args.n...) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("EncodeUint64() = %v, want %v", got, tt.want) + return + } + + decoded, err := DecodeUint64(got, len(tt.args.n)) + if err != nil { + t.Errorf("DecodeUint64(): error = %v", err) + return + } + + if !reflect.DeepEqual(decoded, tt.args.n) { + t.Errorf("not deepEqual = %v, want %v", decoded, tt.args.n) + return + } + }) + } +} + +func TestDecodeRequests(t *testing.T) { + tests := []struct { + name string + wantBridge BridgeRequests + wantRelayer RelayerRequests + wantLocking LockingRequests + wantErr bool + }{ + { + name: "all", + wantLocking: LockingRequests{ + Gas: []*GasRequest{ + NewGasRequest(100, big.NewInt(1e9)), + }, + Creates: []*CreateRequest{ + { + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Pubkey: [64]byte(hexutil.MustDecode("0x74602edafa25d1f5fcde1730328bf2c3559b47f689319ce478bd62f8ba582d35c6842e0533b4e5706d99e914b24da42dd35da09c0947223aa2ff88933c6bd946")), + }, + { + Validator: common.HexToAddress("0x35ed41deb0b9d86fdb8306c04927324a19f86509"), + Pubkey: [64]byte(hexutil.MustDecode("0x8e2977a5198f9cd4b533fa71a7c06fe43dbdc52122f118475f42717f5e9166be0ee6d67614b93a89e00eb49c6c8dd9b24d5a39801c2d8a99b1aef5d5859fad62")), + }, + }, + Locks: []*LockRequest{ + { + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Amount: big.NewInt(10), + }, + { + Validator: common.HexToAddress("0x35ed41deb0b9d86fdb8306c04927324a19f86509"), + Token: common.HexToAddress("0x9f42ff4c4ca8bfdcf6b9e15644a64eff6f226a2f"), + Amount: big.NewInt(2314), + }, + { + Validator: common.HexToAddress("0x086f2b830d9952e065125b94bd86e1dcb00e24bc"), + Token: common.HexToAddress("0xb25fc880491c51cb7b1528c523a465d4ba23ca14"), + Amount: big.NewInt(1e18), + }, + }, + Unlocks: []*UnlockRequest{ + { + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Amount: big.NewInt(10), + }, + { + Validator: common.HexToAddress("0x9563e3eb9ec48eceabbbfbb3f2a5a3c58ba471f1"), + Recipient: common.HexToAddress("0xa0a8930293dec1ea6b325966ccf5183b837e9d23"), + Token: common.HexToAddress("0x7bcc0bda4e9d8e4b011dcb0fb9846b67edd6f054"), + Amount: big.NewInt(10), + }, + }, + Claims: []*ClaimRequest{ + { + Id: 1, + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + }, + { + Id: 2, + Validator: common.HexToAddress("0x94D76E24F818426ae84aa404140E8D5F60E10E7e"), + Recipient: common.HexToAddress("0xe1cc1fbe87cd99dfa40ea79916435563e12cc547"), + }, + { + Id: 3, + Validator: common.HexToAddress("0x3a9f4a4c306ee85919b91559c749a8dcf40f978b"), + Recipient: common.HexToAddress("0xd4a520c05941d01df7b3e456658a7fc90ff0d378"), + }, + }, + UpdateWeights: []*UpdateTokenWeightRequest{ + { + Token: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Weight: 10, + }, + { + Token: common.HexToAddress("54c26679bc083c93ad58feb807bbd12c24a80c64"), + Weight: 1e4, + }, + { + Token: common.HexToAddress("0x0df08247173a183f20e4bdb254190091d26a909e"), + Weight: 1e5, + }, + }, + UpdateThresholds: []*UpdateTokenThresholdRequest{ + { + Token: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Threshold: big.NewInt(10), + }, + { + Token: common.HexToAddress("0x7d09bc661e0f8cb5e12d900f19654f7a92c7eb11"), + Threshold: big.NewInt(10), + }, + }, + Grants: []*GrantRequest{ + {Amount: big.NewInt(0xcdd318c6)}, + {Amount: big.NewInt(0x0e3e2dfb)}, + {Amount: big.NewInt(0x44ff0e05)}, + }, + }, + wantBridge: BridgeRequests{ + Withdraws: []*WithdrawalRequest{ + {Id: 1, Amount: 0xc60f7e8e, TxPrice: 1, Address: "1FwtBCsUqhQ8Zshw1or4aSUfdk1UDi83vh"}, + {Id: 2, Amount: 0xae212d1c, TxPrice: 2, Address: "bcrt1qxhk5rh4sh8vxlkurqmqyjfejfgvlsegfrd0yau"}, + {Id: 3, Amount: 0x5e357599, TxPrice: 2, Address: "bcrt1qxhk5rh4sh8vxlkurqmqyjfejfgvlsegfrd0yau"}, + {Id: 4, Amount: 0xbdebd2c6, TxPrice: 2, Address: "bc1qlkfkng9kcv8ancs8sycsfqm02fawqw24cf2am8u9hfl3vklvl2wsfujuzp"}, + {Id: 5, Amount: 0x8d7e9d08, TxPrice: 3, Address: "bc1qen5kv3c0epd9yfqvu2q059qsjpwu9hdjywx2v9p5p9l8msxn88fs9y5kx6"}, + {Id: 6, Amount: 0xbdebd2c6, TxPrice: 2, Address: "3Pbp8YCguJk9dXnTGqSXFnZbXC7EW8qbvy"}, + {Id: 7, Amount: 0x69b46a49, TxPrice: 2, Address: "17yhJ5DME9Fu3wVjVoVfP4jKxjrc9WRyaB"}, + {Id: 8, Amount: 0x5e357599, TxPrice: 2, Address: "2N1gW9FafSF8tRknY158GzXCTC5aygJEHgU"}, + }, + ReplaceByFees: []*ReplaceByFeeRequest{ + {Id: 1, TxPrice: 10}, + {Id: 2, TxPrice: 10}, + {Id: 3, TxPrice: 10}, + }, + Cancel1s: []*Cancel1Request{ + {Id: 10}, + {Id: 11}, + {Id: 12}, + }, + DepositTax: []*DepositTaxRequest{ + {Rate: 2, Max: 1e4}, + }, + Confirmation: []*ConfirmationNumberRequest{ + {Number: 6}, + }, + MinDeposit: []*MinDepositRequest{ + {Satoshi: 1e4}, + }, + }, + wantRelayer: RelayerRequests{ + Adds: []*AddVoterRequest{ + { + Voter: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Pubkey: common.HexToHash("0x13e21ffd05c7c3e6e7695535f91de949a7a31c577930b537482e1f192b5af389"), + }, + { + Voter: common.HexToAddress("0xdffa2082a93b579528ef045adda07076a649eb57"), + Pubkey: common.HexToHash("0x2c8b82bd642ad4ec4e393c1e077573a3cd7d665906de9fae1833a5b38117e659"), + }, + { + Voter: common.HexToAddress("0xe21c34698b4c784d1775b4e9255ca6ffdccbb95a"), + Pubkey: common.HexToHash("0x9e75b1ec21ab8590ede512c126552756a3c4e94d45fd05b31362c17e922b346f"), + }, + }, + Removes: []*RemoveVoterRequest{ + {Voter: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4")}, + {Voter: common.HexToAddress("0x6a20b59fb205df2004deef70e4020bbf2f91ca98")}, + {Voter: common.HexToAddress("0xb8299a5697f56266186ccdd8d2ef4a2df76f1857")}, + }, + }, + }, + { + name: "empty", + wantLocking: LockingRequests{ + Gas: []*GasRequest{ + NewGasRequest(101, big.NewInt(1e9)), + }, + }, + }, + { + name: "bridge", + wantLocking: LockingRequests{ + Gas: []*GasRequest{ + NewGasRequest(101, big.NewInt(1e9)), + }, + }, + wantBridge: BridgeRequests{ + Withdraws: []*WithdrawalRequest{ + {Id: 1, Amount: 0xc60f7e8e, TxPrice: 10, Address: "127Mfvbp7SskVw9puUkNdp8iJpWiavioU1"}, + }, + }, + }, + { + name: "relayer", + wantLocking: LockingRequests{ + Gas: []*GasRequest{ + NewGasRequest(101, big.NewInt(1e9)), + }, + }, + wantRelayer: RelayerRequests{ + Adds: []*AddVoterRequest{ + { + Voter: common.HexToAddress("0x2968b8d4964038128c9c5df7f85742e4955030aa"), + Pubkey: common.HexToHash("0x3a473b1cf506a1b9688a70a6b118c37c37c1e809e3ab20143c66b4d2cb9d4db3"), + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var requests [][]byte + requests = append(requests, tt.wantLocking.Encode()...) + requests = append(requests, tt.wantBridge.Encode()...) + requests = append(requests, tt.wantRelayer.Encode()...) + + // test with request type prefix + bridge1, relayer1, locking1, err := DecodeRequests(requests) + if (err != nil) != tt.wantErr { + t.Errorf("DecodeRequests() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(bridge1, tt.wantBridge) { + t.Errorf("DecodeRequests() gotBridge = %v, want %v", bridge1, tt.wantBridge) + } + if !reflect.DeepEqual(relayer1, tt.wantRelayer) { + t.Errorf("DecodeRequests() gotRelayer = %v, want %v", relayer1, tt.wantRelayer) + } + if !reflect.DeepEqual(locking1, tt.wantLocking) { + t.Errorf("DecodeRequests() gotLocking = %v, want %v", locking1, tt.wantLocking) + } + }) + } +} diff --git a/core/types/goattypes/tx.go b/core/types/goattypes/tx.go new file mode 100644 index 0000000000000..da6493445297d --- /dev/null +++ b/core/types/goattypes/tx.go @@ -0,0 +1,68 @@ +package goattypes + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +type Module uint8 + +const ( + BirdgeModule Module = iota + 1 + LockingModule +) + +type Action uint8 + +type Mint struct { + Address common.Address + Amount *big.Int + Tax *big.Int +} + +type Tx interface { + isGoatTx() + Size() int + Encode() []byte + Decode([]byte) error + Copy() Tx + Deposit() *Mint // deposit from L1 + Withdraw() *Mint // withdraw from consensus layer + + Sender() common.Address + Contract() common.Address + MethodId() [4]byte +} + +func DecodeTx(module Module, action Action, data []byte) (Tx, error) { + var inner Tx + switch module { + case BirdgeModule: + switch action { + case BridgeDepoitAction: + inner = new(DepositTx) + case BridgeCancel2Action: + inner = new(Cancel2Tx) + case BridgePaidAction: + inner = new(PaidTx) + case BitcoinNewBlockAction: + inner = new(NewBtcBlockTx) + } + case LockingModule: + switch action { + case LockingCompleteUnlockAction: + inner = new(CompleteUnlockTx) + case LockingDistributeRewardAction: + inner = new(DistributeRewardTx) + } + } + if inner == nil { + return nil, fmt.Errorf("unrecognized goat tx(module %d action %d)", module, action) + } + if err := inner.Decode(data); err != nil { + return nil, err + } + return inner, nil +} diff --git a/core/types/goattypes/tx_bridge.go b/core/types/goattypes/tx_bridge.go new file mode 100644 index 0000000000000..af0f474987dd7 --- /dev/null +++ b/core/types/goattypes/tx_bridge.go @@ -0,0 +1,299 @@ +package goattypes + +import ( + "encoding/binary" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +const ( + BridgeDepoitAction = iota + 1 + BridgeCancel2Action + BridgePaidAction + BitcoinNewBlockAction +) + +type DepositTx struct { + Txid common.Hash + TxOut uint32 + Target common.Address + Amount *big.Int + Tax *big.Int +} + +func (tx *DepositTx) isGoatTx() {} + +func (tx *DepositTx) Copy() Tx { + return &DepositTx{ + Txid: tx.Txid, + TxOut: tx.TxOut, + Target: tx.Target, + Amount: new(big.Int).Set(tx.Amount), + Tax: new(big.Int).Set(tx.Tax), + } +} + +func (tx *DepositTx) MethodId() [4]byte { + // deposit(bytes32 txid, uint32 txout, address target, uint256 amount,uint256 tax) + return [4]byte{0x90, 0x41, 0x83, 0xcb} +} + +func (tx *DepositTx) Size() int { + return 164 +} + +func (tx *DepositTx) Encode() []byte { + b := make([]byte, 0, tx.Size()) + + method := tx.MethodId() + b = append(b, method[:]...) + + b = append(b, tx.Txid[:]...) + + txout := make([]byte, 32) + binary.BigEndian.PutUint32(txout[28:], tx.TxOut) + b = append(b, txout...) + + b = append(b, common.LeftPadBytes(tx.Target[:], 32)...) + b = append(b, tx.Amount.FillBytes(make([]byte, 32))...) + b = append(b, tx.Tax.FillBytes(make([]byte, 32))...) + + return b +} + +func (tx *DepositTx) Decode(input []byte) error { + if len(input) != tx.Size() { + return errors.New("Invalid input data for deposit tx") + } + + if [4]byte(input[:4]) != tx.MethodId() { + return errors.New("not a deposit tx") + } + input = input[4:] + + tx.Txid = common.BytesToHash(input[:32]) + input = input[32:] + + tx.TxOut = binary.BigEndian.Uint32(input[28:32]) + input = input[32:] + + tx.Target = common.BytesToAddress(input[:32]) + + input = input[32:] + tx.Amount = new(big.Int).SetBytes(input[:32]) + + input = input[32:] + tx.Tax = new(big.Int).SetBytes(input[:32]) + return nil +} + +func (tx *DepositTx) Sender() common.Address { + return RelayerExecutor +} + +func (tx *DepositTx) Contract() common.Address { + return BridgeContract +} + +func (tx *DepositTx) Deposit() *Mint { + return &Mint{tx.Target, new(big.Int).Set(tx.Amount), new(big.Int).Set(tx.Tax)} +} + +func (tx *DepositTx) Withdraw() *Mint { + return nil +} + +type Cancel2Tx struct { + Id *big.Int +} + +func (tx *Cancel2Tx) isGoatTx() {} + +func (tx *Cancel2Tx) Copy() Tx { + return &Cancel2Tx{ + Id: new(big.Int).Set(tx.Id), + } +} + +func (tx *Cancel2Tx) Size() int { + return 36 +} + +func (tx *Cancel2Tx) Encode() []byte { + b := make([]byte, 0, tx.Size()) + method := tx.MethodId() + b = append(b, method[:]...) + b = append(b, tx.Id.FillBytes(make([]byte, 32))...) + return b +} + +func (tx *Cancel2Tx) Decode(input []byte) error { + if len(input) != tx.Size() { + return errors.New("Invalid input data for cancel2 tx") + } + + if [4]byte(input[:4]) != tx.MethodId() { + return errors.New("not a cancel2 tx") + } + tx.Id = new(big.Int).SetBytes(input[4:]) + return nil +} + +func (tx *Cancel2Tx) Sender() common.Address { + return RelayerExecutor +} + +func (tx *Cancel2Tx) Contract() common.Address { + return BridgeContract +} + +func (tx *Cancel2Tx) Deposit() *Mint { + return nil +} + +func (tx *Cancel2Tx) Withdraw() *Mint { + return nil +} + +func (tx *Cancel2Tx) MethodId() [4]byte { + // cancel2(uint256) + return [4]byte{0xc1, 0x9d, 0xd3, 0x20} +} + +type PaidTx struct { + Id *big.Int + Txid common.Hash + TxOut uint32 + Amount *big.Int +} + +func (tx *PaidTx) Size() int { + return 132 +} + +func (tx *PaidTx) isGoatTx() {} + +func (tx *PaidTx) Copy() Tx { + return &PaidTx{ + Id: new(big.Int).Set(tx.Id), + Txid: tx.Txid, + TxOut: tx.TxOut, + Amount: new(big.Int).Set(tx.Amount), + } +} + +func (tx *PaidTx) Encode() []byte { + b := make([]byte, 0, tx.Size()) + + method := tx.MethodId() + b = append(b, method[:]...) + + b = append(b, tx.Id.FillBytes(make([]byte, 32))...) + b = append(b, tx.Txid[:]...) + + txout := make([]byte, 32) + binary.BigEndian.PutUint32(txout[28:], tx.TxOut) + b = append(b, txout...) + + b = append(b, tx.Amount.FillBytes(make([]byte, 32))...) + return b +} + +func (tx *PaidTx) Decode(input []byte) error { + if len(input) != tx.Size() { + return errors.New("Invalid input data for paid tx") + } + + if [4]byte(input[:4]) != tx.MethodId() { + return errors.New("not a paid tx") + } + input = input[4:] + + tx.Id = new(big.Int).SetBytes(input[:32]) + input = input[32:] + + tx.Txid = common.BytesToHash(input[:32]) + input = input[32:] + + tx.TxOut = binary.BigEndian.Uint32(input[28:32]) + tx.Amount = new(big.Int).SetBytes(input[32:]) + return nil +} + +func (tx *PaidTx) Sender() common.Address { + return RelayerExecutor +} + +func (tx *PaidTx) Contract() common.Address { + return BridgeContract +} + +func (tx *PaidTx) Deposit() *Mint { + return nil +} + +func (tx *PaidTx) Withdraw() *Mint { + return nil +} + +func (tx *PaidTx) MethodId() [4]byte { + // paid(uint256 id,bytes32 txid,uint32 txout,uint256 paid) + return [4]byte{0xb6, 0x70, 0xab, 0x5e} +} + +type NewBtcBlockTx struct { + Hash common.Hash +} + +func (tx *NewBtcBlockTx) Size() int { + return 36 +} + +func (tx *NewBtcBlockTx) isGoatTx() {} + +func (tx *NewBtcBlockTx) Copy() Tx { + return &NewBtcBlockTx{Hash: tx.Hash} +} + +func (tx *NewBtcBlockTx) MethodId() [4]byte { + // newBlockHash(bytes32 hash) + return [4]byte{0x94, 0xf4, 0x90, 0xbd} +} + +func (tx *NewBtcBlockTx) Encode() []byte { + b := make([]byte, 0, tx.Size()) + + method := tx.MethodId() + b = append(b, method[:]...) + b = append(b, tx.Hash[:]...) + return b +} + +func (tx *NewBtcBlockTx) Decode(input []byte) error { + if len(input) != tx.Size() { + return errors.New("Invalid input data for newBitcoinHash tx") + } + if [4]byte(input[:4]) != tx.MethodId() { + return errors.New("not a newBlockHash tx") + } + tx.Hash = common.BytesToHash(input[4:]) + return nil +} + +func (tx *NewBtcBlockTx) Sender() common.Address { + return RelayerExecutor +} + +func (tx *NewBtcBlockTx) Contract() common.Address { + return BitcoinContract +} + +func (tx *NewBtcBlockTx) Deposit() *Mint { + return nil +} + +func (tx *NewBtcBlockTx) Withdraw() *Mint { + return nil +} diff --git a/core/types/goattypes/tx_bridge_test.go b/core/types/goattypes/tx_bridge_test.go new file mode 100644 index 0000000000000..c7269e4bce678 --- /dev/null +++ b/core/types/goattypes/tx_bridge_test.go @@ -0,0 +1,291 @@ +package goattypes + +import ( + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestDepositTx(t *testing.T) { + type fields struct { + Txid common.Hash + TxOut uint32 + Target common.Address + Amount *big.Int + Tax *big.Int + } + tests := []struct { + name string + fields fields + want []byte + }{ + { + name: "1", + fields: fields{ + Txid: common.HexToHash("0x8dd1f1f01a3f44735454359715e6ba3c4fc3ad024d21710f7345601d07383edd"), + TxOut: 12, + Target: common.HexToAddress("0xb81889214c39ac9f6c8328c8246de90e194cef05"), + Amount: new(big.Int).SetUint64(0xf2f7ea8666a7518e), + Tax: new(big.Int).SetUint64(0x9eb555), + }, + want: hexutil.MustDecode("0x904183cb8dd1f1f01a3f44735454359715e6ba3c4fc3ad024d21710f7345601d07383edd000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000b81889214c39ac9f6c8328c8246de90e194cef05000000000000000000000000000000000000000000000000f2f7ea8666a7518e00000000000000000000000000000000000000000000000000000000009eb555"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tx := &DepositTx{ + Txid: tt.fields.Txid, + TxOut: tt.fields.TxOut, + Target: tt.fields.Target, + Amount: tt.fields.Amount, + Tax: tt.fields.Tax, + } + + if cop := tx.Copy(); !reflect.DeepEqual(tx, cop) { + t.Errorf("DepositTx.Copy(%v) != want %v", tx, cop) + } + + got := tx.Encode() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("DepositTx.Encode() = %x, want %x", got, tt.want) + } + + rev := new(DepositTx) + if err := rev.Decode(got); err != nil { + t.Errorf("DepositTx.Decode(): %s", err) + } + + if !reflect.DeepEqual(tx, rev) { + t.Errorf("DepositTx.Decode(%v) != want %v", tx, rev) + } + + want := &Mint{tx.Target, new(big.Int).Set(tx.Amount), new(big.Int).Set(tx.Tax)} + if got, want := tx.Deposit(), want; !reflect.DeepEqual(got, want) { + t.Errorf("DepositTx.Deposit(%v) != want %v", got, want) + } + + if tx.Withdraw() != nil { + t.Errorf("DepositTx.Withdraw() != nil") + } + + if tx.Sender() != RelayerExecutor { + t.Errorf("DepositTx.Sender() != RelayerExecutor") + } + + if tx.Contract() != BridgeContract { + t.Errorf("DepositTx.Contract() != BridgeContract") + } + + methodId := [4]byte(crypto.Keccak256([]byte("deposit(bytes32,uint32,address,uint256,uint256)"))[:4]) + if methodId != tx.MethodId() { + t.Errorf("invalid DepositTx.MethodId()") + } + }) + } +} + +func TestCancel2Tx_Encode(t *testing.T) { + type fields struct { + Id *big.Int + } + tests := []struct { + name string + fields fields + want []byte + }{ + { + name: "1", + fields: fields{big.NewInt(0xc64ab11e)}, + want: hexutil.MustDecode("0xc19dd32000000000000000000000000000000000000000000000000000000000c64ab11e"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tx := &Cancel2Tx{ + Id: tt.fields.Id, + } + if cop := tx.Copy(); !reflect.DeepEqual(tx, cop) { + t.Errorf("Cancel2Tx.Copy(%v) != want %v", tx, cop) + } + + got := tx.Encode() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("Cancel2Tx.Encode() = %v, want %v", got, tt.want) + } + + rev := new(Cancel2Tx) + if err := rev.Decode(got); err != nil { + t.Errorf("Cancel2Tx.Decode(): %s", err) + } + + if !reflect.DeepEqual(tx, rev) { + t.Errorf("Cancel2Tx.Decode(%v) != want %v", tx, rev) + } + + if tx.Deposit() != nil { + t.Errorf("Cancel2Tx.Deposit() !=nil") + } + + if tx.Withdraw() != nil { + t.Errorf("Cancel2Tx.Withdraw() != nil") + } + + if tx.Sender() != RelayerExecutor { + t.Errorf("Cancel2Tx.Sender() != RelayerExecutor") + } + + if tx.Contract() != BridgeContract { + t.Errorf("Cancel2Tx.Contract() != BridgeContract") + } + + methodId := [4]byte(crypto.Keccak256([]byte("cancel2(uint256)"))[:4]) + if methodId != tx.MethodId() { + t.Errorf("invalid Cancel2Tx.MethodId()") + } + }) + } +} + +func TestPaidTx_Encode(t *testing.T) { + type fields struct { + Id *big.Int + Txid common.Hash + TxOut uint32 + Amount *big.Int + } + tests := []struct { + name string + fields fields + want []byte + }{ + { + name: "1", + fields: fields{ + Id: big.NewInt(0xfe171e25), + Txid: common.HexToHash("0x53b11234d8e3e2c9066afe89364da7315eefd30b28430715a56a08d590536511"), + TxOut: 0x32cc827f, + Amount: big.NewInt(0xba606dcd), + }, + want: hexutil.MustDecode("0xb670ab5e00000000000000000000000000000000000000000000000000000000fe171e2553b11234d8e3e2c9066afe89364da7315eefd30b28430715a56a08d5905365110000000000000000000000000000000000000000000000000000000032cc827f00000000000000000000000000000000000000000000000000000000ba606dcd"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tx := &PaidTx{ + Id: tt.fields.Id, + Txid: tt.fields.Txid, + TxOut: tt.fields.TxOut, + Amount: tt.fields.Amount, + } + got := tx.Encode() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("PaidTx.Encode() = %v, want %v", got, tt.want) + } + + rev := new(PaidTx) + if err := rev.Decode(got); err != nil { + t.Errorf("PaidTx.Decode(): %s", err) + } + + if !reflect.DeepEqual(tx, rev) { + t.Errorf("PaidTx.Decode(%v) != want %v", tx, rev) + } + + if tx.Deposit() != nil { + t.Errorf("PaidTx.Deposit() !=nil") + } + + if tx.Withdraw() != nil { + t.Errorf("PaidTx.Withdraw() != nil") + } + + if tx.Sender() != RelayerExecutor { + t.Errorf("PaidTx.Sender() != RelayerExecutor") + } + + if tx.Contract() != BridgeContract { + t.Errorf("PaidTx.Contract() != BridgeContract") + } + + methodId := [4]byte(crypto.Keccak256([]byte("paid(uint256,bytes32,uint32,uint256)"))[:4]) + if methodId != tx.MethodId() { + t.Errorf("invalid PaidTx.MethodId()") + } + }) + } +} + +func TestNewBtcBlockTx(t *testing.T) { + type fields struct { + Hash common.Hash + } + tests := []struct { + name string + fields fields + want []byte + }{ + { + name: "1", + fields: fields{common.HexToHash("0xbb7ba5e4830730dfa97c1eaaf199a8ef8ea2a865ca44c600fa032772a7af9edc")}, + want: hexutil.MustDecode("0x94f490bdbb7ba5e4830730dfa97c1eaaf199a8ef8ea2a865ca44c600fa032772a7af9edc"), + }, + { + name: "2", + fields: fields{common.HexToHash("0xbef772023eb7bea51863657b1d4556146176d4bfe1f114e8b0d6a50f2b331f72")}, + want: hexutil.MustDecode("0x94f490bdbef772023eb7bea51863657b1d4556146176d4bfe1f114e8b0d6a50f2b331f72"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tx := &NewBtcBlockTx{ + Hash: tt.fields.Hash, + } + if got := tx.Encode(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewBtcBlockTx.Encode() = %v, want %v", got, tt.want) + } + + if cop := tx.Copy(); !reflect.DeepEqual(tx, cop) { + t.Errorf("NewBtcBlockTx.Copy(%v) != want %v", tx, cop) + } + + got := tx.Encode() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewBtcBlockTx.Encode() = %v, want %v", got, tt.want) + } + + rev := new(NewBtcBlockTx) + if err := rev.Decode(got); err != nil { + t.Errorf("NewBtcBlockTx.Decode(): %s", err) + } + + if !reflect.DeepEqual(tx, rev) { + t.Errorf("NewBtcBlockTx.Decode(%v) != want %v", tx, rev) + } + + if tx.Deposit() != nil { + t.Errorf("NewBtcBlockTx.Deposit() !=nil") + } + + if tx.Withdraw() != nil { + t.Errorf("NewBtcBlockTx.Withdraw() != nil") + } + + if tx.Sender() != RelayerExecutor { + t.Errorf("NewBtcBlockTx.Sender() != RelayerExecutor") + } + + if tx.Contract() != BitcoinContract { + t.Errorf("NewBtcBlockTx.Contract() != BitcoinContract") + } + + methodId := [4]byte(crypto.Keccak256([]byte("newBlockHash(bytes32)"))[:4]) + if methodId != tx.MethodId() { + t.Errorf("invalid NewBtcBlockTx.MethodId()") + } + }) + } +} diff --git a/core/types/goattypes/tx_locking.go b/core/types/goattypes/tx_locking.go new file mode 100644 index 0000000000000..f1d2d2f306c5c --- /dev/null +++ b/core/types/goattypes/tx_locking.go @@ -0,0 +1,174 @@ +package goattypes + +import ( + "encoding/binary" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +const ( + LockingCompleteUnlockAction = iota + 1 + LockingDistributeRewardAction +) + +type CompleteUnlockTx struct { + Id uint64 + Recipient common.Address + Token common.Address + Amount *big.Int +} + +func (tx *CompleteUnlockTx) isGoatTx() {} + +func (tx *CompleteUnlockTx) Copy() Tx { + return &CompleteUnlockTx{ + Id: tx.Id, + Recipient: tx.Recipient, + Token: tx.Token, + Amount: new(big.Int).Set(tx.Amount), + } +} + +func (tx *CompleteUnlockTx) MethodId() [4]byte { + // completeUnlock(uint64 id,address recipient,address token,uint256 amount) + return [4]byte{0x00, 0xab, 0xa5, 0x1a} +} + +func (tx *CompleteUnlockTx) Size() int { + return 132 +} + +func (tx *CompleteUnlockTx) Encode() []byte { + b := make([]byte, 0, tx.Size()) + + method := tx.MethodId() + b = append(b, method[:]...) + + id := make([]byte, 32) + binary.BigEndian.PutUint64(id[24:], tx.Id) + b = append(b, id...) + + b = append(b, common.LeftPadBytes(tx.Recipient[:], 32)...) + b = append(b, common.LeftPadBytes(tx.Token[:], 32)...) + b = append(b, tx.Amount.FillBytes(make([]byte, 32))...) + + return b +} + +func (tx *CompleteUnlockTx) Decode(input []byte) error { + if len(input) != tx.Size() { + return errors.New("invalid input data for completeUnlock tx") + } + + if [4]byte(input[:4]) != tx.MethodId() { + return errors.New("not a CompleteUnlock tx") + } + input = input[4:] + tx.Id = binary.BigEndian.Uint64(input[24:32]) + input = input[32:] + tx.Recipient = common.BytesToAddress(input[:32]) + input = input[32:] + tx.Token = common.BytesToAddress(input[:32]) + tx.Amount = new(big.Int).SetBytes(input[32:]) + return nil +} + +func (tx *CompleteUnlockTx) Sender() common.Address { + return LockingExecutor +} + +func (tx *CompleteUnlockTx) Contract() common.Address { + return LockingContract +} + +func (tx *CompleteUnlockTx) Deposit() *Mint { + return nil +} + +func (tx *CompleteUnlockTx) Withdraw() *Mint { + if tx.Token == NativeToken { + return &Mint{tx.Recipient, new(big.Int).Set(tx.Amount), new(big.Int)} + } + return nil +} + +type DistributeRewardTx struct { + Id uint64 + Recipient common.Address + Goat *big.Int + GasReward *big.Int +} + +func (tx *DistributeRewardTx) isGoatTx() {} + +func (tx *DistributeRewardTx) Copy() Tx { + return &DistributeRewardTx{ + Id: tx.Id, + Recipient: tx.Recipient, + Goat: new(big.Int).Set(tx.Goat), + GasReward: new(big.Int).Set(tx.GasReward), + } +} + +func (tx *DistributeRewardTx) MethodId() [4]byte { + // distributeReward(uint64 id,address recipient,uint256 goat,uint256 amount) + return [4]byte{0xbd, 0x9f, 0xad, 0xb5} +} + +func (tx *DistributeRewardTx) Size() int { + return 132 +} + +func (tx *DistributeRewardTx) Encode() []byte { + b := make([]byte, 0, tx.Size()) + + method := tx.MethodId() + b = append(b, method[:]...) + + id := make([]byte, 32) + binary.BigEndian.PutUint64(id[24:], tx.Id) + b = append(b, id...) + + b = append(b, common.LeftPadBytes(tx.Recipient[:], 32)...) + b = append(b, tx.Goat.FillBytes(make([]byte, 32))...) + b = append(b, tx.GasReward.FillBytes(make([]byte, 32))...) + + return b +} + +func (tx *DistributeRewardTx) Decode(input []byte) error { + if len(input) != tx.Size() { + return errors.New("invalid input data for distributeReward tx") + } + + if [4]byte(input[:4]) != tx.MethodId() { + return errors.New("not a DistributeReward tx") + } + + input = input[4:] + tx.Id = binary.BigEndian.Uint64(input[24:32]) + input = input[32:] + tx.Recipient = common.BytesToAddress(input[:32]) + input = input[32:] + tx.Goat = new(big.Int).SetBytes(input[:32]) + tx.GasReward = new(big.Int).SetBytes(input[32:]) + return nil +} + +func (tx *DistributeRewardTx) Sender() common.Address { + return LockingExecutor +} + +func (tx *DistributeRewardTx) Contract() common.Address { + return LockingContract +} + +func (tx *DistributeRewardTx) Deposit() *Mint { + return nil +} + +func (tx *DistributeRewardTx) Withdraw() *Mint { + return &Mint{tx.Recipient, new(big.Int).Set(tx.GasReward), new(big.Int)} +} diff --git a/core/types/goattypes/tx_locking_test.go b/core/types/goattypes/tx_locking_test.go new file mode 100644 index 0000000000000..5a6d970e24f35 --- /dev/null +++ b/core/types/goattypes/tx_locking_test.go @@ -0,0 +1,176 @@ +package goattypes + +import ( + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func TestCompleteUnlockTx(t *testing.T) { + type fields struct { + Id uint64 + Recipient common.Address + Token common.Address + Amount *big.Int + } + tests := []struct { + name string + fields fields + want []byte + mint *Mint + }{ + { + name: "1", + fields: fields{ + Id: 100, + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Token: common.HexToAddress("0x3d8b9404381a5f775dd42171aa011d77d3e7c2e0"), + Amount: big.NewInt(1), + }, + want: hexutil.MustDecode("0x00aba51a00000000000000000000000000000000000000000000000000000000000000640000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc40000000000000000000000003d8b9404381a5f775dd42171aa011d77d3e7c2e00000000000000000000000000000000000000000000000000000000000000001"), + }, + { + name: "2", + fields: fields{ + Id: 100, + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Token: common.Address{}, + Amount: big.NewInt(1), + }, + want: hexutil.MustDecode("0x00aba51a00000000000000000000000000000000000000000000000000000000000000640000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), + mint: &Mint{Address: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), Amount: big.NewInt(1), Tax: big.NewInt(0)}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tx := &CompleteUnlockTx{ + Id: tt.fields.Id, + Recipient: tt.fields.Recipient, + Token: tt.fields.Token, + Amount: tt.fields.Amount, + } + if got := tx.Encode(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("CompleteUnlockTx.Encode() = %v, want %v", got, tt.want) + } + + if cop := tx.Copy(); !reflect.DeepEqual(tx, cop) { + t.Errorf("CompleteUnlockTx.Copy(%v) != want %v", tx, cop) + } + + got := tx.Encode() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("CompleteUnlockTx.Encode() = %x, want %x", got, tt.want) + } + + rev := new(CompleteUnlockTx) + if err := rev.Decode(got); err != nil { + t.Errorf("CompleteUnlockTx.Decode(): %s", err) + } + + if !reflect.DeepEqual(tx, rev) { + t.Errorf("CompleteUnlockTx.Decode(%v) != want %v", tx, rev) + } + + if tx.Deposit() != nil { + t.Errorf("CompleteUnlockTx.Deposit() != nil") + } + + if got := tx.Withdraw(); !reflect.DeepEqual(got, tt.mint) { + t.Errorf("CompleteUnlockTx.Withdraw(%+v) != want %+v", got, tt.mint) + } + + if tx.Sender() != LockingExecutor { + t.Errorf("CompleteUnlockTx.Sender() != LockingExecutor") + } + + if tx.Contract() != LockingContract { + t.Errorf("CompleteUnlockTx.Contract() != LockingContract") + } + }) + } +} + +func TestDistributeRewardTx(t *testing.T) { + type fields struct { + Id uint64 + Recipient common.Address + Goat *big.Int + Amount *big.Int + } + tests := []struct { + name string + fields fields + want []byte + mint *Mint + }{ + { + name: "1", + fields: fields{ + Id: 1, + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Goat: big.NewInt(100), + Amount: big.NewInt(1), + }, + want: hexutil.MustDecode("0xbd9fadb500000000000000000000000000000000000000000000000000000000000000010000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001"), + mint: &Mint{Address: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), Amount: big.NewInt(1), Tax: big.NewInt(0)}, + }, + { + name: "2", + fields: fields{ + Id: 2, + Recipient: common.HexToAddress("0x9ae387acdafe4b9d315d0bb56b06ab91f31b9670"), + Goat: big.NewInt(1), + Amount: big.NewInt(100), + }, + want: hexutil.MustDecode("0xbd9fadb500000000000000000000000000000000000000000000000000000000000000020000000000000000000000009ae387acdafe4b9d315d0bb56b06ab91f31b967000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064"), + mint: &Mint{Address: common.HexToAddress("0x9ae387acdafe4b9d315d0bb56b06ab91f31b9670"), Amount: big.NewInt(100), Tax: big.NewInt(0)}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tx := &DistributeRewardTx{ + Id: tt.fields.Id, + Recipient: tt.fields.Recipient, + Goat: tt.fields.Goat, + GasReward: tt.fields.Amount, + } + + if cop := tx.Copy(); !reflect.DeepEqual(tx, cop) { + t.Errorf("DistributeRewardTx.Copy(%v) != want %v", tx, cop) + } + + got := tx.Encode() + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("DistributeRewardTx.Encode() = %x, want %x", got, tt.want) + } + + rev := new(DistributeRewardTx) + if err := rev.Decode(got); err != nil { + t.Errorf("DistributeRewardTx.Decode(): %s", err) + } + + if !reflect.DeepEqual(tx, rev) { + t.Errorf("DistributeRewardTx.Decode(%v) != want %v", tx, rev) + } + + if got := tx.Withdraw(); !reflect.DeepEqual(got, tt.mint) { + t.Errorf("CompleteUnlockTx.Withdraw(%+v) != want %+v", got, tt.mint) + } + + if tx.Deposit() != nil { + t.Errorf("DistributeRewardTx.Deposit() != nil") + } + + if tx.Sender() != LockingExecutor { + t.Errorf("DistributeRewardTx.Sender() != LockingExecutor") + } + + if tx.Contract() != LockingContract { + t.Errorf("DistributeRewardTx.Contract() != LockingContract") + } + }) + } +} diff --git a/core/types/goattypes/tx_test.go b/core/types/goattypes/tx_test.go new file mode 100644 index 0000000000000..ada0ab7b4c7a4 --- /dev/null +++ b/core/types/goattypes/tx_test.go @@ -0,0 +1,159 @@ +package goattypes + +import ( + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func TestTxDecode(t *testing.T) { + type args struct { + module Module + action Action + data []byte + } + tests := []struct { + name string + args args + want Tx + wantErr bool + }{ + { + name: "invalid", + args: args{ + module: 0, + action: 0, + data: hexutil.MustDecode("0x1234"), + }, + want: nil, + wantErr: true, + }, + { + name: "deposit", + args: args{ + module: BirdgeModule, + action: BridgeDepoitAction, + data: hexutil.MustDecode("0x904183cb15bb90fa63b9a92e31d31f8d8d30bf8da9d9a21314c65dd517f27740ae676d6e000000000000000000000000000000000000000000000000000000002a71a7780000000000000000000000005e4e4d79f08120352f04d638adec7d3892b2804500000000000000000000000000000000000000000000000000000000157f7f970000000000000000000000000000000000000000000000000000000000000064"), + }, + want: &DepositTx{ + Txid: common.HexToHash("0x15bb90fa63b9a92e31d31f8d8d30bf8da9d9a21314c65dd517f27740ae676d6e"), + TxOut: 0x2a71a778, + Target: common.HexToAddress("0x5e4e4d79f08120352f04d638adec7d3892b28045"), + Amount: big.NewInt(0x157f7f97), + Tax: big.NewInt(100), + }, + wantErr: false, + }, + { + name: "deposit-error", + args: args{ + module: BirdgeModule, + action: BridgeDepoitAction, + data: hexutil.MustDecode("0xb670ab5e00000000000000000000000000000000000000000000000000000000fe171e2553b11234d8e3e2c9066afe89364da7315eefd30b28430715a56a08d5905365110000000000000000000000000000000000000000000000000000000032cc827f00000000000000000000000000000000000000000000000000000000ba606dcd"), + }, + want: nil, + wantErr: true, + }, + { + name: "cancel2", + args: args{ + module: BirdgeModule, + action: BridgeCancel2Action, + data: hexutil.MustDecode("0xc19dd32000000000000000000000000000000000000000000000000000000000c64ab11e"), + }, + want: &Cancel2Tx{ + Id: big.NewInt(0xc64ab11e), + }, + wantErr: false, + }, + { + name: "cancel2-false", + args: args{ + module: BirdgeModule, + action: BridgeCancel2Action, + data: hexutil.MustDecode("0x14de9f2dae156be67a27ccec6e2672034a6da7491fc702cd5fcfaa4f6f3d60fb"), + }, + want: nil, + wantErr: true, + }, + { + name: "paid", + args: args{ + module: BirdgeModule, + action: BridgePaidAction, + data: hexutil.MustDecode("0xb670ab5e00000000000000000000000000000000000000000000000000000000fe171e2553b11234d8e3e2c9066afe89364da7315eefd30b28430715a56a08d5905365110000000000000000000000000000000000000000000000000000000032cc827f00000000000000000000000000000000000000000000000000000000ba606dcd"), + }, + want: &PaidTx{ + Id: big.NewInt(0xfe171e25), + Txid: common.HexToHash("0x53b11234d8e3e2c9066afe89364da7315eefd30b28430715a56a08d590536511"), + TxOut: 0x32cc827f, + Amount: big.NewInt(0xba606dcd), + }, + wantErr: false, + }, + { + name: "paid-false", + args: args{ + module: BirdgeModule, + action: BridgePaidAction, + data: hexutil.MustDecode("0xb55ada3915bb90fa63b9a92e31d31f8d8d30bf8da9d9a21314c65dd517f27740ae676d6e000000000000000000000000000000000000000000000000000000002a71a7780000000000000000000000005e4e4d79f08120352f04d638adec7d3892b2804500000000000000000000000000000000000000000000000000000000157f7f97"), + }, + want: nil, + wantErr: true, + }, + { + name: "new-btc-hash", + args: args{ + module: BirdgeModule, + action: BitcoinNewBlockAction, + data: hexutil.MustDecode("0x94f490bdbb7ba5e4830730dfa97c1eaaf199a8ef8ea2a865ca44c600fa032772a7af9edc"), + }, + want: &NewBtcBlockTx{ + Hash: common.HexToHash("0xbb7ba5e4830730dfa97c1eaaf199a8ef8ea2a865ca44c600fa032772a7af9edc"), + }, + }, + { + name: "CompleteUnlock", + args: args{ + module: LockingModule, + action: LockingCompleteUnlockAction, + data: hexutil.MustDecode("0x00aba51a00000000000000000000000000000000000000000000000000000000000000640000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), + }, + want: &CompleteUnlockTx{ + Id: 100, + Recipient: common.HexToAddress("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"), + Token: common.Address{}, + Amount: big.NewInt(1), + }, + }, + { + name: "DistributeReward", + args: args{ + module: LockingModule, + action: LockingDistributeRewardAction, + data: hexutil.MustDecode("0xbd9fadb500000000000000000000000000000000000000000000000000000000000000020000000000000000000000009ae387acdafe4b9d315d0bb56b06ab91f31b967000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064"), + }, + want: &DistributeRewardTx{ + Id: 2, + Recipient: common.HexToAddress("0x9ae387acdafe4b9d315d0bb56b06ab91f31b9670"), + Goat: big.NewInt(1), + GasReward: big.NewInt(100), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := DecodeTx(tt.args.module, tt.args.action, tt.args.data) + if (err != nil) != tt.wantErr { + t.Errorf("TxDecode() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("TxDecode() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/core/types/transaction.go b/core/types/transaction.go index ea6f5ad6b9c6e..522dfb6e101c9 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -205,6 +205,8 @@ func (tx *Transaction) decodeTyped(b []byte) (TxData, error) { inner = new(DynamicFeeTx) case BlobTxType: inner = new(BlobTx) + case GoatTxType: + inner = new(GoatTx) default: return nil, ErrTxTypeNotSupported } diff --git a/core/types/transaction_marshalling.go b/core/types/transaction_marshalling.go index 4d5b2bcdd4ce3..1969e5d6de4ae 100644 --- a/core/types/transaction_marshalling.go +++ b/core/types/transaction_marshalling.go @@ -23,6 +23,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types/goattypes" "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/holiman/uint256" ) @@ -53,6 +54,9 @@ type txJSON struct { Commitments []kzg4844.Commitment `json:"commitments,omitempty"` Proofs []kzg4844.Proof `json:"proofs,omitempty"` + Module *goattypes.Module `json:"module,omitempty"` + Action *goattypes.Action `json:"action,omitempty"` + // Only used for encoding: Hash common.Hash `json:"hash"` } @@ -153,6 +157,14 @@ func (tx *Transaction) MarshalJSON() ([]byte, error) { enc.Commitments = itx.Sidecar.Commitments enc.Proofs = itx.Sidecar.Proofs } + + case *GoatTx: + enc.Module = &itx.Module + enc.Action = &itx.Action + enc.Nonce = (*hexutil.Uint64)(&itx.Nonce) + enc.Input = (*hexutil.Bytes)(&itx.Data) + enc.To = tx.To() + // other fields will show up as null. } return json.Marshal(&enc) } @@ -409,6 +421,34 @@ func (tx *Transaction) UnmarshalJSON(input []byte) error { } } + case GoatTxType: + var itx GoatTx + inner = &itx + + if dec.Module == nil { + return errors.New("missing required field 'module' in transaction") + } + itx.Module = *dec.Module + + if dec.Action == nil { + return errors.New("missing required field 'action' in transaction") + } + itx.Action = *dec.Action + + if dec.Nonce == nil { + return errors.New("missing required field 'nonce' in transaction") + } + itx.Nonce = uint64(*dec.Nonce) + + if dec.Input == nil { + return errors.New("missing required field 'input' in transaction") + } + itx.Data = *dec.Input + + itx.inner, err = goattypes.DecodeTx(itx.Module, itx.Action, itx.Data) + if err != nil { + return err + } default: return ErrTxTypeNotSupported } diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index 73011e238b581..3b867fb3a8878 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -187,6 +187,9 @@ func NewCancunSigner(chainId *big.Int) Signer { } func (s cancunSigner) Sender(tx *Transaction) (common.Address, error) { + if tx.IsGoatTx() { + return tx.inner.(*GoatTx).Sender(), nil + } if tx.Type() != BlobTxType { return s.londonSigner.Sender(tx) } diff --git a/core/types/tx_goat.go b/core/types/tx_goat.go new file mode 100644 index 0000000000000..abe915d6b5c93 --- /dev/null +++ b/core/types/tx_goat.go @@ -0,0 +1,111 @@ +package types + +import ( + "bytes" + "math/big" + "slices" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types/goattypes" + "github.com/ethereum/go-ethereum/rlp" +) + +func (tx *Transaction) IsMemPoolTx() bool { + switch tx.inner.txType() { + case GoatTxType, BlobTxType: + return false + default: + return true + } +} + +func (tx *Transaction) IsGoatTx() bool { + return tx.inner.txType() == GoatTxType +} + +func (tx *Transaction) Deposit() *goattypes.Mint { + if !tx.IsGoatTx() { + return nil + } + return tx.inner.(*GoatTx).inner.Deposit() +} + +func (tx *Transaction) Withdraw() *goattypes.Mint { + if !tx.IsGoatTx() { + return nil + } + return tx.inner.(*GoatTx).inner.Withdraw() +} + +const ( + GoatTxType = 0x60 +) + +type GoatTx struct { + Module goattypes.Module `json:"module"` + Action goattypes.Action `json:"action"` + Nonce uint64 `json:"nonce"` + Data []byte `json:"data"` // abi encoded input + + inner goattypes.Tx `rlp:"-"` +} + +func NewGoatTx(module goattypes.Module, action goattypes.Action, nonce uint64, tx goattypes.Tx) *GoatTx { + return &GoatTx{Module: module, Action: action, Nonce: nonce, Data: tx.Encode(), inner: tx} +} + +// copy creates a deep copy of the transaction data and initializes all fields. +func (tx *GoatTx) copy() TxData { + cpy := &GoatTx{ + Module: tx.Module, + Action: tx.Action, + Nonce: tx.Nonce, + Data: slices.Clone(tx.Data), + inner: tx.inner.Copy(), + } + return cpy +} + +// accessors for innerTx. +func (tx *GoatTx) txType() byte { return GoatTxType } +func (tx *GoatTx) chainID() *big.Int { return common.Big0 } +func (tx *GoatTx) accessList() AccessList { return nil } +func (tx *GoatTx) data() []byte { return tx.Data } +func (tx *GoatTx) to() *common.Address { + c := tx.inner.Contract() + return &c +} + +func (tx *GoatTx) gas() uint64 { return 0 } +func (tx *GoatTx) gasFeeCap() *big.Int { return new(big.Int) } +func (tx *GoatTx) gasTipCap() *big.Int { return new(big.Int) } +func (tx *GoatTx) gasPrice() *big.Int { return new(big.Int) } +func (tx *GoatTx) value() *big.Int { return new(big.Int) } +func (tx *GoatTx) nonce() uint64 { return tx.Nonce } + +func (tx *GoatTx) effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int { + return new(big.Int) +} + +func (tx *GoatTx) rawSignatureValues() (v, r, s *big.Int) { + return common.Big0, common.Big0, common.Big0 +} + +func (tx *GoatTx) setSignatureValues(chainID, v, r, s *big.Int) {} + +func (tx *GoatTx) encode(b *bytes.Buffer) error { + return rlp.Encode(b, tx) +} + +func (tx *GoatTx) decode(input []byte) error { + err := rlp.DecodeBytes(input, tx) + if err != nil { + return err + } + tx.inner, err = goattypes.DecodeTx(tx.Module, tx.Action, tx.Data) + return err +} + +func (tx *GoatTx) Sender() common.Address { + return tx.inner.Sender() +} diff --git a/core/types/tx_goat_test.go b/core/types/tx_goat_test.go new file mode 100644 index 0000000000000..adb59b30c1f0f --- /dev/null +++ b/core/types/tx_goat_test.go @@ -0,0 +1,136 @@ +package types + +import ( + "bytes" + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types/goattypes" +) + +func TestNewGoatTx(t *testing.T) { + inner := &goattypes.DepositTx{ + Txid: common.HexToHash("0x739cb95532ef40f90d73c7b6102b89de01ff75f23c88c3f6b2aa30a4883bf4e0"), + TxOut: 1, + Target: common.HexToAddress("0xe5c1edfd25daf6da13ce5e8f95e286ad8c95c430"), + Amount: big.NewInt(1e18), + Tax: big.NewInt(0), + } + + nonce := uint64(100) + tx := NewTx(NewGoatTx(goattypes.BirdgeModule, goattypes.BridgeDepoitAction, nonce, inner)) + if tx.Type() != GoatTxType { + t.Fatal("NewGoatTx: not GoatTxType") + } + + if !tx.IsGoatTx() { + t.Fatal("IsGoatTx: expected GoatTxType") + } + + if tx.IsMemPoolTx() { + t.Fatal("IsGoatTx: not a mempool tx") + } + + if tx.ChainId().Sign() != 0 { + t.Fatal("chain id should be 0") + } + + if tx.Value().Sign() != 0 { + t.Fatal("value should be 0") + } + + if tx.GasFeeCap().Sign() != 0 { + t.Fatal("GasFeeCap should be 0") + } + + if tx.GasTipCap().Sign() != 0 { + t.Fatal("GasTipCap should be 0") + } + + if tx.GasPrice().Sign() != 0 { + t.Fatal("GasPrice should be 0") + } + + if tx.Gas() != 0 { + t.Fatal("gas should be 0") + } + + if tx.Nonce() != nonce { + t.Fatal("Nonce is expected to be", nonce) + } + + if !bytes.Equal(tx.Data(), inner.Encode()) { + t.Fatal("Data is expected to abi-encoded of the tx", nonce) + } + + if !reflect.DeepEqual(tx.Deposit(), inner.Deposit()) { + t.Fatal("Deposit is not equal") + } + + if !reflect.DeepEqual(tx.Withdraw(), inner.Withdraw()) { + t.Fatal("Deposit is not equal") + } + + sender, err := Sender(NewCancunSigner(big.NewInt(0)), tx) + if err != nil { + t.Fatalf("Sender: %s", err) + } + + if sender != inner.Sender() { + t.Fatalf("Sender: expected %s got %s", inner.Sender(), sender) + } + + if tx.To() == nil { + t.Fatal("NewGoatTx: nil to address") + } + + raw, err := tx.MarshalBinary() + if err != nil { + t.Fatalf("MarshalBinary: err %s", err) + } + + tx2 := new(Transaction) + if err := tx2.UnmarshalBinary(raw); err != nil { + t.Fatalf("UnmarshalBinary: err %s", err) + } + + { + legacyTx := NewTx(&LegacyTx{}) + if legacyTx.Deposit() != nil { + t.Fatalf("legacyTx.Deposit not nil") + } + if legacyTx.Withdraw() != nil { + t.Fatalf("legacyTx.Withdraw not nil") + } + + alTx := NewTx(&AccessListTx{}) + if alTx.Deposit() != nil { + t.Fatalf("alTx.Deposit not nil") + } + if alTx.Withdraw() != nil { + t.Fatalf("alTx.Withdraw not nil") + } + + tx1559 := NewTx(&DynamicFeeTx{}) + if tx1559.Deposit() != nil { + t.Fatalf("tx1559.Deposit not nil") + } + if tx1559.Withdraw() != nil { + t.Fatalf("tx1559.Withdraw not nil") + } + + blobTx := NewTx(&BlobTx{}) + if blobTx.Deposit() != nil { + t.Fatalf("blobTx.Deposit not nil") + } + if blobTx.Withdraw() != nil { + t.Fatalf("blobTx.Withdraw not nil") + } + + if blobTx.IsMemPoolTx() { + t.Fatalf("blobTx not mempool tx") + } + } +} diff --git a/eth/catalyst/api.go b/eth/catalyst/api.go index 3e45ad9e4f3cb..51865d0a9ea7e 100644 --- a/eth/catalyst/api.go +++ b/eth/catalyst/api.go @@ -38,6 +38,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params/forks" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" @@ -436,6 +437,23 @@ func (api *ConsensusAPI) forkchoiceUpdated(update engine.ForkchoiceStateV1, payl // sealed by the beacon client. The payload will be requested later, and we // will replace it arbitrarily many times in between. if payloadAttributes != nil { + // goat + if d := len(payloadAttributes.GoatTxs); d > params.GoatTxLimitPerBlock { + return engine.STATUS_INVALID, fmt.Errorf("goat tx size too large(size %d)", d) + } + + goatTxs := make([]*types.Transaction, 0, len(payloadAttributes.GoatTxs)) + for i, otx := range payloadAttributes.GoatTxs { + var tx = new(types.Transaction) + if err := tx.UnmarshalBinary(otx); err != nil { + return engine.STATUS_INVALID, fmt.Errorf("not a valid transaction %d: %v", i, err) + } + if !tx.IsGoatTx() { + return engine.STATUS_INVALID, fmt.Errorf("not a goat tx %d", i) + } + goatTxs = append(goatTxs, tx) + } + args := &miner.BuildPayloadArgs{ Parent: update.HeadBlockHash, Timestamp: payloadAttributes.Timestamp, @@ -444,6 +462,8 @@ func (api *ConsensusAPI) forkchoiceUpdated(update engine.ForkchoiceStateV1, payl Withdrawals: payloadAttributes.Withdrawals, BeaconRoot: payloadAttributes.BeaconRoot, Version: payloadVersion, + + GoatTxs: goatTxs, } id := args.Id() // If we already are busy generating this work, then we do not need @@ -634,7 +654,8 @@ func (api *ConsensusAPI) NewPayloadV4(params engine.ExecutableData, versionedHas return engine.PayloadStatusV1{Status: engine.INVALID}, engine.InvalidParams.With(errors.New("nil executionRequests post-prague")) } - if api.eth.BlockChain().Config().LatestFork(params.Timestamp) != forks.Prague { + chainConfig := api.eth.BlockChain().Config() + if chainConfig.Goat == nil && chainConfig.LatestFork(params.Timestamp) != forks.Prague { return engine.PayloadStatusV1{Status: engine.INVALID}, engine.UnsupportedFork.With(errors.New("newPayloadV4 must only be called for prague payloads")) } requests := convertRequests(executionRequests) diff --git a/eth/catalyst/goat.go b/eth/catalyst/goat.go new file mode 100644 index 0000000000000..a2817ff4cb475 --- /dev/null +++ b/eth/catalyst/goat.go @@ -0,0 +1,11 @@ +package catalyst + +import ( + "context" + + "github.com/ethereum/go-ethereum/params" +) + +func (api *ConsensusAPI) GetChainConfig(_ context.Context) (*params.ChainConfig, error) { + return api.eth.BlockChain().Config(), nil +} diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 6b75ab816fa6f..43ae4114dc98d 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -48,10 +48,10 @@ var FullNodeGPO = gasprice.Config{ // Defaults contains default settings for use on the Ethereum main net. var Defaults = Config{ - SyncMode: SnapSync, + SyncMode: FullSync, NetworkId: 0, // enable auto configuration of networkID == chainID - TxLookupLimit: 2350000, - TransactionHistory: 2350000, + TxLookupLimit: 0, + TransactionHistory: 0, StateHistory: params.FullImmutabilityThreshold, DatabaseCache: 512, TrieCleanCache: 154, @@ -65,7 +65,7 @@ var Defaults = Config{ RPCGasCap: 50000000, RPCEVMTimeout: 5 * time.Second, GPO: FullNodeGPO, - RPCTxFeeCap: 1, // 1 ether + RPCTxFeeCap: 0.036, } //go:generate go run github.com/fjl/gencodec -type Config -formats toml -out gen_config.go diff --git a/eth/tracers/internal/tracetest/goat_test.go b/eth/tracers/internal/tracetest/goat_test.go new file mode 100644 index 0000000000000..e2de8cc9c8a44 --- /dev/null +++ b/eth/tracers/internal/tracetest/goat_test.go @@ -0,0 +1,7 @@ +package tracetest + +import "testing" + +func TestGoatCallTracer(t *testing.T) { + testCallTracer("callTracer", "goat_call_tracer", t) +} diff --git a/eth/tracers/internal/tracetest/testdata/goat_call_tracer/deposit.json b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/deposit.json new file mode 100644 index 0000000000000..cf34ca7a0c5ed --- /dev/null +++ b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/deposit.json @@ -0,0 +1,90 @@ +{ + "genesis": { + "baseFeePerGas": "7", + "blobGasUsed": "0", + "difficulty": "0", + "excessBlobGas": "36306944", + "extraData": "0xd983010e00846765746888676f312e32312e308664617277696e", + "gasLimit": "15639172", + "hash": "0xc682259fda061bb9ce8ccb491d5b2d436cb73daf04e1025dd116d045ce4ad28c", + "miner": "0x0000000000000000000000000000000000000000", + "mixHash": "0xae1a5ba939a4c9ac38aabeff361169fb55a6fc2c9511457e0be6eff9514faec0", + "nonce": "0x0000000000000000", + "number": "315", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "stateRoot": "0x577f42ab21ccfd946511c57869ace0bdf7c217c36f02b7cd3459df0ed1cffc1a", + "timestamp": "1709626771", + "withdrawals": [], + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "alloc": { + "BC10000000000000000000000000000000000003": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x60806040526004361061018e575f3560e01c80638da5cb5b116100dc578063b3dd64dd11610087578063b9cf8c8f11610062578063b9cf8c8f14610484578063c19dd32014610528578063c8c3c6b614610547578063f2fde38b14610566575f5ffd5b8063b3dd64dd14610427578063b3f33eda14610446578063b670ab5e14610465575f5ffd5b8063a2215ab4116100b7578063a2215ab4146103e7578063a5517aff146103fc578063a81de86914610414575f5ffd5b80638da5cb5b14610383578063904183cb146103a9578063a0ea8451146103c8575f5ffd5b80634e0cd7991161013c578063715018a611610117578063715018a61461033157806384a64c12146103455780638aa4af8914610364575f5ffd5b80634e0cd7991461027a5780635c6650ac1461028e5780635cc0707614610300575f5ffd5b8063278ecde11161016c578063278ecde1146102075780632eff14ec146102285780633396c80914610247575f5ffd5b806301ffc9a7146101925780631af87ddf146101c65780631ccc92c7146101e8575b5f5ffd5b34801561019d575f5ffd5b506101b16101ac366004611a62565b610585565b60405190151581526020015b60405180910390f35b3480156101d1575f5ffd5b506101da6105d6565b6040519081526020016101bd565b3480156101f3575f5ffd5b506101b1610202366004611aa8565b6105ea565b348015610212575f5ffd5b50610226610221366004611ad2565b610644565b005b348015610233575f5ffd5b50610226610242366004611afa565b610750565b348015610252575f5ffd5b506101da7f000000000000000000000000000000000000000000000000000000000000002081565b348015610285575f5ffd5b506101da610820565b348015610299575f5ffd5b506005546102d29067ffffffffffffffff8082169161ffff68010000000000000000820416916a01000000000000000000009091041683565b6040805167ffffffffffffffff948516815261ffff90931660208401529216918101919091526060016101bd565b34801561030b575f5ffd5b5061031f61031a366004611ad2565b610831565b6040516101bd96959493929190611b27565b34801561033c575f5ffd5b50610226610889565b348015610350575f5ffd5b5061022661035f366004611ad2565b61089c565b34801561036f575f5ffd5b5061022661037e366004611b97565b6109bd565b34801561038e575f5ffd5b505f546040516001600160a01b0390911681526020016101bd565b3480156103b4575f5ffd5b506102266103c3366004611bd5565b610b34565b3480156103d3575f5ffd5b506102266103e2366004611c1f565b610c8e565b3480156103f2575f5ffd5b506101da61012c81565b348015610407575f5ffd5b506101da6402540be40081565b610226610422366004611c38565b610d5f565b348015610432575f5ffd5b50610226610441366004611cb4565b611109565b348015610451575f5ffd5b50610226610460366004611b97565b611316565b348015610470575f5ffd5b5061022661047f366004611cd5565b6114a5565b34801561048f575f5ffd5b506004546104e69060e081901b9067ffffffffffffffff640100000000820481169161ffff6c0100000000000000000000000082048116926e01000000000000000000000000000083041691600160b01b90041685565b604080516001600160e01b0319909616865267ffffffffffffffff948516602087015261ffff938416908601529216606084015216608082015260a0016101bd565b348015610533575f5ffd5b50610226610542366004611ad2565b61161c565b348015610552575f5ffd5b50610226610561366004611c1f565b611714565b348015610571575f5ffd5b50610226610580366004611d0f565b6117eb565b5f6001600160e01b031982166301ffc9a760e01b14806105b557506001600160e01b03198216634388643560e01b145b806105d057506001600160e01b03198216630ff038eb60e31b145b92915050565b6105e76402540be40061012c611d3c565b81565b5f5f838360405160200161061592919091825260e01b6001600160e01b031916602082015260240190565b60408051808303601f1901815291815281516020928301205f908152600690925290205460ff16949350505050565b5f6007828154811061065857610658611d53565b5f9182526020909120600490910201905060038154600160b01b900460ff16600581111561068857610688611b13565b146106a657604051631dd2188d60e31b815260040160405180910390fd5b805476040000000000000000000000000000000000000000000060ff60b01b1982161782556001600160a01b03163381146106f457604051634ca8886760e01b815260040160405180910390fd5b426003830155600282015460018301546107219161071191611d67565b6001600160a01b03831690611828565b60405183907f2e1897b0591d764356194f7a795238a87c1987c7a877568e50d829d547c92b97905f90a2505050565b6107586118c7565b5f8161ffff16116107b05760405162461bcd60e51b815260206004820152600e60248201527f6e756d62657220746f6f206c6f7700000000000000000000000000000000000060448201526064015b60405180910390fd5b600480547fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b61ffff8416908102919091179091556040519081527f30b92002139b64ec601b714d1ecccba1212034e735773b3de088e8876f4dfb659060200160405180910390a150565b6105e76402540be4006103e8611d3c565b60078181548110610840575f80fd5b5f91825260209091206004909102018054600182015460028301546003909301546001600160a01b0383169450600160a01b830461ffff1693600160b01b90930460ff16929086565b6108916118c7565b61089a5f6118f3565b565b6108a733600161195a565b5f600782815481106108bb576108bb611d53565b5f9182526020909120600490910201905060018154600160b01b900460ff1660058111156108eb576108eb611b13565b1461090957604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b0316331461093357604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426109469190611d7a565b101561096557604051633234675360e21b815260040160405180910390fd5b426003820155805460ff60b01b191676020000000000000000000000000000000000000000000017815560405182907f0106f4416537efff55311ef5e2f9c2a48204fcf84731f2b9d5091d23fc52160c905f90a25050565b6109c56118c7565b818161ffff821615610a6557670de0b6b3a76400008167ffffffffffffffff161080156109fb57505f8167ffffffffffffffff16115b8015610a1d5750610a1b6402540be40067ffffffffffffffff8316611da1565b155b610a3a576040516337d4ed5b60e01b815260040160405180910390fd5b6127108261ffff1610610a60576040516337d4ed5b60e01b815260040160405180910390fd5b610a8e565b67ffffffffffffffff811615610a8e576040516337d4ed5b60e01b815260040160405180910390fd5b6005805471ffffffffffffffffffff000000000000000019166801000000000000000061ffff871690810271ffffffffffffffff000000000000000000001916919091176a010000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f59b73ca79bcb3dcb02c4d2b81e1a2da4c9fd9857ed81cfb16c5431b502f8c71b91015b60405180910390a150505050565b3373bc1000000000000000000000000000000000100014610b6857604051634ca8886760e01b815260040160405180910390fd5b5f8585604051602001610b9292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815291815281516020928301205f818152600690935291205490915060ff1615610c095760405162461bcd60e51b815260206004820152600a60248201527f6475706c6963617465640000000000000000000000000000000000000000000060448201526064016107a7565b5f8181526006602052604090819020805460ff19166001179055516001600160a01b038516907f4d2c35ab224c2e654f91bb91c9f4081beef0e0abfc8a59df04254f6d0232213290610c7e90899089908890889093845263ffffffff9290921660208401526040830152606082015260800190565b60405180910390a2505050505050565b610c966118c7565b80670de0b6b3a76400008167ffffffffffffffff16108015610cc85750655af3107a40008167ffffffffffffffff1610155b8015610cea5750610ce86402540be40067ffffffffffffffff8316611da1565b155b610d075760405163aabd5a0960e01b815260040160405180910390fd5b6005805467ffffffffffffffff191667ffffffffffffffff84169081179091556040519081527f69458aa02de2093876897ec9cd5653bbdd83360ef731be0da0e3c94bf9a22dba906020015b60405180910390a15050565b610d6a33600161195a565b81602181118015610d7b5750605b81105b610dc75760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642061646472657373000000000000000000000000000000000060448201526064016107a7565b6040805160608101825260055467ffffffffffffffff80821680845261ffff6801000000000000000084041660208501526a0100000000000000000000909204169282019290925234915f9190831015610e635760405162461bcd60e51b815260206004820152600e60248201527f616d6f756e7420746f6f206c6f7700000000000000000000000000000000000060448201526064016107a7565b602081015161ffff1615610ec957612710816020015161ffff1684610e889190611d3c565b610e929190611db4565b9150806040015167ffffffffffffffff16821115610ebc57806040015167ffffffffffffffff1691505b610ec68284611d7a565b92505b5f610ed96402540be40085611da1565b90508015610efa57610eeb8184611d67565b9250610ef78185611d7a565b93505b5f8661ffff1611610f405760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b610f516402540be40061012c611d3c565b610f5f9061ffff8816611d3c565b610f706402540be4006103e8611d3c565b610f7a9190611d67565b8411610fb75760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b600780546040805160c08101825233815261ffff8a8116602083019081526001938301848152606084018b9052608084018a90524260a085015293850186555f9590955281517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600486020180549651909216600160a01b027fffffffffffffffffffff000000000000000000000000000000000000000000009096166001600160a01b0390911617949094178085559151929390929091829060ff60b01b1916600160b01b83600581111561108f5761108f611b13565b0217905550606082015181600101556080820151816002015560a082015181600301555050336001600160a01b0316817fbe7c38d37e8132b1d2b29509df9bf58cf1126edf2563c00db0ef3a271fb9f35b87878b8e8e6040516110f6959493929190611dc7565b60405180910390a3505050505050505050565b61111433600161195a565b5f6007838154811061112857611128611d53565b5f9182526020909120600490910201905060018154600160b01b900460ff16600581111561115857611158611b13565b1461117657604051631dd2188d60e31b815260040160405180910390fd5b80546001600160a01b031633146111a057604051634ca8886760e01b815260040160405180910390fd5b61012c8160030154426111b39190611d7a565b10156111d257604051633234675360e21b815260040160405180910390fd5b805461ffff600160a01b9091048116908316116112245760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420747820707269636560801b60448201526064016107a7565b6112356402540be40061012c611d3c565b6112439061ffff8416611d3c565b6112546402540be4006103e8611d3c565b61125e9190611d67565b81600101541161129f5760405162461bcd60e51b815260206004820152600c60248201526b756e6166666f726461626c6560a01b60448201526064016107a7565b80547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff841690810291909117825542600383015560405190815283907f19875a7124af51c604454b74336ce2168c45bceade9d9a1e6dfae9ba7d31b7fa9060200160405180910390a2505050565b61131e6118c7565b818161ffff8216156113be57670de0b6b3a76400008167ffffffffffffffff1610801561135457505f8167ffffffffffffffff16115b801561137657506113746402540be40067ffffffffffffffff8316611da1565b155b611393576040516337d4ed5b60e01b815260040160405180910390fd5b6127108261ffff16106113b9576040516337d4ed5b60e01b815260040160405180910390fd5b6113e7565b67ffffffffffffffff8116156113e7576040516337d4ed5b60e01b815260040160405180910390fd5b600480547fffffffffffffffffffff00000000000000000000ffffffffffffffffffffffff166c0100000000000000000000000061ffff87169081027fffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff16919091176e01000000000000000000000000000067ffffffffffffffff8716908102919091179092556040805191825260208201929092527f1007ff7aec53e9626ce51f25d4e093f290f60da8019c8cf489f0ae2f21ebf76a9101610b26565b3373bc10000000000000000000000000000000001000146114d957604051634ca8886760e01b815260040160405180910390fd5b5f600785815481106114ed576114ed611d53565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561151f5761151f611b13565b148061153c5750600281600581111561153a5761153a611b13565b145b611544575f5ffd5b815460ff60b01b1916760500000000000000000000000000000000000000000000178255426003830155600282015480156115975761159773bc1000000000000000000000000000000000000282611828565b60018301546040515f91906115ab90611a56565b82906040518091039083f5915050801580156115c9573d5f5f3e3d5ffd5b50506040805187815263ffffffff8716602082015290810185905287907fb74f5dbf34aabe02f20ff775b898acf1a9f70e4fbd48ad50548acae86e1ccd789060600160405180910390a250505050505050565b3373bc100000000000000000000000000000000010001461165057604051634ca8886760e01b815260040160405180910390fd5b5f6007828154811061166457611664611d53565b5f91825260209091206004909102018054909150600160b01b900460ff16600181600581111561169657611696611b13565b14806116b3575060028160058111156116b1576116b1611b13565b145b6116bb575f5ffd5b815460ff60b01b191676030000000000000000000000000000000000000000000017825542600383015560405183907f829a8683c544ad289ce92d3ce06e9ebad69b18a6916e60ec766c2c217461d8e9905f90a2505050565b61171c6118c7565b80670de0b6b3a76400008167ffffffffffffffff1610801561174e5750655af3107a40008167ffffffffffffffff1610155b8015611770575061176e6402540be40067ffffffffffffffff8316611da1565b155b61178d5760405163aabd5a0960e01b815260040160405180910390fd5b600480546bffffffffffffffff00000000191664010000000067ffffffffffffffff8516908102919091179091556040519081527f7aa20a242ea0b0f7b0141c56aaad636eb2b2077c9c27d09a8282f6931f486a2190602001610d53565b6117f36118c7565b6001600160a01b03811661181c57604051631e4fbdf760e01b81525f60048201526024016107a7565b611825816118f3565b50565b804710156118525760405163cf47918160e01b8152476004820152602481018290526044016107a7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461189b576040519150601f19603f3d011682016040523d82523d5f602084013e6118a0565b606091505b50509050806118c25760405163d6bda27560e01b815260040160405180910390fd5b505050565b5f546001600160a01b0316331461089a5760405163118cdaa760e01b81523360048201526024016107a7565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f0000000000000000000000000000000000000000000000000000000000000000156119d3576001600160a01b0382165f908152600360205260409020544390036119b857604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f036119de575050565b6001544303611a055780600180015f8282546119fa9190611d67565b90915550611a0f9050565b4360015560028190555b6002547f00000000000000000000000000000000000000000000000000000000000000201015611a525760405163a74c1c5f60e01b815260040160405180910390fd5b5050565b600880611e0f83390190565b5f60208284031215611a72575f5ffd5b81356001600160e01b031981168114611a89575f5ffd5b9392505050565b803563ffffffff81168114611aa3575f5ffd5b919050565b5f5f60408385031215611ab9575f5ffd5b82359150611ac960208401611a90565b90509250929050565b5f60208284031215611ae2575f5ffd5b5035919050565b803561ffff81168114611aa3575f5ffd5b5f60208284031215611b0a575f5ffd5b611a8982611ae9565b634e487b7160e01b5f52602160045260245ffd5b6001600160a01b038716815261ffff8616602082015260c0810160068610611b5d57634e487b7160e01b5f52602160045260245ffd5b8560408301528460608301528360808301528260a0830152979650505050505050565b803567ffffffffffffffff81168114611aa3575f5ffd5b5f5f60408385031215611ba8575f5ffd5b611bb183611ae9565b9150611ac960208401611b80565b80356001600160a01b0381168114611aa3575f5ffd5b5f5f5f5f5f60a08688031215611be9575f5ffd5b85359450611bf960208701611a90565b9350611c0760408701611bbf565b94979396509394606081013594506080013592915050565b5f60208284031215611c2f575f5ffd5b611a8982611b80565b5f5f5f60408486031215611c4a575f5ffd5b833567ffffffffffffffff811115611c60575f5ffd5b8401601f81018613611c70575f5ffd5b803567ffffffffffffffff811115611c86575f5ffd5b866020828401011115611c97575f5ffd5b602091820194509250611cab908501611ae9565b90509250925092565b5f5f60408385031215611cc5575f5ffd5b82359150611ac960208401611ae9565b5f5f5f5f60808587031215611ce8575f5ffd5b8435935060208501359250611cff60408601611a90565b9396929550929360600135925050565b5f60208284031215611d1f575f5ffd5b611a8982611bbf565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176105d0576105d0611d28565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105d0576105d0611d28565b818103818111156105d0576105d0611d28565b634e487b7160e01b5f52601260045260245ffd5b5f82611daf57611daf611d8d565b500690565b5f82611dc257611dc2611d8d565b500490565b85815284602082015261ffff8416604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f1916010194935050505056fe608060405230fffea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000100038d7ea4c68000001400005af3107a400047545630", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000071afd498d0000000200005af3107a4000" + } + } + }, + "config": { + "chainId": 48815, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "terminalTotalDifficulty": 0, + "goat": {} + } + }, + "context": { + "number": "316", + "difficulty": "0", + "timestamp": "1729570128", + "gasLimit": "30000000", + "miner": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "7" + }, + "input": "0x60f8a9010180b8a4904183cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000d1b10d13d3c393206ff5c5136c7f86e3ad390ad0000000000000000000000000000000000000000000000000ddd2935029d800000000000000000000000000000000000000000000000000000038d7ea4c68000", + "result": { + "from": "0xbc10000000000000000000000000000000001000", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0xbc10000000000000000000000000000000000003", + "input": "0x904183cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000d1b10d13d3c393206ff5c5136c7f86e3ad390ad0000000000000000000000000000000000000000000000000ddd2935029d800000000000000000000000000000000000000000000000000000038d7ea4c68000", + "calls": [ + { + "from": "0xbc10000000000000000000000000000000000003", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0x0d1b10d13d3c393206ff5c5136c7f86e3ad390ad", + "input": "0x", + "value": "0xddd2935029d8000", + "type": "CALL" + }, + { + "from": "0xbc10000000000000000000000000000000000003", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0xbc10000000000000000000000000000000000002", + "input": "0x", + "value": "0x38d7ea4c68000", + "type": "CALL" + } + ], + "value": "0x0", + "type": "CALL" + } +} diff --git a/eth/tracers/internal/tracetest/testdata/goat_call_tracer/distribute.json b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/distribute.json new file mode 100644 index 0000000000000..dd3eb76ea2a67 --- /dev/null +++ b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/distribute.json @@ -0,0 +1,112 @@ +{ + "genesis": { + "baseFeePerGas": "7", + "blobGasUsed": "0", + "difficulty": "0", + "excessBlobGas": "36306944", + "extraData": "0xd983010e00846765746888676f312e32312e308664617277696e", + "gasLimit": "15639172", + "hash": "0xc682259fda061bb9ce8ccb491d5b2d436cb73daf04e1025dd116d045ce4ad28c", + "miner": "0x0000000000000000000000000000000000000000", + "mixHash": "0xae1a5ba939a4c9ac38aabeff361169fb55a6fc2c9511457e0be6eff9514faec0", + "nonce": "0x0000000000000000", + "number": "315", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "stateRoot": "0x577f42ab21ccfd946511c57869ace0bdf7c217c36f02b7cd3459df0ed1cffc1a", + "timestamp": "1709626771", + "withdrawals": [], + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "alloc": { + "bC10000000000000000000000000000000000001": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b506004361061019a575f3560e01c806370a08231116100e857806395d89b4111610093578063c3cda5201161006e578063c3cda52014610392578063d505accf146103a5578063dd62ed3e146103b8578063f1127ed8146103f0575f5ffd5b806395d89b41146103645780639ab24eb01461036c578063a9059cbb1461037f575f5ffd5b806384b0196e116100c357806384b0196e146103175780638e539e8c1461033257806391ddadf414610345575f5ffd5b806370a08231146102c957806379cc6790146102f15780637ecebe0014610304575f5ffd5b80633a46b1a811610148578063587cde1e11610123578063587cde1e1461024b5780635c19a95c1461028e5780636fcfff45146102a1575f5ffd5b80633a46b1a81461021b57806342966c681461022e5780634bf5d7e914610243575f5ffd5b806323b872dd1161017857806323b872dd146101f1578063313ce567146102045780633644e51514610213575f5ffd5b806306fdde031461019e578063095ea7b3146101bc57806318160ddd146101df575b5f5ffd5b6101a661042f565b6040516101b39190611a59565b60405180910390f35b6101cf6101ca366004611a86565b6104bf565b60405190151581526020016101b3565b6002545b6040519081526020016101b3565b6101cf6101ff366004611aae565b6104d8565b604051601281526020016101b3565b6101e36104fb565b6101e3610229366004611a86565b610509565b61024161023c366004611ae8565b61058d565b005b6101a661059a565b610276610259366004611aff565b6001600160a01b039081165f908152600860205260409020541690565b6040516001600160a01b0390911681526020016101b3565b61024161029c366004611aff565b610612565b6102b46102af366004611aff565b610621565b60405163ffffffff90911681526020016101b3565b6101e36102d7366004611aff565b6001600160a01b03165f9081526020819052604090205490565b6102416102ff366004611a86565b61062b565b6101e3610312366004611aff565b610640565b61031f61064a565b6040516101b39796959493929190611b18565b6101e3610340366004611ae8565b61068c565b61034d6106f5565b60405165ffffffffffff90911681526020016101b3565b6101a66106fe565b6101e361037a366004611aff565b61070d565b6101cf61038d366004611a86565b61073c565b6102416103a0366004611bbe565b610749565b6102416103b3366004611c12565b610805565b6101e36103c6366004611c78565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104036103fe366004611ca9565b61093b565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101b3565b60606003805461043e90611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611ce6565b80156104b55780601f1061048c576101008083540402835291602001916104b5565b820191905f5260205f20905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b5f336104cc818585610975565b60019150505b92915050565b5f336104e5858285610987565b6104f0858585610a02565b506001949350505050565b5f610504610a5f565b905090565b5f5f6105136106f5565b90508065ffffffffffff16831061055357604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044015b60405180910390fd5b61057c61055f84610b88565b6001600160a01b0386165f90815260096020526040902090610bbe565b6001600160d01b0316949350505050565b6105973382610c71565b50565b60606105a4610ca5565b65ffffffffffff166105b46106f5565b65ffffffffffff16146105da576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b3361061d8183610caf565b5050565b5f6104d282610d38565b610636823383610987565b61061d8282610c71565b5f6104d282610d59565b5f6060805f5f5f606061065b610d76565b610663610da3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f6106966106f5565b90508065ffffffffffff1683106106d157604051637669fc0f60e11b81526004810184905265ffffffffffff8216602482015260440161054a565b6106e56106dd84610b88565b600a90610bbe565b6001600160d01b03169392505050565b5f610504610ca5565b60606004805461043e90611ce6565b6001600160a01b0381165f90815260096020526040812061072d90610dd0565b6001600160d01b031692915050565b5f336104cc818585610a02565b8342111561076d57604051632341d78760e11b81526004810185905260240161054a565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906107e6906107de9060a00160405160208183030381529060405280519060200120610e0a565b858585610e36565b90506107f28187610e62565b6107fc8188610caf565b50505050505050565b834211156108295760405163313c898160e11b81526004810185905260240161054a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108748c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108ce82610e0a565b90505f6108dd82878787610e36565b9050896001600160a01b0316816001600160a01b031614610924576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161054a565b61092f8a8a8a610975565b50505050505050505050565b604080518082019091525f80825260208201526109588383610eb4565b9392505050565b5f6109588284611d32565b5f6109588284611d51565b6109828383836001610ee8565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146109fc57818110156109ee57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161054a565b6109fc84848484035f610ee8565b50505050565b6001600160a01b038316610a2b57604051634b637e8f60e11b81525f600482015260240161054a565b6001600160a01b038216610a545760405163ec442f0560e01b81525f600482015260240161054a565b610982838383610fba565b5f306001600160a01b037f0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa316148015610ab757507f000000000000000000000000000000000000000000000000000000000000beaf46145b15610ae157507f218557a47638620aec6dec1f88b9f8271386d1e17b043e0f943e8ec01c2c352890565b610504604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f37c469dadd9df9fb454182ffced72eec76a99c56ccde61f27666b040e87df709918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115610bba576040516306dfcc6560e41b8152603060048201526024810183905260440161054a565b5090565b81545f9081816005811115610c1a575f610bd784610fc5565b610be19085611d70565b5f8881526020902090915081015465ffffffffffff9081169087161015610c0a57809150610c18565b610c15816001611d83565b92505b505b5f610c278787858561112a565b90508015610c6457610c4b87610c3e600184611d70565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610c66565b5f5b979650505050505050565b6001600160a01b038216610c9a57604051634b637e8f60e11b81525f600482015260240161054a565b61061d825f83610fba565b5f61050443610b88565b6001600160a01b038281165f8181526008602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46109828183610d3386611189565b6111a6565b6001600160a01b0381165f908152600960205260408120546104d29061130f565b6001600160a01b0381165f908152600760205260408120546104d2565b60606105047f474f415400000000000000000000000000000000000000000000000000000004600561133f565b60606105047f3100000000000000000000000000000000000000000000000000000000000001600661133f565b80545f908015610e0257610de983610c3e600184611d70565b54660100000000000090046001600160d01b0316610958565b5f9392505050565b5f6104d2610e16610a5f565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610e46888888886113e8565b925092509250610e5682826114b0565b50909695505050505050565b6001600160a01b0382165f908152600760205260409020805460018101909155818114610982576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161054a565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206109589083611568565b6001600160a01b038416610f115760405163e602df0560e01b81525f600482015260240161054a565b6001600160a01b038316610f3a57604051634a1406b160e11b81525f600482015260240161054a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156109fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fac91815260200190565b60405180910390a350505050565b6109828383836115d8565b5f60018211610fd2575090565b8160017001000000000000000000000000000000008210610ff85760809190911c9060401b5b6801000000000000000082106110135760409190911c9060201b5b640100000000821061102a5760209190911c9060101b5b62010000821061103f5760109190911c9060081b5b61010082106110535760089190911c9060041b5b601082106110665760049190911c9060021b5b600482106110725760011b5b600302600190811c9081858161108a5761108a611d96565b048201901c905060018185816110a2576110a2611d96565b048201901c905060018185816110ba576110ba611d96565b048201901c905060018185816110d2576110d2611d96565b048201901c905060018185816110ea576110ea611d96565b048201901c9050600181858161110257611102611d96565b048201901c905061112181858161111b5761111b611d96565b04821190565b90039392505050565b5f5b81831015611181575f61113f848461163e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561116d5780925061117b565b611178816001611d83565b93505b5061112c565b509392505050565b6001600160a01b0381165f908152602081905260408120546104d2565b816001600160a01b0316836001600160a01b0316141580156111c757505f81115b15610982576001600160a01b0383161561126e576001600160a01b0383165f90815260096020526040812081906112099061096a61120486611658565b61168b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611263929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610982576001600160a01b0382165f90815260096020526040812081906112a69061095f61120486611658565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611300929190918252602082015260400190565b60405180910390a25050505050565b5f63ffffffff821115610bba576040516306dfcc6560e41b8152602060048201526024810183905260440161054a565b606060ff831461135957611352836116c3565b90506104d2565b81805461136590611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461139190611ce6565b80156113dc5780601f106113b3576101008083540402835291602001916113dc565b820191905f5260205f20905b8154815290600101906020018083116113bf57829003601f168201915b505050505090506104d2565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561142157505f915060039050826114a6565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611472573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661149d57505f9250600191508290506114a6565b92505f91508190505b9450945094915050565b5f8260038111156114c3576114c3611daa565b036114cc575050565b60018260038111156114e0576114e0611daa565b036114fe5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561151257611512611daa565b036115335760405163fce698f760e01b81526004810182905260240161054a565b600382600381111561154757611547611daa565b0361061d576040516335e2f38360e21b81526004810182905260240161054a565b604080518082019091525f8082526020820152825f018263ffffffff168154811061159557611595611dbe565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6115e3838383611700565b6001600160a01b038316611633575f6115fb60025490565b90506001600160d01b038082111561163057604051630e58ae9360e11b8152600481018390526024810182905260440161054a565b50505b610982838383611826565b5f61164c6002848418611dd2565b61095890848416611d83565b5f6001600160d01b03821115610bba576040516306dfcc6560e41b815260d060048201526024810183905260440161054a565b5f5f6116b66116986106f5565b6116ae6116a488610dd0565b868863ffffffff16565b87919061189b565b915091505b935093915050565b60605f6116cf836118a8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03831661172a578060025f82825461171f9190611d83565b9091555061179a9050565b6001600160a01b0383165f908152602081905260409020548181101561177c5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161054a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b6576002805482900390556117d4565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181991815260200190565b60405180910390a3505050565b6001600160a01b03831661184857611845600a61095f61120484611658565b50505b6001600160a01b03821661186a57611867600a61096a61120484611658565b50505b6001600160a01b038381165f90815260086020526040808220548584168352912054610982929182169116836111a6565b5f806116b68585856118cf565b5f60ff8216601f8111156104d257604051632cd44ac360e21b815260040160405180910390fd5b82545f90819080156119ce575f6118eb87610c3e600185611d70565b805490915065ffffffffffff80821691660100000000000090046001600160d01b031690881682111561193157604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361196d57825465ffffffffffff1666010000000000006001600160d01b038916021783556119c0565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506116bb92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816116bb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109586020830184611a2b565b80356001600160a01b0381168114611a81575f5ffd5b919050565b5f5f60408385031215611a97575f5ffd5b611aa083611a6b565b946020939093013593505050565b5f5f5f60608486031215611ac0575f5ffd5b611ac984611a6b565b9250611ad760208501611a6b565b929592945050506040919091013590565b5f60208284031215611af8575f5ffd5b5035919050565b5f60208284031215611b0f575f5ffd5b61095882611a6b565b60ff60f81b8816815260e060208201525f611b3660e0830189611a2b565b8281036040840152611b488189611a2b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611b9d578351835260209384019390920191600101611b7f565b50909b9a5050505050505050505050565b803560ff81168114611a81575f5ffd5b5f5f5f5f5f5f60c08789031215611bd3575f5ffd5b611bdc87611a6b565b95506020870135945060408701359350611bf860608801611bae565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215611c28575f5ffd5b611c3188611a6b565b9650611c3f60208901611a6b565b95506040880135945060608801359350611c5b60808901611bae565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611c89575f5ffd5b611c9283611a6b565b9150611ca060208401611a6b565b90509250929050565b5f5f60408385031215611cba575f5ffd5b611cc383611a6b565b9150602083013563ffffffff81168114611cdb575f5ffd5b809150509250929050565b600181811c90821680611cfa57607f821691505b602082108103611d1857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160d01b0381811683821601908111156104d2576104d2611d1e565b6001600160d01b0382811682821603908111156104d2576104d2611d1e565b818103818111156104d2576104d2611d1e565b808201808211156104d2576104d2611d1e565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82611dec57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x42df54d978308232df5f7d63c0445e00c9e9f8c4eb4d4c22b0f8badf086d40da": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x540b5a72faa2463ad7b6e96257f3df9adbe15e6f4ef1a160019203de6a3b6c17": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x55b0fb7ee6854a4c90517d06cee035cb67a225460ad0f72a5ba96fbf9c7f69fa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x8cfe215f5f534280f4e9685cff600d40c1ede1d1a99c7bbc5273fd192ed3754e": "0x00000000000000000000000000000000000000000295be96e640669720000000", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000033b2e3c9fd0803ce8000000000000000001", + "0xefb49f92e468cf855f57fd634a2f54d847833aa4a0125060c8f7020cb2790199": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "bC10000000000000000000000000000000000004": { + "balance": "0x8ac7230489e80000", + "nonce": "0x1", + "code": "0x6080604052600436106101d9575f3560e01c80635ba3a6a5116100fd578063bc01763711610092578063e486033911610062578063e4860339146105c4578063e4a28a521461063d578063e6a36cb61461066c578063f2fde38b1461068b575f5ffd5b8063bc01763714610548578063bd12835014610567578063bd9fadb514610586578063daea85c5146105a5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b146104e15780639d879990146104fd578063aa94def21461051c578063af38d7571461052f575f5ffd5b80635ba3a6a51461045c5780635d0341ba1461047b578063715018a6146104b957806380e9071b146104cd575f5ffd5b806323435e2f1161017357806349a0bf8e1161014357806349a0bf8e146103d1578063505bd3da146103e5578063551b3cd21461041057806359e5332d1461043b575f5ffd5b806323435e2f14610341578063293cdbf1146103775780633396c8091461038b578063423905f2146103be575f5ffd5b80631485ff78116101ae5780631485ff78146102a1578063160e3f3d146102c45780631eeea1f3146102e357806321c0b34214610322575f5ffd5b806252c9e1146101dd578062aba51a146101fe578063022914a71461021d57806309e3faa71461026e575b5f5ffd5b3480156101e8575f5ffd5b506101fc6101f73660046125d6565b6106aa565b005b348015610209575f5ffd5b506101fc61021836600461261e565b61078d565b348015610228575f5ffd5b50610251610237366004612666565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610279575f5ffd5b506102517f000000000000000000000000bc1000000000000000000000000000000000000181565b3480156102ac575f5ffd5b506102b660055481565b604051908152602001610265565b3480156102cf575f5ffd5b506101fc6102de366004612686565b6108aa565b3480156102ee575f5ffd5b506103026102fd3660046126b3565b610954565b604080516001600160a01b03938416815292909116602083015201610265565b34801561032d575f5ffd5b506101fc61033c3660046125d6565b610971565b34801561034c575f5ffd5b506102b661035b3660046125d6565b600b60209081525f928352604080842090915290825290205481565b348015610382575f5ffd5b506101fc610a99565b348015610396575f5ffd5b506102b67f000000000000000000000000000000000000000000000000000000000000002081565b6101fc6103cc3660046126db565b610afc565b3480156103dc575f5ffd5b506102b6600881565b3480156103f0575f5ffd5b506102b66103ff366004612666565b600c6020525f908152604090205481565b34801561041b575f5ffd5b506102b661042a366004612666565b600a6020525f908152604090205481565b348015610446575f5ffd5b5061044f610d1c565b6040516102659190612721565b348015610467575f5ffd5b506101fc610476366004612778565b610e0d565b348015610486575f5ffd5b506104a9610495366004612666565b600d6020525f908152604090205460ff1681565b6040519015158152602001610265565b3480156104c4575f5ffd5b506101fc611115565b3480156104d8575f5ffd5b506101fc611128565b3480156104ec575f5ffd5b505f546001600160a01b0316610251565b348015610508575f5ffd5b506101fc6105173660046127b7565b6111bf565b6101fc61052a366004612827565b611450565b34801561053a575f5ffd5b506007546104a99060ff1681565b348015610553575f5ffd5b506101fc6105623660046127b7565b611537565b348015610572575f5ffd5b506101fc610581366004612876565b6115e0565b348015610591575f5ffd5b506101fc6105a036600461289e565b611883565b3480156105b0575f5ffd5b506101fc6105bf366004612666565b611a0b565b3480156105cf575f5ffd5b506106126105de366004612666565b60096020525f908152604090208054600182015460029092015460ff82169261010090920467ffffffffffffffff16919084565b60408051941515855267ffffffffffffffff9093166020850152918301526060820152608001610265565b348015610648575f5ffd5b50610653620f424081565b60405167ffffffffffffffff9091168152602001610265565b348015610677575f5ffd5b506101fc6106863660046128c8565b611a9f565b348015610696575f5ffd5b506101fc6106a5366004612666565b611ce7565b6001600160a01b038083165f90815260086020526040902054839116803381146106f8576040516370a4337d60e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0383166107205760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038481165f8181526008602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fadd4071c89e561d58065ade5130c43b17b1101714bca7d91d2515ba1cb9fc97691015b60405180910390a150505050565b833373bc10000000000000000000000000000000001001146107c25760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561080b57604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556001600160a01b0383161580159061084657505f82115b1561085f5761085f6001600160a01b0384168584611d21565b6040805167ffffffffffffffff87168152602081018490527f31fa984883dfea329532d399d9106031006364f445ef2351a45c0d9cbc4ec72791015b60405180910390a15050505050565b6108b2611d9a565b5f81116108d257604051630dd484e760e41b815260040160405180910390fd5b6109076001600160a01b037f000000000000000000000000bc1000000000000000000000000000000000000116333084611dc6565b8060055f8282546109189190612939565b90915550506040518181527f41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0906020015b60405180910390a150565b5f5f61095f83611dff565b61096884611f17565b91509150915091565b6001600160a01b038083165f90815260086020526040902054839116803381146109ba576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508360016109c88282611f47565b6001600160a01b0385166109ef5760405163f6b2911f60e01b815260040160405180910390fd5b600480547fa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b9167ffffffffffffffff909116905f610a2c8361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508787604051610a899392919067ffffffffffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a1505050505050565b610aa1611d9a565b60075460ff1615610ac55760405163eef336d960e01b815260040160405180910390fd5b6007805460ff191660011790556040517f8b1bc2671f5913bb778240df66342565720db9b7a01e7e78190ae6aa1e4bd0f3905f90a1565b600654610b1c576040516314d2abd360e21b815260040160405180910390fd5b5f610b2685611dff565b90505f468233604051602001610b6593929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b604051602081830303815290604052805190602001209050610b898184878761203f565b6001600160a01b0316610b9b87611f17565b6001600160a01b031614610bc257604051630e751dc360e31b815260040160405180910390fd5b6001600160a01b038281165f9081526008602052604090205483911615610c085760405163107f863360e21b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600d602052604090205460ff1680610c5857505f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff165b8290610c8357604051633e55e12b60e11b81526001600160a01b0390911660048201526024016106ef565b50600654610c9d908390610c98906001612939565b611f47565b6001600160a01b0382165f908152600860205260409081902080546001600160a01b0319163390811790915590517ff3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd91610cfb918591908a90612978565b60405180910390a1610d1482610d0f610d1c565b61206b565b505050505050565b6006546060905f9067ffffffffffffffff811115610d3c57610d3c61299f565b604051908082528060200260200182016040528015610d8057816020015b604080518082019091525f8082526020820152815260200190600190039081610d5a5790505b5090505f5b600654811015610e07575f60068281548110610da357610da36129b3565b5f9182526020808320909101546040805180820182526001600160a01b039092168083528085526009845293206002015491810191909152845191925090849084908110610df357610df36129b3565b602090810291909101015250600101610d85565b50919050565b610e15611d9a565b6001600160a01b0384165f9081526009602052604090205460ff1615610e4e57604051632ae3f45d60e11b815260040160405180910390fd5b6001600160a01b0384161580610ec65750836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906129c7565b60ff166012145b610ee357604051638785ff4f60e01b815260040160405180910390fd5b5f8367ffffffffffffffff16118015610f085750620f424067ffffffffffffffff8416105b610f255760405163018a49e560e01b815260040160405180910390fd5b60408051608081018252600180825267ffffffffffffffff8681166020808501828152858701898152606087018981526001600160a01b038d165f818152600986528a902098518954945168ffffffffffffffffff1990951690151568ffffffffffffffff0019161761010094909716939093029590951787555194860194909455915160029094019390935583519182528101919091527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a1604080516001600160a01b0386168152602081018490527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a1801561110f5781158061103d5750808210155b828290916110675760405163068ade6560e31b8152600481019290925260248201526044016106ef565b505060065460081161108c57604051632970307360e11b815260040160405180910390fd5b600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03861690811790915560408051918252602082018390527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b50505050565b61111d611d9a565b6111265f612380565b565b60075460ff1661114b576040516335b43c0360e11b815260040160405180910390fd5b335f908152600c602052604090205480611178576040516301e1880f60e51b815260040160405180910390fd5b335f818152600c60205260408120556111bc907f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03169083611d21565b50565b6111c7611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661120d5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600960205260409020600201548181036112495760405163aabb9c6360e01b815260040160405180910390fd5b6001600160a01b0383165f81815260096020908152604091829020600201859055815192835282018490527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910160405180910390a1801580156112ac57505f82115b15611325576006546008116112d457604051632970307360e11b815260040160405180910390fd5b50600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091161790555050565b5f8111801561133357505f82115b1561133d57505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611366576113666129b3565b5f918252602090912001546001600160a01b0316036114445760065461138e906001906129e2565b811461140b57600680546113a4906001906129e2565b815481106113b4576113b46129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106113df576113df6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061141c5761141c6129f5565b5f8281526020902081015f1990810180546001600160a01b03191690550190555061144c9050565b60010161133f565b5050565b6001600160a01b038084165f9081526008602052604090205484911680338114611499576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b5084836114a68282611f47565b84158015906114b6575060088511155b6114d357604051632970307360e11b815260040160405180910390fd5b61152e878787808060200260200160405190810160405280939291908181526020015f905b828210156115245761151560408302860136819003810190612a09565b815260200190600101906114f8565b505050505061206b565b50505050505050565b61153f611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff166115855760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f81815260096020908152604091829020600101849055815192835282018390527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a15050565b6115e8611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661162e5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b50620f424067ffffffffffffffff82161061165c5760405163018a49e560e01b815260040160405180910390fd5b604080516001600160a01b038416815267ffffffffffffffff831660208201527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a167ffffffffffffffff8116156116f4576001600160a01b0382165f908152600960205260409020805467ffffffffffffffff83166101000268ffffffffffffffff00199091161790555050565b6001600160a01b0382165f908152600960205260408120600281018054825468ffffffffffffffffff1916835560019092018390559190915515158061173957505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611762576117626129b3565b5f918252602090912001546001600160a01b03160361187b5760065461178a906001906129e2565b811461180757600680546117a0906001906129e2565b815481106117b0576117b06129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106117db576117db6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6006805480611818576118186129f5565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516001600160a01b0388168152918201929092527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b60010161173b565b833373bc10000000000000000000000000000000001001146118b85760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561190157604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556005548311156119355760055492505b82156119c35760075460ff161561197f5761197a6001600160a01b037f000000000000000000000000bc10000000000000000000000000000000000001168585611d21565b6119ac565b6001600160a01b0384165f908152600c6020526040812080548592906119a6908490612939565b90915550505b8260055f8282546119bd91906129e2565b90915550505b6040805167ffffffffffffffff87168152602081018590529081018390527f2b02cde117ae53d66dc4d0bdf72b2146e0e1070c1428d6274b0f98d628ad99c49060600161089b565b611a13611d9a565b6001600160a01b0381165f908152600d602052604090205460ff1615611a4c57604051632ef470fd60e11b815260040160405180910390fd5b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce79101610949565b6001600160a01b038085165f9081526008602052604090205485911680338114611ae8576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508583611af58282611f47565b8415801590611b05575060088511155b611b2257604051632970307360e11b815260040160405180910390fd5b6001600160a01b038716611b495760405163f6b2911f60e01b815260040160405180910390fd5b5f5b85811015611cdc575f878783818110611b6657611b666129b3565b905060400201803603810190611b7c9190612a09565b90505f816020015111611ba257604051630dd484e760e41b815260040160405180910390fd5b6020808201516001600160a01b03808d165f908152600b8452604080822086519093168252919093528220805491929091611bde9084906129e2565b909155505060208082015182516001600160a01b03165f908152600a90925260408220805491929091611c129084906129e2565b9091555050600480547f40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db79167ffffffffffffffff909116905f611c548361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508b8b845f01518560200151604051611ccb95949392919067ffffffffffffffff9590951685526001600160a01b03938416602086015291831660408501529091166060830152608082015260a00190565b60405180910390a150600101611b4b565b505050505050505050565b611cef611d9a565b6001600160a01b038116611d1857604051631e4fbdf760e01b81525f60048201526024016106ef565b6111bc81612380565b6040516001600160a01b03838116602483015260448201839052611d9591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123cf565b505050565b5f546001600160a01b031633146111265760405163118cdaa760e01b81523360048201526024016106ef565b6040516001600160a01b03848116602483015283811660448301526064820183905261110f9186918216906323b872dd90608401611d4e565b5f80602083013560011615611e1857600360f81b611e1e565b600160f91b5b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152843560218201529091505f9060029060410160408051601f1981840301815290829052611e7591612a6b565b602060405180830381855afa158015611e90573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611eb39190612a81565b9050600381604051602001611eca91815260200190565b60408051601f1981840301815290829052611ee491612a6b565b602060405180830381855afa158015611eff573d5f5f3e3d5ffd5b5050604051516001600160a01b031695945050505050565b5f81604051602001611f299190612a98565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000115611fc0576001600160a01b0382165f90815260036020526040902054439003611fa557604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f03611fcb575050565b6001544303611ff25780600180015f828254611fe79190612939565b90915550611ffc9050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561144c5760405163a74c1c5f60e01b815260040160405180910390fd5b5f5f5f5f61204f8888888861243b565b92509250925061205f8282612503565b50909695505050505050565b345f5b825181101561235c575f83828151811061208a5761208a6129b3565b60209081029190910181015180516001600160a01b03165f908152600983526040908190208151608081018352815460ff811615158252610100900467ffffffffffffffff16818601526001820154928101929092526002015460608201529181015190925061210d57604051630dd484e760e41b815260040160405180910390fd5b602081015182519067ffffffffffffffff166121485760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b038087165f908152600b6020908152604080832086519094168352929052205460608201518110156121ce575f81836060015161218d91906129e2565b6020850151855191925082908111156121ca576040516349cd40ff60e01b81526001600160a01b03909216600483015260248201526044016106ef565b5050505b82516001600160a01b031661220e57602083015185811461220557604051630a61be9f60e41b81526004016106ef91815260200190565b505f945061222e565b6020830151835161222e916001600160a01b039091169033903090611dc6565b60208084015184516001600160a01b03165f908152600a90925260408220546122579190612939565b905082604001515f148061226f575080836040015110155b8451604085015190916122a65760405163421dca0560e11b81526001600160a01b03909216600483015260248201526044016106ef565b505083516001600160a01b039081165f908152600a60209081526040808320859055818801518c85168452600b83528184208951909516845293909152812080549091906122f5908490612939565b90915550508351602080860151604080516001600160a01b038d811682529094169284019290925282820152517fec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f39181900360600190a150506001909201915061206e9050565b505f811561110f57604051630a61be9f60e41b81526004016106ef91815260200190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f60205f8451602086015f885af1806123ee576040513d5f823e3d81fd5b50505f513d91508115612405578060011415612412565b6001600160a01b0384163b155b1561110f57604051635274afe760e01b81526001600160a01b03851660048201526024016106ef565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561247457505f915060039050826124f9565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124c5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124f057505f9250600191508290506124f9565b92505f91508190505b9450945094915050565b5f82600381111561251657612516612aa5565b0361251f575050565b600182600381111561253357612533612aa5565b036125515760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561256557612565612aa5565b036125865760405163fce698f760e01b8152600481018290526024016106ef565b600382600381111561259a5761259a612aa5565b0361144c576040516335e2f38360e21b8152600481018290526024016106ef565b80356001600160a01b03811681146125d1575f5ffd5b919050565b5f5f604083850312156125e7575f5ffd5b6125f0836125bb565b91506125fe602084016125bb565b90509250929050565b803567ffffffffffffffff811681146125d1575f5ffd5b5f5f5f5f60808587031215612631575f5ffd5b61263a85612607565b9350612648602086016125bb565b9250612656604086016125bb565b9396929550929360600135925050565b5f60208284031215612676575f5ffd5b61267f826125bb565b9392505050565b5f60208284031215612696575f5ffd5b5035919050565b80604081018310156126ad575f5ffd5b92915050565b5f604082840312156126c3575f5ffd5b61267f838361269d565b60ff811681146111bc575f5ffd5b5f5f5f5f60a085870312156126ee575f5ffd5b6126f8868661269d565b935060408501359250606085013591506080850135612716816126cd565b939692955090935050565b602080825282518282018190525f918401906040840190835b8181101561276d57835180516001600160a01b03168452602090810151818501529093019260409092019160010161273a565b509095945050505050565b5f5f5f5f6080858703121561278b575f5ffd5b612794856125bb565b93506127a260208601612607565b93969395505050506040820135916060013590565b5f5f604083850312156127c8575f5ffd5b6127d1836125bb565b946020939093013593505050565b5f5f83601f8401126127ef575f5ffd5b50813567ffffffffffffffff811115612806575f5ffd5b6020830191508360208260061b8501011115612820575f5ffd5b9250929050565b5f5f5f60408486031215612839575f5ffd5b612842846125bb565b9250602084013567ffffffffffffffff81111561285d575f5ffd5b612869868287016127df565b9497909650939450505050565b5f5f60408385031215612887575f5ffd5b612890836125bb565b91506125fe60208401612607565b5f5f5f5f608085870312156128b1575f5ffd5b6128ba85612607565b93506127a2602086016125bb565b5f5f5f5f606085870312156128db575f5ffd5b6128e4856125bb565b93506128f2602086016125bb565b9250604085013567ffffffffffffffff81111561290d575f5ffd5b612919878288016127df565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126ad576126ad612925565b5f67ffffffffffffffff821667ffffffffffffffff810361296f5761296f612925565b60010192915050565b6001600160a01b038481168252831660208201526080810160408381840137949350505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156129d7575f5ffd5b815161267f816126cd565b818103818111156126ad576126ad612925565b634e487b7160e01b5f52603160045260245ffd5b5f6040828403128015612a1a575f5ffd5b506040805190810167ffffffffffffffff81118282101715612a4a57634e487b7160e01b5f52604160045260245ffd5b604052612a56836125bb565b81526020928301359281019290925250919050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612a91575f5ffd5b5051919050565b6040828237604001919050565b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0d13acf57871ac7f9cb5a329186ae37a4dfd4e617dee2ebbab684b46d75d9ed2": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0x344a0f405a413603c3bef9eae8dae8b6710151a0da8ae38fe8ac9167dacfe84f": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xe3bc585728cfb9d26f5badbad3829b0cb1fa86b3744a0180bfa0b307b1b25a40": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b": "0x00000000000000000000000000000000000000000000000000000000002ee001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c": "0x00000000000000000000000000000000000000000000002b5e3af16b18800000", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf3c61d3b73124820d8a810ab1915a9d8c6bfb75d03344e78e5f73f6d90e1bb8d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "config": { + "chainId": 48815, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "terminalTotalDifficulty": 0, + "goat": {} + } + }, + "context": { + "number": "316", + "difficulty": "0", + "timestamp": "1729570128", + "gasLimit": "30000000", + "miner": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "7" + }, + "input": "0x60f889020280b884bd9fadb500000000000000000000000000000000000000000000000000000000000000030000000000000000000000001254d638c0f781f3a3b2298903ea00b3c36fc7690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00", + "result": { + "from": "0xbc10000000000000000000000000000000001001", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0xbc10000000000000000000000000000000000004", + "input": "0xbd9fadb500000000000000000000000000000000000000000000000000000000000000030000000000000000000000001254d638c0f781f3a3b2298903ea00b3c36fc7690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00", + "output": "0x", + "calls": [ + { + "from": "0xbc10000000000000000000000000000000000004", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0x1254d638c0f781f3a3b2298903ea00b3c36fc769", + "input": "0x", + "value": "0x3b9aca00", + "type": "CALL" + } + ], + "value": "0x0", + "type": "CALL" + } +} diff --git a/eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock-native.json b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock-native.json new file mode 100644 index 0000000000000..253723008def4 --- /dev/null +++ b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock-native.json @@ -0,0 +1,112 @@ +{ + "genesis": { + "baseFeePerGas": "7", + "blobGasUsed": "0", + "difficulty": "0", + "excessBlobGas": "36306944", + "extraData": "0xd983010e00846765746888676f312e32312e308664617277696e", + "gasLimit": "15639172", + "hash": "0xc682259fda061bb9ce8ccb491d5b2d436cb73daf04e1025dd116d045ce4ad28c", + "miner": "0x0000000000000000000000000000000000000000", + "mixHash": "0xae1a5ba939a4c9ac38aabeff361169fb55a6fc2c9511457e0be6eff9514faec0", + "nonce": "0x0000000000000000", + "number": "315", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "stateRoot": "0x577f42ab21ccfd946511c57869ace0bdf7c217c36f02b7cd3459df0ed1cffc1a", + "timestamp": "1709626771", + "withdrawals": [], + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "alloc": { + "bC10000000000000000000000000000000000001": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b506004361061019a575f3560e01c806370a08231116100e857806395d89b4111610093578063c3cda5201161006e578063c3cda52014610392578063d505accf146103a5578063dd62ed3e146103b8578063f1127ed8146103f0575f5ffd5b806395d89b41146103645780639ab24eb01461036c578063a9059cbb1461037f575f5ffd5b806384b0196e116100c357806384b0196e146103175780638e539e8c1461033257806391ddadf414610345575f5ffd5b806370a08231146102c957806379cc6790146102f15780637ecebe0014610304575f5ffd5b80633a46b1a811610148578063587cde1e11610123578063587cde1e1461024b5780635c19a95c1461028e5780636fcfff45146102a1575f5ffd5b80633a46b1a81461021b57806342966c681461022e5780634bf5d7e914610243575f5ffd5b806323b872dd1161017857806323b872dd146101f1578063313ce567146102045780633644e51514610213575f5ffd5b806306fdde031461019e578063095ea7b3146101bc57806318160ddd146101df575b5f5ffd5b6101a661042f565b6040516101b39190611a59565b60405180910390f35b6101cf6101ca366004611a86565b6104bf565b60405190151581526020016101b3565b6002545b6040519081526020016101b3565b6101cf6101ff366004611aae565b6104d8565b604051601281526020016101b3565b6101e36104fb565b6101e3610229366004611a86565b610509565b61024161023c366004611ae8565b61058d565b005b6101a661059a565b610276610259366004611aff565b6001600160a01b039081165f908152600860205260409020541690565b6040516001600160a01b0390911681526020016101b3565b61024161029c366004611aff565b610612565b6102b46102af366004611aff565b610621565b60405163ffffffff90911681526020016101b3565b6101e36102d7366004611aff565b6001600160a01b03165f9081526020819052604090205490565b6102416102ff366004611a86565b61062b565b6101e3610312366004611aff565b610640565b61031f61064a565b6040516101b39796959493929190611b18565b6101e3610340366004611ae8565b61068c565b61034d6106f5565b60405165ffffffffffff90911681526020016101b3565b6101a66106fe565b6101e361037a366004611aff565b61070d565b6101cf61038d366004611a86565b61073c565b6102416103a0366004611bbe565b610749565b6102416103b3366004611c12565b610805565b6101e36103c6366004611c78565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104036103fe366004611ca9565b61093b565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101b3565b60606003805461043e90611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611ce6565b80156104b55780601f1061048c576101008083540402835291602001916104b5565b820191905f5260205f20905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b5f336104cc818585610975565b60019150505b92915050565b5f336104e5858285610987565b6104f0858585610a02565b506001949350505050565b5f610504610a5f565b905090565b5f5f6105136106f5565b90508065ffffffffffff16831061055357604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044015b60405180910390fd5b61057c61055f84610b88565b6001600160a01b0386165f90815260096020526040902090610bbe565b6001600160d01b0316949350505050565b6105973382610c71565b50565b60606105a4610ca5565b65ffffffffffff166105b46106f5565b65ffffffffffff16146105da576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b3361061d8183610caf565b5050565b5f6104d282610d38565b610636823383610987565b61061d8282610c71565b5f6104d282610d59565b5f6060805f5f5f606061065b610d76565b610663610da3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f6106966106f5565b90508065ffffffffffff1683106106d157604051637669fc0f60e11b81526004810184905265ffffffffffff8216602482015260440161054a565b6106e56106dd84610b88565b600a90610bbe565b6001600160d01b03169392505050565b5f610504610ca5565b60606004805461043e90611ce6565b6001600160a01b0381165f90815260096020526040812061072d90610dd0565b6001600160d01b031692915050565b5f336104cc818585610a02565b8342111561076d57604051632341d78760e11b81526004810185905260240161054a565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906107e6906107de9060a00160405160208183030381529060405280519060200120610e0a565b858585610e36565b90506107f28187610e62565b6107fc8188610caf565b50505050505050565b834211156108295760405163313c898160e11b81526004810185905260240161054a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108748c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108ce82610e0a565b90505f6108dd82878787610e36565b9050896001600160a01b0316816001600160a01b031614610924576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161054a565b61092f8a8a8a610975565b50505050505050505050565b604080518082019091525f80825260208201526109588383610eb4565b9392505050565b5f6109588284611d32565b5f6109588284611d51565b6109828383836001610ee8565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146109fc57818110156109ee57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161054a565b6109fc84848484035f610ee8565b50505050565b6001600160a01b038316610a2b57604051634b637e8f60e11b81525f600482015260240161054a565b6001600160a01b038216610a545760405163ec442f0560e01b81525f600482015260240161054a565b610982838383610fba565b5f306001600160a01b037f0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa316148015610ab757507f000000000000000000000000000000000000000000000000000000000000beaf46145b15610ae157507f218557a47638620aec6dec1f88b9f8271386d1e17b043e0f943e8ec01c2c352890565b610504604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f37c469dadd9df9fb454182ffced72eec76a99c56ccde61f27666b040e87df709918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115610bba576040516306dfcc6560e41b8152603060048201526024810183905260440161054a565b5090565b81545f9081816005811115610c1a575f610bd784610fc5565b610be19085611d70565b5f8881526020902090915081015465ffffffffffff9081169087161015610c0a57809150610c18565b610c15816001611d83565b92505b505b5f610c278787858561112a565b90508015610c6457610c4b87610c3e600184611d70565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610c66565b5f5b979650505050505050565b6001600160a01b038216610c9a57604051634b637e8f60e11b81525f600482015260240161054a565b61061d825f83610fba565b5f61050443610b88565b6001600160a01b038281165f8181526008602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46109828183610d3386611189565b6111a6565b6001600160a01b0381165f908152600960205260408120546104d29061130f565b6001600160a01b0381165f908152600760205260408120546104d2565b60606105047f474f415400000000000000000000000000000000000000000000000000000004600561133f565b60606105047f3100000000000000000000000000000000000000000000000000000000000001600661133f565b80545f908015610e0257610de983610c3e600184611d70565b54660100000000000090046001600160d01b0316610958565b5f9392505050565b5f6104d2610e16610a5f565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610e46888888886113e8565b925092509250610e5682826114b0565b50909695505050505050565b6001600160a01b0382165f908152600760205260409020805460018101909155818114610982576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161054a565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206109589083611568565b6001600160a01b038416610f115760405163e602df0560e01b81525f600482015260240161054a565b6001600160a01b038316610f3a57604051634a1406b160e11b81525f600482015260240161054a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156109fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fac91815260200190565b60405180910390a350505050565b6109828383836115d8565b5f60018211610fd2575090565b8160017001000000000000000000000000000000008210610ff85760809190911c9060401b5b6801000000000000000082106110135760409190911c9060201b5b640100000000821061102a5760209190911c9060101b5b62010000821061103f5760109190911c9060081b5b61010082106110535760089190911c9060041b5b601082106110665760049190911c9060021b5b600482106110725760011b5b600302600190811c9081858161108a5761108a611d96565b048201901c905060018185816110a2576110a2611d96565b048201901c905060018185816110ba576110ba611d96565b048201901c905060018185816110d2576110d2611d96565b048201901c905060018185816110ea576110ea611d96565b048201901c9050600181858161110257611102611d96565b048201901c905061112181858161111b5761111b611d96565b04821190565b90039392505050565b5f5b81831015611181575f61113f848461163e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561116d5780925061117b565b611178816001611d83565b93505b5061112c565b509392505050565b6001600160a01b0381165f908152602081905260408120546104d2565b816001600160a01b0316836001600160a01b0316141580156111c757505f81115b15610982576001600160a01b0383161561126e576001600160a01b0383165f90815260096020526040812081906112099061096a61120486611658565b61168b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611263929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610982576001600160a01b0382165f90815260096020526040812081906112a69061095f61120486611658565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611300929190918252602082015260400190565b60405180910390a25050505050565b5f63ffffffff821115610bba576040516306dfcc6560e41b8152602060048201526024810183905260440161054a565b606060ff831461135957611352836116c3565b90506104d2565b81805461136590611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461139190611ce6565b80156113dc5780601f106113b3576101008083540402835291602001916113dc565b820191905f5260205f20905b8154815290600101906020018083116113bf57829003601f168201915b505050505090506104d2565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561142157505f915060039050826114a6565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611472573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661149d57505f9250600191508290506114a6565b92505f91508190505b9450945094915050565b5f8260038111156114c3576114c3611daa565b036114cc575050565b60018260038111156114e0576114e0611daa565b036114fe5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561151257611512611daa565b036115335760405163fce698f760e01b81526004810182905260240161054a565b600382600381111561154757611547611daa565b0361061d576040516335e2f38360e21b81526004810182905260240161054a565b604080518082019091525f8082526020820152825f018263ffffffff168154811061159557611595611dbe565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6115e3838383611700565b6001600160a01b038316611633575f6115fb60025490565b90506001600160d01b038082111561163057604051630e58ae9360e11b8152600481018390526024810182905260440161054a565b50505b610982838383611826565b5f61164c6002848418611dd2565b61095890848416611d83565b5f6001600160d01b03821115610bba576040516306dfcc6560e41b815260d060048201526024810183905260440161054a565b5f5f6116b66116986106f5565b6116ae6116a488610dd0565b868863ffffffff16565b87919061189b565b915091505b935093915050565b60605f6116cf836118a8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03831661172a578060025f82825461171f9190611d83565b9091555061179a9050565b6001600160a01b0383165f908152602081905260409020548181101561177c5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161054a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b6576002805482900390556117d4565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181991815260200190565b60405180910390a3505050565b6001600160a01b03831661184857611845600a61095f61120484611658565b50505b6001600160a01b03821661186a57611867600a61096a61120484611658565b50505b6001600160a01b038381165f90815260086020526040808220548584168352912054610982929182169116836111a6565b5f806116b68585856118cf565b5f60ff8216601f8111156104d257604051632cd44ac360e21b815260040160405180910390fd5b82545f90819080156119ce575f6118eb87610c3e600185611d70565b805490915065ffffffffffff80821691660100000000000090046001600160d01b031690881682111561193157604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361196d57825465ffffffffffff1666010000000000006001600160d01b038916021783556119c0565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506116bb92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816116bb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109586020830184611a2b565b80356001600160a01b0381168114611a81575f5ffd5b919050565b5f5f60408385031215611a97575f5ffd5b611aa083611a6b565b946020939093013593505050565b5f5f5f60608486031215611ac0575f5ffd5b611ac984611a6b565b9250611ad760208501611a6b565b929592945050506040919091013590565b5f60208284031215611af8575f5ffd5b5035919050565b5f60208284031215611b0f575f5ffd5b61095882611a6b565b60ff60f81b8816815260e060208201525f611b3660e0830189611a2b565b8281036040840152611b488189611a2b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611b9d578351835260209384019390920191600101611b7f565b50909b9a5050505050505050505050565b803560ff81168114611a81575f5ffd5b5f5f5f5f5f5f60c08789031215611bd3575f5ffd5b611bdc87611a6b565b95506020870135945060408701359350611bf860608801611bae565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215611c28575f5ffd5b611c3188611a6b565b9650611c3f60208901611a6b565b95506040880135945060608801359350611c5b60808901611bae565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611c89575f5ffd5b611c9283611a6b565b9150611ca060208401611a6b565b90509250929050565b5f5f60408385031215611cba575f5ffd5b611cc383611a6b565b9150602083013563ffffffff81168114611cdb575f5ffd5b809150509250929050565b600181811c90821680611cfa57607f821691505b602082108103611d1857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160d01b0381811683821601908111156104d2576104d2611d1e565b6001600160d01b0382811682821603908111156104d2576104d2611d1e565b818103818111156104d2576104d2611d1e565b808201808211156104d2576104d2611d1e565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82611dec57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x42df54d978308232df5f7d63c0445e00c9e9f8c4eb4d4c22b0f8badf086d40da": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x540b5a72faa2463ad7b6e96257f3df9adbe15e6f4ef1a160019203de6a3b6c17": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x55b0fb7ee6854a4c90517d06cee035cb67a225460ad0f72a5ba96fbf9c7f69fa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x8cfe215f5f534280f4e9685cff600d40c1ede1d1a99c7bbc5273fd192ed3754e": "0x00000000000000000000000000000000000000000295be96e640669720000000", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000033b2e3c9fd0803ce8000000000000000001", + "0xefb49f92e468cf855f57fd634a2f54d847833aa4a0125060c8f7020cb2790199": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "bC10000000000000000000000000000000000004": { + "balance": "0x8ac7230489e80000", + "nonce": "0x1", + "code": "0x6080604052600436106101d9575f3560e01c80635ba3a6a5116100fd578063bc01763711610092578063e486033911610062578063e4860339146105c4578063e4a28a521461063d578063e6a36cb61461066c578063f2fde38b1461068b575f5ffd5b8063bc01763714610548578063bd12835014610567578063bd9fadb514610586578063daea85c5146105a5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b146104e15780639d879990146104fd578063aa94def21461051c578063af38d7571461052f575f5ffd5b80635ba3a6a51461045c5780635d0341ba1461047b578063715018a6146104b957806380e9071b146104cd575f5ffd5b806323435e2f1161017357806349a0bf8e1161014357806349a0bf8e146103d1578063505bd3da146103e5578063551b3cd21461041057806359e5332d1461043b575f5ffd5b806323435e2f14610341578063293cdbf1146103775780633396c8091461038b578063423905f2146103be575f5ffd5b80631485ff78116101ae5780631485ff78146102a1578063160e3f3d146102c45780631eeea1f3146102e357806321c0b34214610322575f5ffd5b806252c9e1146101dd578062aba51a146101fe578063022914a71461021d57806309e3faa71461026e575b5f5ffd5b3480156101e8575f5ffd5b506101fc6101f73660046125d6565b6106aa565b005b348015610209575f5ffd5b506101fc61021836600461261e565b61078d565b348015610228575f5ffd5b50610251610237366004612666565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610279575f5ffd5b506102517f000000000000000000000000bc1000000000000000000000000000000000000181565b3480156102ac575f5ffd5b506102b660055481565b604051908152602001610265565b3480156102cf575f5ffd5b506101fc6102de366004612686565b6108aa565b3480156102ee575f5ffd5b506103026102fd3660046126b3565b610954565b604080516001600160a01b03938416815292909116602083015201610265565b34801561032d575f5ffd5b506101fc61033c3660046125d6565b610971565b34801561034c575f5ffd5b506102b661035b3660046125d6565b600b60209081525f928352604080842090915290825290205481565b348015610382575f5ffd5b506101fc610a99565b348015610396575f5ffd5b506102b67f000000000000000000000000000000000000000000000000000000000000002081565b6101fc6103cc3660046126db565b610afc565b3480156103dc575f5ffd5b506102b6600881565b3480156103f0575f5ffd5b506102b66103ff366004612666565b600c6020525f908152604090205481565b34801561041b575f5ffd5b506102b661042a366004612666565b600a6020525f908152604090205481565b348015610446575f5ffd5b5061044f610d1c565b6040516102659190612721565b348015610467575f5ffd5b506101fc610476366004612778565b610e0d565b348015610486575f5ffd5b506104a9610495366004612666565b600d6020525f908152604090205460ff1681565b6040519015158152602001610265565b3480156104c4575f5ffd5b506101fc611115565b3480156104d8575f5ffd5b506101fc611128565b3480156104ec575f5ffd5b505f546001600160a01b0316610251565b348015610508575f5ffd5b506101fc6105173660046127b7565b6111bf565b6101fc61052a366004612827565b611450565b34801561053a575f5ffd5b506007546104a99060ff1681565b348015610553575f5ffd5b506101fc6105623660046127b7565b611537565b348015610572575f5ffd5b506101fc610581366004612876565b6115e0565b348015610591575f5ffd5b506101fc6105a036600461289e565b611883565b3480156105b0575f5ffd5b506101fc6105bf366004612666565b611a0b565b3480156105cf575f5ffd5b506106126105de366004612666565b60096020525f908152604090208054600182015460029092015460ff82169261010090920467ffffffffffffffff16919084565b60408051941515855267ffffffffffffffff9093166020850152918301526060820152608001610265565b348015610648575f5ffd5b50610653620f424081565b60405167ffffffffffffffff9091168152602001610265565b348015610677575f5ffd5b506101fc6106863660046128c8565b611a9f565b348015610696575f5ffd5b506101fc6106a5366004612666565b611ce7565b6001600160a01b038083165f90815260086020526040902054839116803381146106f8576040516370a4337d60e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0383166107205760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038481165f8181526008602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fadd4071c89e561d58065ade5130c43b17b1101714bca7d91d2515ba1cb9fc97691015b60405180910390a150505050565b833373bc10000000000000000000000000000000001001146107c25760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561080b57604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556001600160a01b0383161580159061084657505f82115b1561085f5761085f6001600160a01b0384168584611d21565b6040805167ffffffffffffffff87168152602081018490527f31fa984883dfea329532d399d9106031006364f445ef2351a45c0d9cbc4ec72791015b60405180910390a15050505050565b6108b2611d9a565b5f81116108d257604051630dd484e760e41b815260040160405180910390fd5b6109076001600160a01b037f000000000000000000000000bc1000000000000000000000000000000000000116333084611dc6565b8060055f8282546109189190612939565b90915550506040518181527f41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0906020015b60405180910390a150565b5f5f61095f83611dff565b61096884611f17565b91509150915091565b6001600160a01b038083165f90815260086020526040902054839116803381146109ba576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508360016109c88282611f47565b6001600160a01b0385166109ef5760405163f6b2911f60e01b815260040160405180910390fd5b600480547fa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b9167ffffffffffffffff909116905f610a2c8361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508787604051610a899392919067ffffffffffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a1505050505050565b610aa1611d9a565b60075460ff1615610ac55760405163eef336d960e01b815260040160405180910390fd5b6007805460ff191660011790556040517f8b1bc2671f5913bb778240df66342565720db9b7a01e7e78190ae6aa1e4bd0f3905f90a1565b600654610b1c576040516314d2abd360e21b815260040160405180910390fd5b5f610b2685611dff565b90505f468233604051602001610b6593929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b604051602081830303815290604052805190602001209050610b898184878761203f565b6001600160a01b0316610b9b87611f17565b6001600160a01b031614610bc257604051630e751dc360e31b815260040160405180910390fd5b6001600160a01b038281165f9081526008602052604090205483911615610c085760405163107f863360e21b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600d602052604090205460ff1680610c5857505f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff165b8290610c8357604051633e55e12b60e11b81526001600160a01b0390911660048201526024016106ef565b50600654610c9d908390610c98906001612939565b611f47565b6001600160a01b0382165f908152600860205260409081902080546001600160a01b0319163390811790915590517ff3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd91610cfb918591908a90612978565b60405180910390a1610d1482610d0f610d1c565b61206b565b505050505050565b6006546060905f9067ffffffffffffffff811115610d3c57610d3c61299f565b604051908082528060200260200182016040528015610d8057816020015b604080518082019091525f8082526020820152815260200190600190039081610d5a5790505b5090505f5b600654811015610e07575f60068281548110610da357610da36129b3565b5f9182526020808320909101546040805180820182526001600160a01b039092168083528085526009845293206002015491810191909152845191925090849084908110610df357610df36129b3565b602090810291909101015250600101610d85565b50919050565b610e15611d9a565b6001600160a01b0384165f9081526009602052604090205460ff1615610e4e57604051632ae3f45d60e11b815260040160405180910390fd5b6001600160a01b0384161580610ec65750836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906129c7565b60ff166012145b610ee357604051638785ff4f60e01b815260040160405180910390fd5b5f8367ffffffffffffffff16118015610f085750620f424067ffffffffffffffff8416105b610f255760405163018a49e560e01b815260040160405180910390fd5b60408051608081018252600180825267ffffffffffffffff8681166020808501828152858701898152606087018981526001600160a01b038d165f818152600986528a902098518954945168ffffffffffffffffff1990951690151568ffffffffffffffff0019161761010094909716939093029590951787555194860194909455915160029094019390935583519182528101919091527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a1604080516001600160a01b0386168152602081018490527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a1801561110f5781158061103d5750808210155b828290916110675760405163068ade6560e31b8152600481019290925260248201526044016106ef565b505060065460081161108c57604051632970307360e11b815260040160405180910390fd5b600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03861690811790915560408051918252602082018390527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b50505050565b61111d611d9a565b6111265f612380565b565b60075460ff1661114b576040516335b43c0360e11b815260040160405180910390fd5b335f908152600c602052604090205480611178576040516301e1880f60e51b815260040160405180910390fd5b335f818152600c60205260408120556111bc907f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03169083611d21565b50565b6111c7611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661120d5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600960205260409020600201548181036112495760405163aabb9c6360e01b815260040160405180910390fd5b6001600160a01b0383165f81815260096020908152604091829020600201859055815192835282018490527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910160405180910390a1801580156112ac57505f82115b15611325576006546008116112d457604051632970307360e11b815260040160405180910390fd5b50600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091161790555050565b5f8111801561133357505f82115b1561133d57505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611366576113666129b3565b5f918252602090912001546001600160a01b0316036114445760065461138e906001906129e2565b811461140b57600680546113a4906001906129e2565b815481106113b4576113b46129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106113df576113df6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061141c5761141c6129f5565b5f8281526020902081015f1990810180546001600160a01b03191690550190555061144c9050565b60010161133f565b5050565b6001600160a01b038084165f9081526008602052604090205484911680338114611499576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b5084836114a68282611f47565b84158015906114b6575060088511155b6114d357604051632970307360e11b815260040160405180910390fd5b61152e878787808060200260200160405190810160405280939291908181526020015f905b828210156115245761151560408302860136819003810190612a09565b815260200190600101906114f8565b505050505061206b565b50505050505050565b61153f611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff166115855760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f81815260096020908152604091829020600101849055815192835282018390527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a15050565b6115e8611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661162e5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b50620f424067ffffffffffffffff82161061165c5760405163018a49e560e01b815260040160405180910390fd5b604080516001600160a01b038416815267ffffffffffffffff831660208201527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a167ffffffffffffffff8116156116f4576001600160a01b0382165f908152600960205260409020805467ffffffffffffffff83166101000268ffffffffffffffff00199091161790555050565b6001600160a01b0382165f908152600960205260408120600281018054825468ffffffffffffffffff1916835560019092018390559190915515158061173957505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611762576117626129b3565b5f918252602090912001546001600160a01b03160361187b5760065461178a906001906129e2565b811461180757600680546117a0906001906129e2565b815481106117b0576117b06129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106117db576117db6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6006805480611818576118186129f5565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516001600160a01b0388168152918201929092527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b60010161173b565b833373bc10000000000000000000000000000000001001146118b85760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561190157604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556005548311156119355760055492505b82156119c35760075460ff161561197f5761197a6001600160a01b037f000000000000000000000000bc10000000000000000000000000000000000001168585611d21565b6119ac565b6001600160a01b0384165f908152600c6020526040812080548592906119a6908490612939565b90915550505b8260055f8282546119bd91906129e2565b90915550505b6040805167ffffffffffffffff87168152602081018590529081018390527f2b02cde117ae53d66dc4d0bdf72b2146e0e1070c1428d6274b0f98d628ad99c49060600161089b565b611a13611d9a565b6001600160a01b0381165f908152600d602052604090205460ff1615611a4c57604051632ef470fd60e11b815260040160405180910390fd5b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce79101610949565b6001600160a01b038085165f9081526008602052604090205485911680338114611ae8576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508583611af58282611f47565b8415801590611b05575060088511155b611b2257604051632970307360e11b815260040160405180910390fd5b6001600160a01b038716611b495760405163f6b2911f60e01b815260040160405180910390fd5b5f5b85811015611cdc575f878783818110611b6657611b666129b3565b905060400201803603810190611b7c9190612a09565b90505f816020015111611ba257604051630dd484e760e41b815260040160405180910390fd5b6020808201516001600160a01b03808d165f908152600b8452604080822086519093168252919093528220805491929091611bde9084906129e2565b909155505060208082015182516001600160a01b03165f908152600a90925260408220805491929091611c129084906129e2565b9091555050600480547f40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db79167ffffffffffffffff909116905f611c548361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508b8b845f01518560200151604051611ccb95949392919067ffffffffffffffff9590951685526001600160a01b03938416602086015291831660408501529091166060830152608082015260a00190565b60405180910390a150600101611b4b565b505050505050505050565b611cef611d9a565b6001600160a01b038116611d1857604051631e4fbdf760e01b81525f60048201526024016106ef565b6111bc81612380565b6040516001600160a01b03838116602483015260448201839052611d9591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123cf565b505050565b5f546001600160a01b031633146111265760405163118cdaa760e01b81523360048201526024016106ef565b6040516001600160a01b03848116602483015283811660448301526064820183905261110f9186918216906323b872dd90608401611d4e565b5f80602083013560011615611e1857600360f81b611e1e565b600160f91b5b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152843560218201529091505f9060029060410160408051601f1981840301815290829052611e7591612a6b565b602060405180830381855afa158015611e90573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611eb39190612a81565b9050600381604051602001611eca91815260200190565b60408051601f1981840301815290829052611ee491612a6b565b602060405180830381855afa158015611eff573d5f5f3e3d5ffd5b5050604051516001600160a01b031695945050505050565b5f81604051602001611f299190612a98565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000115611fc0576001600160a01b0382165f90815260036020526040902054439003611fa557604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f03611fcb575050565b6001544303611ff25780600180015f828254611fe79190612939565b90915550611ffc9050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561144c5760405163a74c1c5f60e01b815260040160405180910390fd5b5f5f5f5f61204f8888888861243b565b92509250925061205f8282612503565b50909695505050505050565b345f5b825181101561235c575f83828151811061208a5761208a6129b3565b60209081029190910181015180516001600160a01b03165f908152600983526040908190208151608081018352815460ff811615158252610100900467ffffffffffffffff16818601526001820154928101929092526002015460608201529181015190925061210d57604051630dd484e760e41b815260040160405180910390fd5b602081015182519067ffffffffffffffff166121485760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b038087165f908152600b6020908152604080832086519094168352929052205460608201518110156121ce575f81836060015161218d91906129e2565b6020850151855191925082908111156121ca576040516349cd40ff60e01b81526001600160a01b03909216600483015260248201526044016106ef565b5050505b82516001600160a01b031661220e57602083015185811461220557604051630a61be9f60e41b81526004016106ef91815260200190565b505f945061222e565b6020830151835161222e916001600160a01b039091169033903090611dc6565b60208084015184516001600160a01b03165f908152600a90925260408220546122579190612939565b905082604001515f148061226f575080836040015110155b8451604085015190916122a65760405163421dca0560e11b81526001600160a01b03909216600483015260248201526044016106ef565b505083516001600160a01b039081165f908152600a60209081526040808320859055818801518c85168452600b83528184208951909516845293909152812080549091906122f5908490612939565b90915550508351602080860151604080516001600160a01b038d811682529094169284019290925282820152517fec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f39181900360600190a150506001909201915061206e9050565b505f811561110f57604051630a61be9f60e41b81526004016106ef91815260200190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f60205f8451602086015f885af1806123ee576040513d5f823e3d81fd5b50505f513d91508115612405578060011415612412565b6001600160a01b0384163b155b1561110f57604051635274afe760e01b81526001600160a01b03851660048201526024016106ef565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561247457505f915060039050826124f9565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124c5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124f057505f9250600191508290506124f9565b92505f91508190505b9450945094915050565b5f82600381111561251657612516612aa5565b0361251f575050565b600182600381111561253357612533612aa5565b036125515760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561256557612565612aa5565b036125865760405163fce698f760e01b8152600481018290526024016106ef565b600382600381111561259a5761259a612aa5565b0361144c576040516335e2f38360e21b8152600481018290526024016106ef565b80356001600160a01b03811681146125d1575f5ffd5b919050565b5f5f604083850312156125e7575f5ffd5b6125f0836125bb565b91506125fe602084016125bb565b90509250929050565b803567ffffffffffffffff811681146125d1575f5ffd5b5f5f5f5f60808587031215612631575f5ffd5b61263a85612607565b9350612648602086016125bb565b9250612656604086016125bb565b9396929550929360600135925050565b5f60208284031215612676575f5ffd5b61267f826125bb565b9392505050565b5f60208284031215612696575f5ffd5b5035919050565b80604081018310156126ad575f5ffd5b92915050565b5f604082840312156126c3575f5ffd5b61267f838361269d565b60ff811681146111bc575f5ffd5b5f5f5f5f60a085870312156126ee575f5ffd5b6126f8868661269d565b935060408501359250606085013591506080850135612716816126cd565b939692955090935050565b602080825282518282018190525f918401906040840190835b8181101561276d57835180516001600160a01b03168452602090810151818501529093019260409092019160010161273a565b509095945050505050565b5f5f5f5f6080858703121561278b575f5ffd5b612794856125bb565b93506127a260208601612607565b93969395505050506040820135916060013590565b5f5f604083850312156127c8575f5ffd5b6127d1836125bb565b946020939093013593505050565b5f5f83601f8401126127ef575f5ffd5b50813567ffffffffffffffff811115612806575f5ffd5b6020830191508360208260061b8501011115612820575f5ffd5b9250929050565b5f5f5f60408486031215612839575f5ffd5b612842846125bb565b9250602084013567ffffffffffffffff81111561285d575f5ffd5b612869868287016127df565b9497909650939450505050565b5f5f60408385031215612887575f5ffd5b612890836125bb565b91506125fe60208401612607565b5f5f5f5f608085870312156128b1575f5ffd5b6128ba85612607565b93506127a2602086016125bb565b5f5f5f5f606085870312156128db575f5ffd5b6128e4856125bb565b93506128f2602086016125bb565b9250604085013567ffffffffffffffff81111561290d575f5ffd5b612919878288016127df565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126ad576126ad612925565b5f67ffffffffffffffff821667ffffffffffffffff810361296f5761296f612925565b60010192915050565b6001600160a01b038481168252831660208201526080810160408381840137949350505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156129d7575f5ffd5b815161267f816126cd565b818103818111156126ad576126ad612925565b634e487b7160e01b5f52603160045260245ffd5b5f6040828403128015612a1a575f5ffd5b506040805190810167ffffffffffffffff81118282101715612a4a57634e487b7160e01b5f52604160045260245ffd5b604052612a56836125bb565b81526020928301359281019290925250919050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612a91575f5ffd5b5051919050565b6040828237604001919050565b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0d13acf57871ac7f9cb5a329186ae37a4dfd4e617dee2ebbab684b46d75d9ed2": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0x344a0f405a413603c3bef9eae8dae8b6710151a0da8ae38fe8ac9167dacfe84f": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xe3bc585728cfb9d26f5badbad3829b0cb1fa86b3744a0180bfa0b307b1b25a40": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b": "0x00000000000000000000000000000000000000000000000000000000002ee001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c": "0x00000000000000000000000000000000000000000000002b5e3af16b18800000", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf3c61d3b73124820d8a810ab1915a9d8c6bfb75d03344e78e5f73f6d90e1bb8d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "config": { + "chainId": 48815, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "terminalTotalDifficulty": 0, + "goat": {} + } + }, + "context": { + "number": "316", + "difficulty": "0", + "timestamp": "1729570128", + "gasLimit": "30000000", + "miner": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "7" + }, + "input": "0x60f889020180b88400aba51a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000001abd100f66ab25647a1c4baed7990df7b97d7dae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00", + "result": { + "from": "0xbc10000000000000000000000000000000001001", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0xbc10000000000000000000000000000000000004", + "input": "0x00aba51a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000001abd100f66ab25647a1c4baed7990df7b97d7dae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b9aca00", + "output": "0x", + "calls": [ + { + "from": "0xbc10000000000000000000000000000000000004", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0x1abd100f66ab25647a1c4baed7990df7b97d7dae", + "input": "0x", + "value": "0x3b9aca00", + "type": "CALL" + } + ], + "value": "0x0", + "type": "CALL" + } +} diff --git a/eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock.json b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock.json new file mode 100644 index 0000000000000..5137a89bdd7e7 --- /dev/null +++ b/eth/tracers/internal/tracetest/testdata/goat_call_tracer/unlock.json @@ -0,0 +1,112 @@ +{ + "genesis": { + "baseFeePerGas": "7", + "blobGasUsed": "0", + "difficulty": "0", + "excessBlobGas": "36306944", + "extraData": "0xd983010e00846765746888676f312e32312e308664617277696e", + "gasLimit": "15639172", + "hash": "0xc682259fda061bb9ce8ccb491d5b2d436cb73daf04e1025dd116d045ce4ad28c", + "miner": "0x0000000000000000000000000000000000000000", + "mixHash": "0xae1a5ba939a4c9ac38aabeff361169fb55a6fc2c9511457e0be6eff9514faec0", + "nonce": "0x0000000000000000", + "number": "315", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "stateRoot": "0x577f42ab21ccfd946511c57869ace0bdf7c217c36f02b7cd3459df0ed1cffc1a", + "timestamp": "1709626771", + "withdrawals": [], + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "alloc": { + "bC10000000000000000000000000000000000001": { + "balance": "0x0", + "nonce": "0x1", + "code": "0x608060405234801561000f575f5ffd5b506004361061019a575f3560e01c806370a08231116100e857806395d89b4111610093578063c3cda5201161006e578063c3cda52014610392578063d505accf146103a5578063dd62ed3e146103b8578063f1127ed8146103f0575f5ffd5b806395d89b41146103645780639ab24eb01461036c578063a9059cbb1461037f575f5ffd5b806384b0196e116100c357806384b0196e146103175780638e539e8c1461033257806391ddadf414610345575f5ffd5b806370a08231146102c957806379cc6790146102f15780637ecebe0014610304575f5ffd5b80633a46b1a811610148578063587cde1e11610123578063587cde1e1461024b5780635c19a95c1461028e5780636fcfff45146102a1575f5ffd5b80633a46b1a81461021b57806342966c681461022e5780634bf5d7e914610243575f5ffd5b806323b872dd1161017857806323b872dd146101f1578063313ce567146102045780633644e51514610213575f5ffd5b806306fdde031461019e578063095ea7b3146101bc57806318160ddd146101df575b5f5ffd5b6101a661042f565b6040516101b39190611a59565b60405180910390f35b6101cf6101ca366004611a86565b6104bf565b60405190151581526020016101b3565b6002545b6040519081526020016101b3565b6101cf6101ff366004611aae565b6104d8565b604051601281526020016101b3565b6101e36104fb565b6101e3610229366004611a86565b610509565b61024161023c366004611ae8565b61058d565b005b6101a661059a565b610276610259366004611aff565b6001600160a01b039081165f908152600860205260409020541690565b6040516001600160a01b0390911681526020016101b3565b61024161029c366004611aff565b610612565b6102b46102af366004611aff565b610621565b60405163ffffffff90911681526020016101b3565b6101e36102d7366004611aff565b6001600160a01b03165f9081526020819052604090205490565b6102416102ff366004611a86565b61062b565b6101e3610312366004611aff565b610640565b61031f61064a565b6040516101b39796959493929190611b18565b6101e3610340366004611ae8565b61068c565b61034d6106f5565b60405165ffffffffffff90911681526020016101b3565b6101a66106fe565b6101e361037a366004611aff565b61070d565b6101cf61038d366004611a86565b61073c565b6102416103a0366004611bbe565b610749565b6102416103b3366004611c12565b610805565b6101e36103c6366004611c78565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104036103fe366004611ca9565b61093b565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101b3565b60606003805461043e90611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611ce6565b80156104b55780601f1061048c576101008083540402835291602001916104b5565b820191905f5260205f20905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b5f336104cc818585610975565b60019150505b92915050565b5f336104e5858285610987565b6104f0858585610a02565b506001949350505050565b5f610504610a5f565b905090565b5f5f6105136106f5565b90508065ffffffffffff16831061055357604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044015b60405180910390fd5b61057c61055f84610b88565b6001600160a01b0386165f90815260096020526040902090610bbe565b6001600160d01b0316949350505050565b6105973382610c71565b50565b60606105a4610ca5565b65ffffffffffff166105b46106f5565b65ffffffffffff16146105da576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b3361061d8183610caf565b5050565b5f6104d282610d38565b610636823383610987565b61061d8282610c71565b5f6104d282610d59565b5f6060805f5f5f606061065b610d76565b610663610da3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f5f6106966106f5565b90508065ffffffffffff1683106106d157604051637669fc0f60e11b81526004810184905265ffffffffffff8216602482015260440161054a565b6106e56106dd84610b88565b600a90610bbe565b6001600160d01b03169392505050565b5f610504610ca5565b60606004805461043e90611ce6565b6001600160a01b0381165f90815260096020526040812061072d90610dd0565b6001600160d01b031692915050565b5f336104cc818585610a02565b8342111561076d57604051632341d78760e11b81526004810185905260240161054a565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906107e6906107de9060a00160405160208183030381529060405280519060200120610e0a565b858585610e36565b90506107f28187610e62565b6107fc8188610caf565b50505050505050565b834211156108295760405163313c898160e11b81526004810185905260240161054a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108748c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108ce82610e0a565b90505f6108dd82878787610e36565b9050896001600160a01b0316816001600160a01b031614610924576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161054a565b61092f8a8a8a610975565b50505050505050505050565b604080518082019091525f80825260208201526109588383610eb4565b9392505050565b5f6109588284611d32565b5f6109588284611d51565b6109828383836001610ee8565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146109fc57818110156109ee57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161054a565b6109fc84848484035f610ee8565b50505050565b6001600160a01b038316610a2b57604051634b637e8f60e11b81525f600482015260240161054a565b6001600160a01b038216610a545760405163ec442f0560e01b81525f600482015260240161054a565b610982838383610fba565b5f306001600160a01b037f0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa316148015610ab757507f000000000000000000000000000000000000000000000000000000000000beaf46145b15610ae157507f218557a47638620aec6dec1f88b9f8271386d1e17b043e0f943e8ec01c2c352890565b610504604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f37c469dadd9df9fb454182ffced72eec76a99c56ccde61f27666b040e87df709918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b5f65ffffffffffff821115610bba576040516306dfcc6560e41b8152603060048201526024810183905260440161054a565b5090565b81545f9081816005811115610c1a575f610bd784610fc5565b610be19085611d70565b5f8881526020902090915081015465ffffffffffff9081169087161015610c0a57809150610c18565b610c15816001611d83565b92505b505b5f610c278787858561112a565b90508015610c6457610c4b87610c3e600184611d70565b5f91825260209091200190565b54660100000000000090046001600160d01b0316610c66565b5f5b979650505050505050565b6001600160a01b038216610c9a57604051634b637e8f60e11b81525f600482015260240161054a565b61061d825f83610fba565b5f61050443610b88565b6001600160a01b038281165f8181526008602052604080822080548686167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46109828183610d3386611189565b6111a6565b6001600160a01b0381165f908152600960205260408120546104d29061130f565b6001600160a01b0381165f908152600760205260408120546104d2565b60606105047f474f415400000000000000000000000000000000000000000000000000000004600561133f565b60606105047f3100000000000000000000000000000000000000000000000000000000000001600661133f565b80545f908015610e0257610de983610c3e600184611d70565b54660100000000000090046001600160d01b0316610958565b5f9392505050565b5f6104d2610e16610a5f565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f610e46888888886113e8565b925092509250610e5682826114b0565b50909695505050505050565b6001600160a01b0382165f908152600760205260409020805460018101909155818114610982576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161054a565b604080518082019091525f80825260208201526001600160a01b0383165f9081526009602052604090206109589083611568565b6001600160a01b038416610f115760405163e602df0560e01b81525f600482015260240161054a565b6001600160a01b038316610f3a57604051634a1406b160e11b81525f600482015260240161054a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156109fc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fac91815260200190565b60405180910390a350505050565b6109828383836115d8565b5f60018211610fd2575090565b8160017001000000000000000000000000000000008210610ff85760809190911c9060401b5b6801000000000000000082106110135760409190911c9060201b5b640100000000821061102a5760209190911c9060101b5b62010000821061103f5760109190911c9060081b5b61010082106110535760089190911c9060041b5b601082106110665760049190911c9060021b5b600482106110725760011b5b600302600190811c9081858161108a5761108a611d96565b048201901c905060018185816110a2576110a2611d96565b048201901c905060018185816110ba576110ba611d96565b048201901c905060018185816110d2576110d2611d96565b048201901c905060018185816110ea576110ea611d96565b048201901c9050600181858161110257611102611d96565b048201901c905061112181858161111b5761111b611d96565b04821190565b90039392505050565b5f5b81831015611181575f61113f848461163e565b5f8781526020902090915065ffffffffffff86169082015465ffffffffffff16111561116d5780925061117b565b611178816001611d83565b93505b5061112c565b509392505050565b6001600160a01b0381165f908152602081905260408120546104d2565b816001600160a01b0316836001600160a01b0316141580156111c757505f81115b15610982576001600160a01b0383161561126e576001600160a01b0383165f90815260096020526040812081906112099061096a61120486611658565b61168b565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611263929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610982576001600160a01b0382165f90815260096020526040812081906112a69061095f61120486611658565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611300929190918252602082015260400190565b60405180910390a25050505050565b5f63ffffffff821115610bba576040516306dfcc6560e41b8152602060048201526024810183905260440161054a565b606060ff831461135957611352836116c3565b90506104d2565b81805461136590611ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461139190611ce6565b80156113dc5780601f106113b3576101008083540402835291602001916113dc565b820191905f5260205f20905b8154815290600101906020018083116113bf57829003601f168201915b505050505090506104d2565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561142157505f915060039050826114a6565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611472573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661149d57505f9250600191508290506114a6565b92505f91508190505b9450945094915050565b5f8260038111156114c3576114c3611daa565b036114cc575050565b60018260038111156114e0576114e0611daa565b036114fe5760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561151257611512611daa565b036115335760405163fce698f760e01b81526004810182905260240161054a565b600382600381111561154757611547611daa565b0361061d576040516335e2f38360e21b81526004810182905260240161054a565b604080518082019091525f8082526020820152825f018263ffffffff168154811061159557611595611dbe565b5f9182526020918290206040805180820190915291015465ffffffffffff81168252660100000000000090046001600160d01b0316918101919091529392505050565b6115e3838383611700565b6001600160a01b038316611633575f6115fb60025490565b90506001600160d01b038082111561163057604051630e58ae9360e11b8152600481018390526024810182905260440161054a565b50505b610982838383611826565b5f61164c6002848418611dd2565b61095890848416611d83565b5f6001600160d01b03821115610bba576040516306dfcc6560e41b815260d060048201526024810183905260440161054a565b5f5f6116b66116986106f5565b6116ae6116a488610dd0565b868863ffffffff16565b87919061189b565b915091505b935093915050565b60605f6116cf836118a8565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03831661172a578060025f82825461171f9190611d83565b9091555061179a9050565b6001600160a01b0383165f908152602081905260409020548181101561177c5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161054a565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b6576002805482900390556117d4565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181991815260200190565b60405180910390a3505050565b6001600160a01b03831661184857611845600a61095f61120484611658565b50505b6001600160a01b03821661186a57611867600a61096a61120484611658565b50505b6001600160a01b038381165f90815260086020526040808220548584168352912054610982929182169116836111a6565b5f806116b68585856118cf565b5f60ff8216601f8111156104d257604051632cd44ac360e21b815260040160405180910390fd5b82545f90819080156119ce575f6118eb87610c3e600185611d70565b805490915065ffffffffffff80821691660100000000000090046001600160d01b031690881682111561193157604051632520601d60e01b815260040160405180910390fd5b8765ffffffffffff168265ffffffffffff160361196d57825465ffffffffffff1666010000000000006001600160d01b038916021783556119c0565b6040805180820190915265ffffffffffff808a1682526001600160d01b03808a1660208085019182528d54600181018f555f8f815291909120945191519092166601000000000000029216919091179101555b94508593506116bb92505050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a555f8a81529182209551925190931666010000000000000291909316179201919091559050816116bb565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109586020830184611a2b565b80356001600160a01b0381168114611a81575f5ffd5b919050565b5f5f60408385031215611a97575f5ffd5b611aa083611a6b565b946020939093013593505050565b5f5f5f60608486031215611ac0575f5ffd5b611ac984611a6b565b9250611ad760208501611a6b565b929592945050506040919091013590565b5f60208284031215611af8575f5ffd5b5035919050565b5f60208284031215611b0f575f5ffd5b61095882611a6b565b60ff60f81b8816815260e060208201525f611b3660e0830189611a2b565b8281036040840152611b488189611a2b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611b9d578351835260209384019390920191600101611b7f565b50909b9a5050505050505050505050565b803560ff81168114611a81575f5ffd5b5f5f5f5f5f5f60c08789031215611bd3575f5ffd5b611bdc87611a6b565b95506020870135945060408701359350611bf860608801611bae565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a031215611c28575f5ffd5b611c3188611a6b565b9650611c3f60208901611a6b565b95506040880135945060608801359350611c5b60808901611bae565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611c89575f5ffd5b611c9283611a6b565b9150611ca060208401611a6b565b90509250929050565b5f5f60408385031215611cba575f5ffd5b611cc383611a6b565b9150602083013563ffffffff81168114611cdb575f5ffd5b809150509250929050565b600181811c90821680611cfa57607f821691505b602082108103611d1857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160d01b0381811683821601908111156104d2576104d2611d1e565b6001600160d01b0382811682821603908111156104d2576104d2611d1e565b818103818111156104d2576104d2611d1e565b808201808211156104d2576104d2611d1e565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82611dec57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x474f415400000000000000000000000000000000000000000000000000000008", + "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x42df54d978308232df5f7d63c0445e00c9e9f8c4eb4d4c22b0f8badf086d40da": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x540b5a72faa2463ad7b6e96257f3df9adbe15e6f4ef1a160019203de6a3b6c17": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x55b0fb7ee6854a4c90517d06cee035cb67a225460ad0f72a5ba96fbf9c7f69fa": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x8cfe215f5f534280f4e9685cff600d40c1ede1d1a99c7bbc5273fd192ed3754e": "0x00000000000000000000000000000000000000000295be96e640669720000000", + "0xc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8": "0x0000000000000000000000000000033b2e3c9fd0803ce8000000000000000001", + "0xefb49f92e468cf855f57fd634a2f54d847833aa4a0125060c8f7020cb2790199": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "bC10000000000000000000000000000000000004": { + "balance": "0x8ac7230489e80000", + "nonce": "0x1", + "code": "0x6080604052600436106101d9575f3560e01c80635ba3a6a5116100fd578063bc01763711610092578063e486033911610062578063e4860339146105c4578063e4a28a521461063d578063e6a36cb61461066c578063f2fde38b1461068b575f5ffd5b8063bc01763714610548578063bd12835014610567578063bd9fadb514610586578063daea85c5146105a5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b146104e15780639d879990146104fd578063aa94def21461051c578063af38d7571461052f575f5ffd5b80635ba3a6a51461045c5780635d0341ba1461047b578063715018a6146104b957806380e9071b146104cd575f5ffd5b806323435e2f1161017357806349a0bf8e1161014357806349a0bf8e146103d1578063505bd3da146103e5578063551b3cd21461041057806359e5332d1461043b575f5ffd5b806323435e2f14610341578063293cdbf1146103775780633396c8091461038b578063423905f2146103be575f5ffd5b80631485ff78116101ae5780631485ff78146102a1578063160e3f3d146102c45780631eeea1f3146102e357806321c0b34214610322575f5ffd5b806252c9e1146101dd578062aba51a146101fe578063022914a71461021d57806309e3faa71461026e575b5f5ffd5b3480156101e8575f5ffd5b506101fc6101f73660046125d6565b6106aa565b005b348015610209575f5ffd5b506101fc61021836600461261e565b61078d565b348015610228575f5ffd5b50610251610237366004612666565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610279575f5ffd5b506102517f000000000000000000000000bc1000000000000000000000000000000000000181565b3480156102ac575f5ffd5b506102b660055481565b604051908152602001610265565b3480156102cf575f5ffd5b506101fc6102de366004612686565b6108aa565b3480156102ee575f5ffd5b506103026102fd3660046126b3565b610954565b604080516001600160a01b03938416815292909116602083015201610265565b34801561032d575f5ffd5b506101fc61033c3660046125d6565b610971565b34801561034c575f5ffd5b506102b661035b3660046125d6565b600b60209081525f928352604080842090915290825290205481565b348015610382575f5ffd5b506101fc610a99565b348015610396575f5ffd5b506102b67f000000000000000000000000000000000000000000000000000000000000002081565b6101fc6103cc3660046126db565b610afc565b3480156103dc575f5ffd5b506102b6600881565b3480156103f0575f5ffd5b506102b66103ff366004612666565b600c6020525f908152604090205481565b34801561041b575f5ffd5b506102b661042a366004612666565b600a6020525f908152604090205481565b348015610446575f5ffd5b5061044f610d1c565b6040516102659190612721565b348015610467575f5ffd5b506101fc610476366004612778565b610e0d565b348015610486575f5ffd5b506104a9610495366004612666565b600d6020525f908152604090205460ff1681565b6040519015158152602001610265565b3480156104c4575f5ffd5b506101fc611115565b3480156104d8575f5ffd5b506101fc611128565b3480156104ec575f5ffd5b505f546001600160a01b0316610251565b348015610508575f5ffd5b506101fc6105173660046127b7565b6111bf565b6101fc61052a366004612827565b611450565b34801561053a575f5ffd5b506007546104a99060ff1681565b348015610553575f5ffd5b506101fc6105623660046127b7565b611537565b348015610572575f5ffd5b506101fc610581366004612876565b6115e0565b348015610591575f5ffd5b506101fc6105a036600461289e565b611883565b3480156105b0575f5ffd5b506101fc6105bf366004612666565b611a0b565b3480156105cf575f5ffd5b506106126105de366004612666565b60096020525f908152604090208054600182015460029092015460ff82169261010090920467ffffffffffffffff16919084565b60408051941515855267ffffffffffffffff9093166020850152918301526060820152608001610265565b348015610648575f5ffd5b50610653620f424081565b60405167ffffffffffffffff9091168152602001610265565b348015610677575f5ffd5b506101fc6106863660046128c8565b611a9f565b348015610696575f5ffd5b506101fc6106a5366004612666565b611ce7565b6001600160a01b038083165f90815260086020526040902054839116803381146106f8576040516370a4337d60e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0383166107205760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038481165f8181526008602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527fadd4071c89e561d58065ade5130c43b17b1101714bca7d91d2515ba1cb9fc97691015b60405180910390a150505050565b833373bc10000000000000000000000000000000001001146107c25760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561080b57604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556001600160a01b0383161580159061084657505f82115b1561085f5761085f6001600160a01b0384168584611d21565b6040805167ffffffffffffffff87168152602081018490527f31fa984883dfea329532d399d9106031006364f445ef2351a45c0d9cbc4ec72791015b60405180910390a15050505050565b6108b2611d9a565b5f81116108d257604051630dd484e760e41b815260040160405180910390fd5b6109076001600160a01b037f000000000000000000000000bc1000000000000000000000000000000000000116333084611dc6565b8060055f8282546109189190612939565b90915550506040518181527f41891e803e84c188180caa0f073ce4235b8002dac887a69fcdcae1d295951fa0906020015b60405180910390a150565b5f5f61095f83611dff565b61096884611f17565b91509150915091565b6001600160a01b038083165f90815260086020526040902054839116803381146109ba576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508360016109c88282611f47565b6001600160a01b0385166109ef5760405163f6b2911f60e01b815260040160405180910390fd5b600480547fa983a6cfc4bd1095dac7b145ae020ba08e16cc7efa2051cc6b77e4011b9ee99b9167ffffffffffffffff909116905f610a2c8361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508787604051610a899392919067ffffffffffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a1505050505050565b610aa1611d9a565b60075460ff1615610ac55760405163eef336d960e01b815260040160405180910390fd5b6007805460ff191660011790556040517f8b1bc2671f5913bb778240df66342565720db9b7a01e7e78190ae6aa1e4bd0f3905f90a1565b600654610b1c576040516314d2abd360e21b815260040160405180910390fd5b5f610b2685611dff565b90505f468233604051602001610b6593929190928352606091821b6bffffffffffffffffffffffff199081166020850152911b16603482015260480190565b604051602081830303815290604052805190602001209050610b898184878761203f565b6001600160a01b0316610b9b87611f17565b6001600160a01b031614610bc257604051630e751dc360e31b815260040160405180910390fd5b6001600160a01b038281165f9081526008602052604090205483911615610c085760405163107f863360e21b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600d602052604090205460ff1680610c5857505f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff165b8290610c8357604051633e55e12b60e11b81526001600160a01b0390911660048201526024016106ef565b50600654610c9d908390610c98906001612939565b611f47565b6001600160a01b0382165f908152600860205260409081902080546001600160a01b0319163390811790915590517ff3aa84440b70359721372633122645674adb6dbb72622a222627248ef053a7dd91610cfb918591908a90612978565b60405180910390a1610d1482610d0f610d1c565b61206b565b505050505050565b6006546060905f9067ffffffffffffffff811115610d3c57610d3c61299f565b604051908082528060200260200182016040528015610d8057816020015b604080518082019091525f8082526020820152815260200190600190039081610d5a5790505b5090505f5b600654811015610e07575f60068281548110610da357610da36129b3565b5f9182526020808320909101546040805180820182526001600160a01b039092168083528085526009845293206002015491810191909152845191925090849084908110610df357610df36129b3565b602090810291909101015250600101610d85565b50919050565b610e15611d9a565b6001600160a01b0384165f9081526009602052604090205460ff1615610e4e57604051632ae3f45d60e11b815260040160405180910390fd5b6001600160a01b0384161580610ec65750836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf91906129c7565b60ff166012145b610ee357604051638785ff4f60e01b815260040160405180910390fd5b5f8367ffffffffffffffff16118015610f085750620f424067ffffffffffffffff8416105b610f255760405163018a49e560e01b815260040160405180910390fd5b60408051608081018252600180825267ffffffffffffffff8681166020808501828152858701898152606087018981526001600160a01b038d165f818152600986528a902098518954945168ffffffffffffffffff1990951690151568ffffffffffffffff0019161761010094909716939093029590951787555194860194909455915160029094019390935583519182528101919091527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a1604080516001600160a01b0386168152602081018490527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a1801561110f5781158061103d5750808210155b828290916110675760405163068ade6560e31b8152600481019290925260248201526044016106ef565b505060065460081161108c57604051632970307360e11b815260040160405180910390fd5b600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b03861690811790915560408051918252602082018390527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b50505050565b61111d611d9a565b6111265f612380565b565b60075460ff1661114b576040516335b43c0360e11b815260040160405180910390fd5b335f908152600c602052604090205480611178576040516301e1880f60e51b815260040160405180910390fd5b335f818152600c60205260408120556111bc907f000000000000000000000000bc100000000000000000000000000000000000016001600160a01b03169083611d21565b50565b6111c7611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661120d5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f908152600960205260409020600201548181036112495760405163aabb9c6360e01b815260040160405180910390fd5b6001600160a01b0383165f81815260096020908152604091829020600201859055815192835282018490527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910160405180910390a1801580156112ac57505f82115b15611325576006546008116112d457604051632970307360e11b815260040160405180910390fd5b50600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0384166001600160a01b03199091161790555050565b5f8111801561133357505f82115b1561133d57505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611366576113666129b3565b5f918252602090912001546001600160a01b0316036114445760065461138e906001906129e2565b811461140b57600680546113a4906001906129e2565b815481106113b4576113b46129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106113df576113df6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600680548061141c5761141c6129f5565b5f8281526020902081015f1990810180546001600160a01b03191690550190555061144c9050565b60010161133f565b5050565b6001600160a01b038084165f9081526008602052604090205484911680338114611499576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b5084836114a68282611f47565b84158015906114b6575060088511155b6114d357604051632970307360e11b815260040160405180910390fd5b61152e878787808060200260200160405190810160405280939291908181526020015f905b828210156115245761151560408302860136819003810190612a09565b815260200190600101906114f8565b505050505061206b565b50505050505050565b61153f611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff166115855760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b0382165f81815260096020908152604091829020600101849055815192835282018390527f60ae001243ab6d87904798d941cb0935a98451d5ddac12c259193ddc12db0ae9910160405180910390a15050565b6115e8611d9a565b6001600160a01b0382165f90815260096020526040902054829060ff1661162e5760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b50620f424067ffffffffffffffff82161061165c5760405163018a49e560e01b815260040160405180910390fd5b604080516001600160a01b038416815267ffffffffffffffff831660208201527fb59bf4596e5415117fb4625044cb5b0ca5b273742825b026d06afe82a48e6217910160405180910390a167ffffffffffffffff8116156116f4576001600160a01b0382165f908152600960205260409020805467ffffffffffffffff83166101000268ffffffffffffffff00199091161790555050565b6001600160a01b0382165f908152600960205260408120600281018054825468ffffffffffffffffff1916835560019092018390559190915515158061173957505050565b5f5b60065481101561110f57836001600160a01b031660068281548110611762576117626129b3565b5f918252602090912001546001600160a01b03160361187b5760065461178a906001906129e2565b811461180757600680546117a0906001906129e2565b815481106117b0576117b06129b3565b5f91825260209091200154600680546001600160a01b0390921691839081106117db576117db6129b3565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6006805480611818576118186129f5565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516001600160a01b0388168152918201929092527f326e29ab1c62c7d77fdfb302916e82e1a54f3b9961db75ee7e18afe488a0e92d910161077f565b60010161173b565b833373bc10000000000000000000000000000000001001146118b85760405163a8af0d7960e01b815260040160405180910390fd5b67ffffffffffffffff81165f908152600e6020526040902054819060ff161561190157604051639e5ce1a360e01b815267ffffffffffffffff90911660048201526024016106ef565b5067ffffffffffffffff81165f908152600e60205260409020805460ff191660011790556005548311156119355760055492505b82156119c35760075460ff161561197f5761197a6001600160a01b037f000000000000000000000000bc10000000000000000000000000000000000001168585611d21565b6119ac565b6001600160a01b0384165f908152600c6020526040812080548592906119a6908490612939565b90915550505b8260055f8282546119bd91906129e2565b90915550505b6040805167ffffffffffffffff87168152602081018590529081018390527f2b02cde117ae53d66dc4d0bdf72b2146e0e1070c1428d6274b0f98d628ad99c49060600161089b565b611a13611d9a565b6001600160a01b0381165f908152600d602052604090205460ff1615611a4c57604051632ef470fd60e11b815260040160405180910390fd5b6001600160a01b0381165f818152600d6020908152604091829020805460ff1916600117905590519182527f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce79101610949565b6001600160a01b038085165f9081526008602052604090205485911680338114611ae8576040516370a4337d60e11b81526001600160a01b0390911660048201526024016106ef565b508583611af58282611f47565b8415801590611b05575060088511155b611b2257604051632970307360e11b815260040160405180910390fd5b6001600160a01b038716611b495760405163f6b2911f60e01b815260040160405180910390fd5b5f5b85811015611cdc575f878783818110611b6657611b666129b3565b905060400201803603810190611b7c9190612a09565b90505f816020015111611ba257604051630dd484e760e41b815260040160405180910390fd5b6020808201516001600160a01b03808d165f908152600b8452604080822086519093168252919093528220805491929091611bde9084906129e2565b909155505060208082015182516001600160a01b03165f908152600a90925260408220805491929091611c129084906129e2565b9091555050600480547f40f2a8c5e2e2a9ad2f4e4dfc69825595b526178445c3eb22b02edfd190601db79167ffffffffffffffff909116905f611c548361294c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508b8b845f01518560200151604051611ccb95949392919067ffffffffffffffff9590951685526001600160a01b03938416602086015291831660408501529091166060830152608082015260a00190565b60405180910390a150600101611b4b565b505050505050505050565b611cef611d9a565b6001600160a01b038116611d1857604051631e4fbdf760e01b81525f60048201526024016106ef565b6111bc81612380565b6040516001600160a01b03838116602483015260448201839052611d9591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123cf565b505050565b5f546001600160a01b031633146111265760405163118cdaa760e01b81523360048201526024016106ef565b6040516001600160a01b03848116602483015283811660448301526064820183905261110f9186918216906323b872dd90608401611d4e565b5f80602083013560011615611e1857600360f81b611e1e565b600160f91b5b6040517fff0000000000000000000000000000000000000000000000000000000000000082166020820152843560218201529091505f9060029060410160408051601f1981840301815290829052611e7591612a6b565b602060405180830381855afa158015611e90573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611eb39190612a81565b9050600381604051602001611eca91815260200190565b60408051601f1981840301815290829052611ee491612a6b565b602060405180830381855afa158015611eff573d5f5f3e3d5ffd5b5050604051516001600160a01b031695945050505050565b5f81604051602001611f299190612a98565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000115611fc0576001600160a01b0382165f90815260036020526040902054439003611fa557604051631736a31960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604090204390555b805f03611fcb575050565b6001544303611ff25780600180015f828254611fe79190612939565b90915550611ffc9050565b4360015560028190555b6002547f0000000000000000000000000000000000000000000000000000000000000020101561144c5760405163a74c1c5f60e01b815260040160405180910390fd5b5f5f5f5f61204f8888888861243b565b92509250925061205f8282612503565b50909695505050505050565b345f5b825181101561235c575f83828151811061208a5761208a6129b3565b60209081029190910181015180516001600160a01b03165f908152600983526040908190208151608081018352815460ff811615158252610100900467ffffffffffffffff16818601526001820154928101929092526002015460608201529181015190925061210d57604051630dd484e760e41b815260040160405180910390fd5b602081015182519067ffffffffffffffff166121485760405163de6137d160e01b81526001600160a01b0390911660048201526024016106ef565b506001600160a01b038087165f908152600b6020908152604080832086519094168352929052205460608201518110156121ce575f81836060015161218d91906129e2565b6020850151855191925082908111156121ca576040516349cd40ff60e01b81526001600160a01b03909216600483015260248201526044016106ef565b5050505b82516001600160a01b031661220e57602083015185811461220557604051630a61be9f60e41b81526004016106ef91815260200190565b505f945061222e565b6020830151835161222e916001600160a01b039091169033903090611dc6565b60208084015184516001600160a01b03165f908152600a90925260408220546122579190612939565b905082604001515f148061226f575080836040015110155b8451604085015190916122a65760405163421dca0560e11b81526001600160a01b03909216600483015260248201526044016106ef565b505083516001600160a01b039081165f908152600a60209081526040808320859055818801518c85168452600b83528184208951909516845293909152812080549091906122f5908490612939565b90915550508351602080860151604080516001600160a01b038d811682529094169284019290925282820152517fec36c0364d931187a76cf66d7eee08fad0ec2e8b7458a8d8b26b36769d4d13f39181900360600190a150506001909201915061206e9050565b505f811561110f57604051630a61be9f60e41b81526004016106ef91815260200190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f60205f8451602086015f885af1806123ee576040513d5f823e3d81fd5b50505f513d91508115612405578060011415612412565b6001600160a01b0384163b155b1561110f57604051635274afe760e01b81526001600160a01b03851660048201526024016106ef565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561247457505f915060039050826124f9565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156124c5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166124f057505f9250600191508290506124f9565b92505f91508190505b9450945094915050565b5f82600381111561251657612516612aa5565b0361251f575050565b600182600381111561253357612533612aa5565b036125515760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561256557612565612aa5565b036125865760405163fce698f760e01b8152600481018290526024016106ef565b600382600381111561259a5761259a612aa5565b0361144c576040516335e2f38360e21b8152600481018290526024016106ef565b80356001600160a01b03811681146125d1575f5ffd5b919050565b5f5f604083850312156125e7575f5ffd5b6125f0836125bb565b91506125fe602084016125bb565b90509250929050565b803567ffffffffffffffff811681146125d1575f5ffd5b5f5f5f5f60808587031215612631575f5ffd5b61263a85612607565b9350612648602086016125bb565b9250612656604086016125bb565b9396929550929360600135925050565b5f60208284031215612676575f5ffd5b61267f826125bb565b9392505050565b5f60208284031215612696575f5ffd5b5035919050565b80604081018310156126ad575f5ffd5b92915050565b5f604082840312156126c3575f5ffd5b61267f838361269d565b60ff811681146111bc575f5ffd5b5f5f5f5f60a085870312156126ee575f5ffd5b6126f8868661269d565b935060408501359250606085013591506080850135612716816126cd565b939692955090935050565b602080825282518282018190525f918401906040840190835b8181101561276d57835180516001600160a01b03168452602090810151818501529093019260409092019160010161273a565b509095945050505050565b5f5f5f5f6080858703121561278b575f5ffd5b612794856125bb565b93506127a260208601612607565b93969395505050506040820135916060013590565b5f5f604083850312156127c8575f5ffd5b6127d1836125bb565b946020939093013593505050565b5f5f83601f8401126127ef575f5ffd5b50813567ffffffffffffffff811115612806575f5ffd5b6020830191508360208260061b8501011115612820575f5ffd5b9250929050565b5f5f5f60408486031215612839575f5ffd5b612842846125bb565b9250602084013567ffffffffffffffff81111561285d575f5ffd5b612869868287016127df565b9497909650939450505050565b5f5f60408385031215612887575f5ffd5b612890836125bb565b91506125fe60208401612607565b5f5f5f5f608085870312156128b1575f5ffd5b6128ba85612607565b93506127a2602086016125bb565b5f5f5f5f606085870312156128db575f5ffd5b6128e4856125bb565b93506128f2602086016125bb565b9250604085013567ffffffffffffffff81111561290d575f5ffd5b612919878288016127df565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126ad576126ad612925565b5f67ffffffffffffffff821667ffffffffffffffff810361296f5761296f612925565b60010192915050565b6001600160a01b038481168252831660208201526080810160408381840137949350505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156129d7575f5ffd5b815161267f816126cd565b818103818111156126ad576126ad612925565b634e487b7160e01b5f52603160045260245ffd5b5f6040828403128015612a1a575f5ffd5b506040805190810167ffffffffffffffff81118282101715612a4a57634e487b7160e01b5f52604160045260245ffd5b604052612a56836125bb565b81526020928301359281019290925250919050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612a91575f5ffd5b5051919050565b6040828237604001919050565b634e487b7160e01b5f52602160045260245ffdfea164736f6c634300081b000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000a56fa5b99019a5c8000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0d13acf57871ac7f9cb5a329186ae37a4dfd4e617dee2ebbab684b46d75d9ed2": "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0x344a0f405a413603c3bef9eae8dae8b6710151a0da8ae38fe8ac9167dacfe84f": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xe3bc585728cfb9d26f5badbad3829b0cb1fa86b3744a0180bfa0b307b1b25a40": "0x000000000000000000000000bc000fdbcf93890e210c3f1fb19c97772e558b68", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b": "0x00000000000000000000000000000000000000000000000000000000002ee001", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c": "0x00000000000000000000000000000000000000000000002b5e3af16b18800000", + "0xec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf3c61d3b73124820d8a810ab1915a9d8c6bfb75d03344e78e5f73f6d90e1bb8d": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", + "0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "config": { + "chainId": 48815, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 0, + "cancunTime": 0, + "terminalTotalDifficulty": 0, + "goat": {} + } + }, + "context": { + "number": "316", + "difficulty": "0", + "timestamp": "1729570128", + "gasLimit": "30000000", + "miner": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "7" + }, + "input": "0x60f889020180b88400aba51a000000000000000000000000000000000000000000000000000000000000006400000000000000000000000025d61e35375162a90dc88b2f0d8b201516581fb6000000000000000000000000bc100000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064", + "result": { + "from": "0xbc10000000000000000000000000000000001001", + "gas": "0x0", + "gasUsed": "0x0", + "to": "0xbc10000000000000000000000000000000000004", + "input": "0x00aba51a000000000000000000000000000000000000000000000000000000000000006400000000000000000000000025d61e35375162a90dc88b2f0d8b201516581fb6000000000000000000000000bc100000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064", + "calls": [ + { + "from": "0xbc10000000000000000000000000000000000004", + "gas": "0x1c1e492", + "gasUsed": "0x879d", + "to": "0xbc10000000000000000000000000000000000001", + "input": "0xa9059cbb00000000000000000000000025d61e35375162a90dc88b2f0d8b201516581fb60000000000000000000000000000000000000000000000000000000000000064", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "value": "0x0", + "type": "CALL" + } + ], + "value": "0x0", + "type": "CALL" + } +} diff --git a/eth/tracers/live/supply.go b/eth/tracers/live/supply.go index fa4e5b190431a..67d93ed89d31d 100644 --- a/eth/tracers/live/supply.go +++ b/eth/tracers/live/supply.go @@ -202,6 +202,10 @@ func (s *supplyTracer) onBalanceChange(a common.Address, prevBalance, newBalance // BalanceDecreaseSelfdestructBurn is non-reversible as it happens // at the end of the transaction. s.delta.Burn.Misc.Sub(s.delta.Burn.Misc, diff) + + case tracing.BalanceGoatDepoist: + // deposit from L1 + s.delta.Issuance.Withdrawals.Add(s.delta.Issuance.Withdrawals, diff) default: return } diff --git a/eth/tracers/native/call.go b/eth/tracers/native/call.go index c2247d1ce4918..6eee671c7bcfd 100644 --- a/eth/tracers/native/call.go +++ b/eth/tracers/native/call.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/types/goattypes" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/params" @@ -177,6 +178,55 @@ func (t *callTracer) OnEnter(depth int, typ byte, from common.Address, to common if depth == 0 { call.Gas = t.gasLimit } + + switch { + case from == goattypes.LockingExecutor && to == goattypes.LockingContract && len(input) > 4: + CompleteUnlockTx := new(goattypes.CompleteUnlockTx) + DistributeRewardTx := new(goattypes.DistributeRewardTx) + + switch [4]byte(input[:4]) { + case CompleteUnlockTx.MethodId(): + if err := CompleteUnlockTx.Decode(input); err == nil && CompleteUnlockTx.Token == goattypes.NativeToken { + call.Calls = append(call.Calls, callFrame{ + Type: vm.CALL, + From: goattypes.LockingContract, + To: &CompleteUnlockTx.Recipient, + Value: CompleteUnlockTx.Amount, + }) + } + case DistributeRewardTx.MethodId(): + if err := DistributeRewardTx.Decode(input); err == nil && DistributeRewardTx.GasReward.Sign() > 0 { + call.Calls = append(call.Calls, callFrame{ + Type: vm.CALL, + From: goattypes.LockingContract, + To: &DistributeRewardTx.Recipient, + Value: DistributeRewardTx.GasReward, + }) + } + } + case from == goattypes.RelayerExecutor && to == goattypes.BridgeContract && len(input) > 4: + DepositTx := new(goattypes.DepositTx) + if [4]byte(input[:4]) == DepositTx.MethodId() { + if err := DepositTx.Decode(input); err == nil { + call.Calls = append(call.Calls, callFrame{ + Type: vm.CALL, + From: goattypes.BridgeContract, + To: &DepositTx.Target, + Value: DepositTx.Amount, + }) + + if DepositTx.Tax.Sign() > 0 { + call.Calls = append(call.Calls, callFrame{ + Type: vm.CALL, + From: goattypes.BridgeContract, + To: &goattypes.GoatFoundationContract, + Value: DepositTx.Tax, + }) + } + } + } + } + t.callstack = append(t.callstack, call) } diff --git a/miner/miner.go b/miner/miner.go index 9892c08ed6e5e..eb385ff243b60 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -53,13 +53,13 @@ type Config struct { // DefaultConfig contains default settings for miner. var DefaultConfig = Config{ GasCeil: 30_000_000, - GasPrice: big.NewInt(params.GWei / 1000), + GasPrice: big.NewInt(1e5), // The default recommit time is chosen as two seconds since // consensus-layer usually will wait a half slot of time(6s) // for payload generation. It should be enough for Geth to // run 3 rounds. - Recommit: 2 * time.Second, + Recommit: time.Second, } // Miner is the main object which takes care of submitting new work to consensus diff --git a/miner/payload_building.go b/miner/payload_building.go index 3090de5d4b1fc..d2cd6a7dfc9f2 100644 --- a/miner/payload_building.go +++ b/miner/payload_building.go @@ -44,6 +44,8 @@ type BuildPayloadArgs struct { Withdrawals types.Withdrawals // The provided withdrawals BeaconRoot *common.Hash // The provided beaconRoot (Cancun) Version engine.PayloadVersion // Versioning byte for payload id calculation. + + GoatTxs types.Transactions } // Id computes an 8-byte identifier by hashing the components of the payload arguments. @@ -219,6 +221,7 @@ func (miner *Miner) buildPayload(args *BuildPayloadArgs, witness bool) (*Payload withdrawals: args.Withdrawals, beaconRoot: args.BeaconRoot, noTxs: true, + txs: args.GoatTxs, } empty := miner.generateWork(emptyParams, witness) if empty.err != nil { @@ -249,6 +252,7 @@ func (miner *Miner) buildPayload(args *BuildPayloadArgs, witness bool) (*Payload withdrawals: args.Withdrawals, beaconRoot: args.BeaconRoot, noTxs: false, + txs: args.GoatTxs, } for { diff --git a/miner/worker.go b/miner/worker.go index b5aa080025912..977f2c222782a 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -34,6 +34,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" "github.com/holiman/uint256" ) @@ -91,6 +92,9 @@ type generateParams struct { withdrawals types.Withdrawals // List of withdrawals to include in block (shanghai field) beaconRoot *common.Hash // The beacon root (cancun field). noTxs bool // Flag whether an empty block without any transaction is expected + + // goat txs from cosmos + txs types.Transactions } // generateWork generates a sealing block based on the given parameters. @@ -117,10 +121,19 @@ func (miner *Miner) generateWork(params *generateParams, witness bool) *newPaylo for _, r := range work.receipts { allLogs = append(allLogs, r.Logs...) } + var gasFees = new(big.Int) // Collect consensus-layer requests if Prague is enabled. var requests [][]byte - if miner.chainConfig.IsPrague(work.header.Number, work.header.Time) { + if miner.chainConfig.Goat != nil { + gasFees = core.CalculateGoatGasFees(work.header, work.txs, work.receipts) + gasRevenue := core.AllocateGoatGasFee(work.state, gasFees) + requests, err = core.ProcessGoatRequests(work.header.Number.Uint64(), gasRevenue, allLogs) + if err != nil { + return &newPayloadResult{err: err} + } + } + if miner.chainConfig.Goat == nil && miner.chainConfig.IsPrague(work.header.Number, work.header.Time) { requests = [][]byte{} // EIP-6110 deposits if err := core.ParseDepositLogs(&requests, allLogs, miner.chainConfig); err != nil { @@ -140,9 +153,14 @@ func (miner *Miner) generateWork(params *generateParams, witness bool) *newPaylo if err != nil { return &newPayloadResult{err: err} } + + if miner.chainConfig.Goat == nil { + gasFees = totalFees(block, work.receipts) + } + return &newPayloadResult{ block: block, - fees: totalFees(block, work.receipts), + fees: gasFees, sidecars: work.sidecars, stateDB: work.state, receipts: work.receipts, @@ -184,10 +202,20 @@ func (miner *Miner) prepareWork(genParams *generateParams, witness bool) (*envir Time: timestamp, Coinbase: genParams.coinbase, } - // Set the extra field. - if len(miner.config.ExtraData) != 0 { - header.Extra = miner.config.ExtraData + + if miner.chainConfig.Goat != nil { + // Set the extra field. + header.Extra = make([]byte, 0, params.GoatHeaderExtraLengthV0) + header.Extra = append(header.Extra, uint8(len(genParams.txs))) + header.Extra = append(header.Extra, + types.DeriveSha(genParams.txs, trie.NewStackTrie(nil)).Bytes()...) + } else { + // Set the extra field. + if len(miner.config.ExtraData) != 0 { + header.Extra = miner.config.ExtraData + } } + // Set the randomness field from the beacon chain if it's available. if genParams.random != (common.Hash{}) { header.MixDigest = genParams.random @@ -233,6 +261,19 @@ func (miner *Miner) prepareWork(genParams *generateParams, witness bool) (*envir if miner.chainConfig.IsPrague(header.Number, header.Time) { core.ProcessParentBlockHash(header.ParentHash, env.evm) } + + // add goat txs + if env.gasPool == nil { + env.gasPool = new(core.GasPool).AddGas(header.GasLimit) + } + for _, tx := range genParams.txs { + env.state.SetTxContext(tx.Hash(), env.tcount) + err = miner.commitTransaction(env, tx) + if err != nil { + return nil, err + } + } + return env, nil } diff --git a/p2p/server.go b/p2p/server.go index 172f0667eb132..0d1e9bd75e60c 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -591,6 +591,7 @@ func (srv *Server) setupDiscovery() error { if err != nil { return err } + srv.discmix.AddSource(srv.discv5.RandomNodes()) } // Add protocol-specific discovery sources. diff --git a/params/config.go b/params/config.go index 9b3b92484ab2a..bad6c8c4a85e3 100644 --- a/params/config.go +++ b/params/config.go @@ -282,6 +282,9 @@ var NetworkNames = map[string]string{ MainnetChainConfig.ChainID.String(): "mainnet", SepoliaChainConfig.ChainID.String(): "sepolia", HoleskyChainConfig.ChainID.String(): "holesky", + + GoatTestnet3ChainConfig.ChainID.String(): "goat-testnet3", + GoatMainnetChainConfig.ChainID.String(): "goat-mainnet", } // ChainConfig is the core config which determines the blockchain settings. @@ -329,6 +332,8 @@ type ChainConfig struct { // Various consensus engines Ethash *EthashConfig `json:"ethash,omitempty"` Clique *CliqueConfig `json:"clique,omitempty"` + + Goat *GoatConfig `json:"goat,omitempty"` } // EthashConfig is the consensus engine configs for proof-of-work based sealing. @@ -361,6 +366,8 @@ func (c *ChainConfig) Description() string { } banner += fmt.Sprintf("Chain ID: %v (%s)\n", c.ChainID, network) switch { + case c.Goat != nil: + banner += "Consensus: Goat\n" case c.Ethash != nil: banner += "Consensus: Beacon (proof-of-stake), merged from Ethash (proof-of-work)\n" case c.Clique != nil: diff --git a/params/goat.go b/params/goat.go new file mode 100644 index 0000000000000..453bd27dfcaa4 --- /dev/null +++ b/params/goat.go @@ -0,0 +1,112 @@ +package params + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +type GoatConfig struct{} + +// String implements the stringer interface, returning the consensus engine details. +func (c GoatConfig) String() string { + return "goat" +} + +const ( + GoatHeaderExtraLengthV0 = 33 + GoatTxLimitPerBlock = 128 + GoatTxGasLimit = 30_000_000 // the goat tx gas limit, it's the same with eth system tx +) + +const ( + GoatMainnetName = "mainnet" + GoatTestnet3Name = "testnet3" +) + +var ( + V5GoatTestnet3Bootnodes = []string{ + // MetisDAO + "enode://ea55fed4d513969ec6048d089d108b12c75610fa808416d7b7a3b1e443113effc7b473f03396be2bfd238b2abef47b454e2da8c8f4da49f7dbd49470efc3efa1@3.222.213.223:30303", + // ZKM + "enode://25fde2ca58a45a561a52b3cae2b0e56b1838f149ba5f7af88e4dc6f76a2647c0f7dd383cc21e744d72bf27f6db9e2ce61eb412e3e9cf9401b8a5be57ec6e4952@54.68.179.184:30303", + // Goat + "enode://a7106c2ddce59458bc25cff89812b464db1cd5ca8db6d2045326d60f4b918bb6f74e192ed36e108f4821a499066c06abd51b4905350fa2dc87634286a5872102@52.32.82.160:30303", + } + + V5GoatMainnetBootnodes = []string{ + // MetisDAO + "enode://8411fdcbadc4ef56e99d937e6549e81fc665fa7dcf89b27936444ed3d8f866b0a48916a4f63dfedc0c51cb2f0ea6799b8eccea5d0914d27b0b214efe937a4812@18.222.86.233:30303", + // ZKM + "enode://c32ed98a51343e96dd7f2c6efdc8f621bc98d44e7350647b7d6d0f8aac27a89614f8f7b266f5d26619792da751b30ab3181e6b85655b7af3fa3853c040a2ff04@3.14.116.76:30303", + // Goat + "enode://02aacb270446f09566bc5f26a1edb1b30815c1d0cec3774d3e1d667abb6ac7f712e00c0b4a3f421a7bfc5da75b2ff1e30adc78a156bdc0e5ce62ca0deea4209d@18.221.14.115:30303", + } +) + +var ( + // GoatMainnetChainConfig contains the chain parameters to run a node on the Goat Mainnet network. + GoatMainnetChainConfig = &ChainConfig{ + ChainID: big.NewInt(2345), + HomesteadBlock: common.Big0, + EIP150Block: common.Big0, + EIP155Block: common.Big0, + EIP158Block: common.Big0, + ByzantiumBlock: common.Big0, + ConstantinopleBlock: common.Big0, + PetersburgBlock: common.Big0, + IstanbulBlock: common.Big0, + MuirGlacierBlock: common.Big0, + BerlinBlock: common.Big0, + LondonBlock: common.Big0, + ArrowGlacierBlock: common.Big0, + GrayGlacierBlock: common.Big0, + ShanghaiTime: newUint64(0), + CancunTime: newUint64(0), + TerminalTotalDifficulty: common.Big0, + Goat: &GoatConfig{}, + } + + // GoatTestnet3ChainConfig contains the chain parameters to run a node on the Goat Testnet3 network. + GoatTestnet3ChainConfig = &ChainConfig{ + ChainID: big.NewInt(48816), + HomesteadBlock: common.Big0, + EIP150Block: common.Big0, + EIP155Block: common.Big0, + EIP158Block: common.Big0, + ByzantiumBlock: common.Big0, + ConstantinopleBlock: common.Big0, + PetersburgBlock: common.Big0, + IstanbulBlock: common.Big0, + MuirGlacierBlock: common.Big0, + BerlinBlock: common.Big0, + LondonBlock: common.Big0, + ArrowGlacierBlock: common.Big0, + GrayGlacierBlock: common.Big0, + ShanghaiTime: newUint64(0), + CancunTime: newUint64(0), + TerminalTotalDifficulty: common.Big0, + Goat: &GoatConfig{}, + } + + AllGoatDebugChainConfig = &ChainConfig{ + ChainID: big.NewInt(1337), + HomesteadBlock: common.Big0, + EIP150Block: common.Big0, + EIP155Block: common.Big0, + EIP158Block: common.Big0, + ByzantiumBlock: common.Big0, + ConstantinopleBlock: common.Big0, + PetersburgBlock: common.Big0, + IstanbulBlock: common.Big0, + MuirGlacierBlock: common.Big0, + BerlinBlock: common.Big0, + LondonBlock: common.Big0, + ArrowGlacierBlock: common.Big0, + GrayGlacierBlock: common.Big0, + ShanghaiTime: newUint64(0), + CancunTime: newUint64(0), + TerminalTotalDifficulty: common.Big0, + Goat: &GoatConfig{}, + } +) diff --git a/params/protocol_params.go b/params/protocol_params.go index 90e7487cff16f..db97daa4e9872 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -28,7 +28,7 @@ const ( MaxGasLimit uint64 = 0x7fffffffffffffff // Maximum the gas limit (2^63-1). GenesisGasLimit uint64 = 4712388 // Gas limit of the Genesis block. - MaximumExtraDataSize uint64 = 32 // Maximum size extra data may be after Genesis. + MaximumExtraDataSize uint64 = 33 // Maximum size extra data may be after Genesis. ExpByteGas uint64 = 10 // Times ceil(log256(exponent)) for the EXP instruction. SloadGas uint64 = 50 // Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added. CallValueTransferGas uint64 = 9000 // Paid for CALL when the value transfer is non-zero.