From 3ea561b84b3433a7e4161e1aceeeb0eb7b60f34f Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Wed, 6 Sep 2023 16:11:49 +0200 Subject: [PATCH 01/27] EVM-831 Implement state sync relayer without blocktracker --- consensus/consensus.go | 6 + consensus/polybft/consensus_runtime.go | 40 +++ consensus/polybft/consensus_runtime_test.go | 1 + consensus/polybft/polybft.go | 2 + consensus/polybft/polybft_test.go | 5 +- consensus/polybft/state_store_state_sync.go | 56 ++++ .../polybft/state_store_state_sync_test.go | 23 ++ consensus/polybft/state_sync_relayer.go | 282 ++++++++++++++++++ consensus/polybft/state_sync_relayer_test.go | 197 ++++++++++++ server/server.go | 52 +--- 10 files changed, 616 insertions(+), 48 deletions(-) create mode 100644 consensus/polybft/state_sync_relayer.go create mode 100644 consensus/polybft/state_sync_relayer_test.go diff --git a/consensus/consensus.go b/consensus/consensus.go index 878ad76655..160faf4523 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -64,6 +64,12 @@ type Config struct { // Path is the directory path for the consensus protocol to store information Path string + + // IsRelayer is true if node is relayer + IsRelayer bool + + // RPCEndpoint + RPCEndpoint string } type Params struct { diff --git a/consensus/polybft/consensus_runtime.go b/consensus/polybft/consensus_runtime.go index 7b9bb31879..4a194ea1ec 100644 --- a/consensus/polybft/consensus_runtime.go +++ b/consensus/polybft/consensus_runtime.go @@ -82,6 +82,8 @@ type runtimeConfig struct { txPool txPoolInterface bridgeTopic topic numBlockConfirmations uint64 + IsRelayer bool + RPCEndpoint string } // consensusRuntime is a struct that provides consensus runtime features like epoch, state and event management @@ -121,6 +123,9 @@ type consensusRuntime struct { eventProvider *EventProvider + // stateSyncRelayer is relayer for commitment events + stateSyncRelayer StateSyncRelayer + // logger instance logger hcf.Logger } @@ -160,6 +165,10 @@ func newConsensusRuntime(log hcf.Logger, config *runtimeConfig) (*consensusRunti return nil, err } + if err := runtime.initStateSyncRelayer(log); err != nil { + return nil, err + } + // we need to call restart epoch on runtime to initialize epoch state runtime.epoch, err = runtime.restartEpoch(runtime.lastBuiltBlock, dbTx) if err != nil { @@ -175,6 +184,7 @@ func newConsensusRuntime(log hcf.Logger, config *runtimeConfig) (*consensusRunti // close is used to tear down allocated resources func (c *consensusRuntime) close() { + c.stateSyncRelayer.Close() c.stateSyncManager.Close() } @@ -238,6 +248,31 @@ func (c *consensusRuntime) initCheckpointManager(logger hcf.Logger) error { return nil } +// initStateSyncRelayer initializes state sync relayer +// if not enabled, then a dummy checkpoint manager will be used +func (c *consensusRuntime) initStateSyncRelayer(logger hcf.Logger) error { + if c.config.IsRelayer { + // enable checkpoint manager + txRelayer, err := getStateSyncTxRelayer(c.config.RPCEndpoint, logger) + if err != nil { + return err + } + + c.stateSyncRelayer = NewStateSyncRelayer( + txRelayer, + contracts.StateReceiverContract, + c.state, + c, + c.config.blockchain, + wallet.NewEcdsaSigner(c.config.Key), + logger.Named("state_sync_relayer")) + } else { + c.stateSyncRelayer = &dummyStakeSyncRelayer{} + } + + return c.stateSyncRelayer.Init() +} + // initStakeManager initializes stake manager func (c *consensusRuntime) initStakeManager(logger hcf.Logger, dbTx *bolt.Tx) error { rootRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithIPAddress(c.config.PolyBFTConfig.Bridge.JSONRPCEndpoint)) @@ -369,6 +404,11 @@ func (c *consensusRuntime) OnBlockInserted(fullBlock *types.FullBlock) { return } + // handle state sync relayer events that happened in block + if err := c.stateSyncRelayer.PostBlock(postBlock); err != nil { + c.logger.Error("post block callback failed in state sync relayer", "err", err) + } + if isEndOfEpoch { if epoch, err = c.restartEpoch(fullBlock.Block.Header, dbTx); err != nil { c.logger.Error("failed to restart epoch after block inserted", "error", err) diff --git a/consensus/polybft/consensus_runtime_test.go b/consensus/polybft/consensus_runtime_test.go index 721034387a..01654879ce 100644 --- a/consensus/polybft/consensus_runtime_test.go +++ b/consensus/polybft/consensus_runtime_test.go @@ -232,6 +232,7 @@ func TestConsensusRuntime_OnBlockInserted_EndOfEpoch(t *testing.T) { checkpointManager: &dummyCheckpointManager{}, stakeManager: &dummyStakeManager{}, eventProvider: NewEventProvider(blockchainMock), + stateSyncRelayer: &dummyStakeSyncRelayer{}, } runtime.OnBlockInserted(&types.FullBlock{Block: builtBlock}) diff --git a/consensus/polybft/polybft.go b/consensus/polybft/polybft.go index 421625956b..978ef62144 100644 --- a/consensus/polybft/polybft.go +++ b/consensus/polybft/polybft.go @@ -552,6 +552,8 @@ func (p *Polybft) initRuntime() error { txPool: p.txPool, bridgeTopic: p.bridgeTopic, numBlockConfirmations: p.config.NumBlockConfirmations, + IsRelayer: p.config.Config.IsRelayer, + RPCEndpoint: p.config.Config.RPCEndpoint, } runtime, err := newConsensusRuntime(p.logger, runtimeConfig) diff --git a/consensus/polybft/polybft_test.go b/consensus/polybft/polybft_test.go index 72714b14fc..0216eb5f0c 100644 --- a/consensus/polybft/polybft_test.go +++ b/consensus/polybft/polybft_test.go @@ -208,7 +208,10 @@ func TestPolybft_Close(t *testing.T) { polybft := Polybft{ closeCh: make(chan struct{}), syncer: syncer, - runtime: &consensusRuntime{stateSyncManager: &dummyStateSyncManager{}}, + runtime: &consensusRuntime{ + stateSyncManager: &dummyStateSyncManager{}, + stateSyncRelayer: &dummyStakeSyncRelayer{}, + }, } assert.NoError(t, polybft.Close()) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index 5c2b50fce4..aaf40c2c58 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -19,6 +19,8 @@ var ( stateSyncProofsBucket = []byte("stateSyncProofs") // bucket to store message votes (signatures) messageVotesBucket = []byte("votes") + // bucket to store all state sync relayer data + stateSyncRelayerBucket = []byte("relayer") // errNotEnoughStateSyncs error message errNotEnoughStateSyncs = errors.New("there is either a gap or not enough sync events") @@ -26,6 +28,11 @@ var ( errCommitmentNotBuilt = errors.New("there is no built commitment to register") // errNoCommitmentForStateSync error message errNoCommitmentForStateSync = errors.New("no commitment found for given state sync event") + // errDataForStateSyncRelayer error message + errDataForStateSyncRelayer = errors.New("no data for state sync relayer") + + stateSyncRelayerBlockNumberKey = []byte("block_number_key") + stateSyncRelayerEventIDKey = []byte("event_id_key") ) /* @@ -39,6 +46,10 @@ commitments/ stateSyncProofs/ |--> stateSyncProof.StateSync.Id -> *StateSyncProof (json marshalled) + +relayer/ +|--> block_number_key -> uint64 block number +|--> event_id_key -> uint64 eventid number */ type StateSyncStore struct { @@ -59,6 +70,13 @@ func (s *StateSyncStore) initialize(tx *bolt.Tx) error { return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncProofsBucket), err) } + // create bucket for state sync relayer and init default values + if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerBucket); err != nil { + return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerBucket), err) + } else if err := s.insertStateSyncRelayerDataWithTx(tx, 1, 0); err != nil { + return fmt.Errorf("failed to insert initial values into bucket=%s: %w", string(stateSyncRelayerBucket), err) + } + return nil } @@ -365,3 +383,41 @@ func (s *StateSyncStore) getStateSyncProof(stateSyncID uint64) (*StateSyncProof, return ssp, err } + +// insertStateSyncRelayerData inserts the data for state sync relayer +func (s *StateSyncStore) insertStateSyncRelayerData(blockNumber, eventID uint64) error { + return s.db.Update(func(tx *bolt.Tx) error { + return s.insertStateSyncRelayerDataWithTx(tx, blockNumber, eventID) + }) +} + +// getStateSyncRelayerData gets the data for state sync relayer +func (s *StateSyncStore) getStateSyncRelayerData() (blockNumber uint64, eventID uint64, err error) { + err = s.db.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket(stateSyncRelayerBucket) + blockNumberBytes := bucket.Get(stateSyncRelayerBlockNumberKey) + eventIDBytes := bucket.Get(stateSyncRelayerEventIDKey) + + if len(blockNumberBytes) == 0 || len(eventIDBytes) == 0 { + return errDataForStateSyncRelayer + } + + blockNumber = common.EncodeBytesToUint64(blockNumberBytes) + eventID = common.EncodeBytesToUint64(eventIDBytes) + + return nil + }) + + return +} + +// insertStateSyncRelayerDataWithTx inserts the data for state sync relayer +func (s *StateSyncStore) insertStateSyncRelayerDataWithTx(tx *bolt.Tx, blockNumber, eventID uint64) error { + bucket := tx.Bucket(stateSyncRelayerBucket) + + if err := bucket.Put(stateSyncRelayerBlockNumberKey, common.EncodeUint64ToBytes(blockNumber)); err != nil { + return err + } + + return bucket.Put(stateSyncRelayerEventIDKey, common.EncodeUint64ToBytes(eventID)) +} diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 421686c7b2..f9af339b9c 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -297,3 +297,26 @@ func createTestStateSync(index int64) *contractsapi.StateSyncedEvent { Data: []byte{0, 1}, } } + +func TestState_StateSync_StateSyncRelayerData(t *testing.T) { + t.Parallel() + + state := newTestState(t) + + // get before insert - should return initialized values + blockNumber, eventID, err := state.StateSyncStore.getStateSyncRelayerData() + + assert.NoError(t, err) + assert.Equal(t, uint64(1), blockNumber) + assert.Equal(t, uint64(0), eventID) + + // insert + require.NoError(t, state.StateSyncStore.insertStateSyncRelayerData(100, 200)) + + // get after insert + blockNumber, eventID, err = state.StateSyncStore.getStateSyncRelayerData() + + assert.NoError(t, err) + assert.Equal(t, uint64(100), blockNumber) + assert.Equal(t, uint64(200), eventID) +} diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go new file mode 100644 index 0000000000..88f34a38df --- /dev/null +++ b/consensus/polybft/state_sync_relayer.go @@ -0,0 +1,282 @@ +package polybft + +import ( + "encoding/json" + "errors" + "fmt" + "net" + "strings" + + "github.com/0xPolygon/polygon-edge/consensus/polybft/common" + "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" + "github.com/0xPolygon/polygon-edge/contracts" + "github.com/0xPolygon/polygon-edge/state/runtime" + "github.com/0xPolygon/polygon-edge/txrelayer" + "github.com/0xPolygon/polygon-edge/types" + hclog "github.com/hashicorp/go-hclog" + "github.com/umbracle/ethgo" +) + +var errFailedToExecuteStateSync = errors.New("failed to execute state sync") + +type StateSyncRelayer interface { + PostBlock(req *common.PostBlockRequest) error + Init() error + Close() +} + +type stateSyncProofRetriever interface { + GetStateSyncProof(stateSyncID uint64) (types.Proof, error) +} + +var _ StateSyncRelayer = (*dummyStakeSyncRelayer)(nil) + +// dummyStakeSyncRelayer is a dummy implementation of a StateSyncRelayer used only for unit testing +type dummyStakeSyncRelayer struct{} + +func (d *dummyStakeSyncRelayer) PostBlock(req *common.PostBlockRequest) error { return nil } + +func (d *dummyStakeSyncRelayer) Init() error { return nil } +func (d *dummyStakeSyncRelayer) Close() {} + +var _ StateSyncRelayer = (*stateSyncRelayerImpl)(nil) + +type stateSyncRelayerImpl struct { + txRelayer txrelayer.TxRelayer + key ethgo.Key + store stateSyncProofRetriever + state *State + eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] + logger hclog.Logger + + dataCh chan *common.PostBlockRequest + closeCh chan struct{} +} + +func NewStateSyncRelayer( + txRelayer txrelayer.TxRelayer, + stateReceiverAddr types.Address, + state *State, + store stateSyncProofRetriever, + blockchain blockchainBackend, + key ethgo.Key, + logger hclog.Logger, +) StateSyncRelayer { + return &stateSyncRelayerImpl{ + txRelayer: txRelayer, + key: key, + store: store, + state: state, + closeCh: make(chan struct{}), + dataCh: make(chan *common.PostBlockRequest, 32), + eventsGetter: &eventsGetter[*contractsapi.NewCommitmentEvent]{ + blockchain: blockchain, + isValidLogFn: func(l *types.Log) bool { + return l.Address == stateReceiverAddr + }, + parseEventFn: func(_ *types.Header, log *ethgo.Log) (*contractsapi.NewCommitmentEvent, bool, error) { + var commitEvent contractsapi.NewCommitmentEvent + + doesMatch, err := commitEvent.ParseLog(log) + + return &commitEvent, doesMatch, err + }, + }, + logger: logger, + } +} + +func (ssr *stateSyncRelayerImpl) Init() error { + // start consumer + go func() { + for { + select { + case <-ssr.closeCh: + return + case req := <-ssr.dataCh: + stateNextBlockNumber, stateNextEventID, err := ssr.state.StateSyncStore.getStateSyncRelayerData() + if err != nil { + ssr.logger.Error("state sync relayer get state failed", "err", err) + + break + } + + nextBlockNum, nextEventID, err := ssr.handleNewBlock( + req.FullBlock.Block.Header, req.FullBlock.Receipts, stateNextBlockNumber, stateNextEventID) + if err != nil { + ssr.logger.Error("state sync relayer failed", + "state block", stateNextBlockNumber, "state eventID", stateNextEventID, + "block", nextBlockNum, "eventID", nextEventID, + "err", err) + } + + // we should write data back to database even if handleNewBlock returned some error + if err = ssr.state.StateSyncStore.insertStateSyncRelayerData( + nextBlockNum, nextEventID); err != nil { + ssr.logger.Error("state sync relayer insert state failed", + "state block", stateNextBlockNumber, "state eventID", stateNextEventID, + "block", nextBlockNum, "eventID", nextEventID, + "err", err) + } + } + } + }() + + return nil +} + +func (ssr *stateSyncRelayerImpl) Close() { + close(ssr.closeCh) +} + +func (ssr *stateSyncRelayerImpl) PostBlock(req *common.PostBlockRequest) error { + ssr.dataCh <- req // add to consumer queue + + return nil +} + +func (ssr *stateSyncRelayerImpl) handleNewBlock( + header *types.Header, receipts []*types.Receipt, + nextBlockNumber uint64, nextEventID uint64) (uint64, uint64, error) { + var ( + err error + events []*contractsapi.NewCommitmentEvent + ) + + for nextBlockNumber < header.Number { + if events, err = ssr.eventsGetter.getEvents(nextBlockNumber); err != nil { + return nextBlockNumber, nextEventID, err + } + + if nextEventID, err = ssr.handleEvents(nextEventID, events); err != nil { + return nextBlockNumber, nextEventID, err + } + + nextBlockNumber++ + } + + currentEvents, err := ssr.eventsGetter.getEventsFromReceipts(header, receipts) + if err != nil { + return nextBlockNumber, nextEventID, err + } + + if nextEventID, err = ssr.handleEvents(nextEventID, currentEvents); err != nil { + return nextBlockNumber, nextEventID, err + } + + return header.Number + 1, nextEventID, nil +} + +func (ssr *stateSyncRelayerImpl) handleEvents( + nextEventID uint64, events []*contractsapi.NewCommitmentEvent) (uint64, error) { + for _, event := range events { + if nextEventID > event.EndID.Uint64() { + continue // this event is already processed, but maybe not all events in block are + } + + if nextEventID < event.StartID.Uint64() { + nextEventID = event.StartID.Uint64() // this condition should be executed only first time + } + + for nextEventID <= event.EndID.Uint64() { + ssr.logger.Info("execute commitment", "id", nextEventID) + + proof, err := ssr.store.GetStateSyncProof(nextEventID) + if err != nil { + // ssr.logger.Error("failed to query proof", "id", currEventID, "err", err) + return nextEventID, fmt.Errorf("failed to query proof: %w", err) + } + + tx, err := ssr.createTx(proof) + if err != nil { + // ssr.logger.Error("failed to create tx", "id", currEventID, "err", err) + return nextEventID, fmt.Errorf("failed to create tx: %w", err) + } + + if err := ssr.sendTx(tx); err != nil { + return nextEventID, fmt.Errorf("failed to execute tx: %w", err) + } + + nextEventID++ // update nextEventID + } + } + + return nextEventID, nil +} + +func (ssr *stateSyncRelayerImpl) createTx(proof types.Proof) (*ethgo.Transaction, error) { + var sse *contractsapi.StateSync + + // since state sync event is a map in the jsonrpc response, + // to not have custom logic of converting the map to state sync event + // json encoding is used, since it manages to successfully unmarshal the + // event from the marshaled map + raw, err := json.Marshal(proof.Metadata["StateSync"]) + if err != nil { + return nil, fmt.Errorf("failed to marshal: %w", err) + } + + if err = json.Unmarshal(raw, &sse); err != nil { + return nil, fmt.Errorf("failed to unmarshal: %w", err) + } + + input, err := (&contractsapi.ExecuteStateReceiverFn{ + Proof: proof.Data, + Obj: sse, + }).EncodeAbi() + if err != nil { + return nil, err + } + + // execute the state sync + return ðgo.Transaction{ + From: ssr.key.Address(), + To: (*ethgo.Address)(&contracts.StateReceiverContract), + Gas: types.StateTransactionGasLimit, + Input: input, + }, nil +} + +func (ssr *stateSyncRelayerImpl) sendTx(txn *ethgo.Transaction) error { + receipt, err := ssr.txRelayer.SendTransaction(txn, ssr.key) + if err != nil { + return err + } + + if receipt.Status == uint64(types.ReceiptFailed) { + return runtime.ErrExecutionReverted + } + + var stateSyncResult contractsapi.StateSyncResultEvent + for _, log := range receipt.Logs { + matches, err := stateSyncResult.ParseLog(log) + if err != nil { + return err + } + + if !matches { + continue + } + + if !stateSyncResult.Status { + return errFailedToExecuteStateSync + } + } + + return nil +} + +func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.TxRelayer, error) { + if rpcEndpoint == "" || strings.Contains(rpcEndpoint, "0.0.0.0") { + _, port, err := net.SplitHostPort(rpcEndpoint) + if err == nil { + rpcEndpoint = fmt.Sprintf("http://%s:%s", "127.0.0.1", port) + } else { + rpcEndpoint = txrelayer.DefaultRPCAddress + } + } + + return txrelayer.NewTxRelayer( + txrelayer.WithIPAddress(rpcEndpoint), + txrelayer.WithWriter(logger.StandardWriter(&hclog.StandardLoggerOptions{}))) +} diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go new file mode 100644 index 0000000000..55d523793e --- /dev/null +++ b/consensus/polybft/state_sync_relayer_test.go @@ -0,0 +1,197 @@ +package polybft + +import ( + "math/big" + "testing" + "time" + + "github.com/0xPolygon/polygon-edge/consensus/polybft/common" + "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" + "github.com/0xPolygon/polygon-edge/types" + "github.com/hashicorp/go-hclog" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "github.com/umbracle/ethgo" + "github.com/umbracle/ethgo/abi" +) + +func TestStateSyncRelayer_PostBlock(t *testing.T) { + t.Parallel() + + testKey := createTestKey(t) + successStatus := types.ReceiptSuccess + block1Hash := types.StringToHash("x087887823ff23423") + block2Hash := types.StringToHash("x08ffeee23ff23423") + stateSyncAddr := types.StringToAddress("0x56563") + commitment1Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 1, 2, types.StringToHash("0x1")) + commitment2Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 3, 3, types.StringToHash("0x2")) + commitment3Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 4, 6, types.StringToHash("0x3")) + commitment4Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 7, 7, types.StringToHash("0x4")) + receiptsBlock1 := []*types.Receipt{ + { + Status: &successStatus, + Logs: []*types.Log{ + {}, commitment1Log, + }, + }, + } + receiptsBlock2 := []*types.Receipt{ + { + Status: &successStatus, + Logs: []*types.Log{ + {}, commitment2Log, + }, + }, + { + Status: &successStatus, + Logs: []*types.Log{ + commitment3Log, + }, + }, + } + receiptsBlock3 := []*types.Receipt{ + { + Status: &successStatus, + Logs: []*types.Log{ + {}, commitment4Log, + }, + }, + } + + proofMock := &mockStateSyncProofRetriever{ + fn: func(stateSyncID uint64) (types.Proof, error) { + return types.Proof{ + Data: []types.Hash{types.StringToHash("0x1122334455")}, + Metadata: map[string]interface{}{ + "StateSync": map[string]interface{}{ + "ID": stateSyncID, + "Sender": types.StringToAddress("0xffee"), + "Receiver": types.StringToAddress("0xeeff"), + "Data": nil, + }, + }, + }, nil + }, + } + blockhainMock := &blockchainMock{} + dummyTxRelayer := newDummyStakeTxRelayer(t, nil) + state := newTestState(t) + + stateSyncRelayer := NewStateSyncRelayer( + dummyTxRelayer, + stateSyncAddr, + state, + proofMock, + blockhainMock, + testKey, + hclog.Default(), + ) + + // post block 2, last state sync fails + blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{ + Hash: block1Hash, + }).Once() + blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receiptsBlock1, nil).Once() + // fail on stateSyncID == 6 -> last one in first try + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( + ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(5) + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( + ðgo.Receipt{Status: uint64(types.ReceiptFailed)}, nil).Once() + + require.NoError(t, stateSyncRelayer.Init()) + + // post first block + require.NoError(t, stateSyncRelayer.PostBlock(&common.PostBlockRequest{ + FullBlock: &types.FullBlock{ + Block: &types.Block{ + Header: &types.Header{ + Number: 2, + }, + }, + Receipts: receiptsBlock2, + }, + })) + + time.Sleep(time.Second * 2) // wait for some time + + // we need to be sure that 5 events are processed and last one failed + blockNumber, eventID, err := state.StateSyncStore.getStateSyncRelayerData() + + blockhainMock.AssertExpectations(t) + require.NoError(t, err) + require.Equal(t, uint64(2), blockNumber) + require.Equal(t, uint64(6), eventID) + + // post block 3, all the events should be processed and everything should pass + blockhainMock.On("GetHeaderByNumber", uint64(2)).Return(&types.Header{ + Hash: block2Hash, + }).Once() + blockhainMock.On("GetReceiptsByHash", block2Hash).Return(receiptsBlock2, nil).Once() + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( + ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(2) + + // post another block + require.NoError(t, stateSyncRelayer.PostBlock(&common.PostBlockRequest{ + FullBlock: &types.FullBlock{ + Block: &types.Block{ + Header: &types.Header{ + Number: 3, + }, + }, + Receipts: receiptsBlock3, + }, + })) + + stateSyncRelayer.Close() + + time.Sleep(time.Second * 2) // wait for some time + + // we need to be sure that 5 events are processed and last one failed + blockNumber, eventID, err = state.StateSyncStore.getStateSyncRelayerData() + + blockhainMock.AssertExpectations(t) + require.NoError(t, err) + require.Equal(t, uint64(4), blockNumber) + require.Equal(t, uint64(8), eventID) +} + +type mockStateSyncProofRetriever struct { + fn func(uint64) (types.Proof, error) +} + +func (m *mockStateSyncProofRetriever) GetStateSyncProof(stateSyncID uint64) (types.Proof, error) { + if m.fn != nil { + return m.fn(stateSyncID) + } + + return types.Proof{}, nil +} + +func createTestLogForNewCommitmentEvent( + t *testing.T, + stateSyncAddr types.Address, + startEventID uint64, + endEventID uint64, + rootHash types.Hash) *types.Log { + t.Helper() + + var evnt contractsapi.NewCommitmentEvent + + encodedData1, err := abi.MustNewType("uint256").Encode(new(big.Int).SetUint64(startEventID)) + require.NoError(t, err) + + encodedData2, err := abi.MustNewType("uint256").Encode(new(big.Int).SetUint64(endEventID)) + require.NoError(t, err) + + topics := []types.Hash{ + types.Hash(evnt.Sig()), + types.BytesToHash(encodedData1), + types.BytesToHash(encodedData2), + } + + return &types.Log{ + Address: stateSyncAddr, + Topics: topics, + Data: rootHash[:], + } +} diff --git a/server/server.go b/server/server.go index 394ed93226..1cdfca68b7 100644 --- a/server/server.go +++ b/server/server.go @@ -24,7 +24,6 @@ import ( "github.com/0xPolygon/polygon-edge/chain" "github.com/0xPolygon/polygon-edge/consensus" "github.com/0xPolygon/polygon-edge/consensus/polybft/statesyncrelayer" - "github.com/0xPolygon/polygon-edge/consensus/polybft/wallet" "github.com/0xPolygon/polygon-edge/contracts" "github.com/0xPolygon/polygon-edge/crypto" "github.com/0xPolygon/polygon-edge/helper/common" @@ -44,7 +43,6 @@ import ( "github.com/hashicorp/go-hclog" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/umbracle/ethgo" "google.golang.org/grpc" ) @@ -409,13 +407,6 @@ func NewServer(config *Config) (*Server, error) { return nil, err } - // start relayer - if config.Relayer { - if err := m.setupRelayer(); err != nil { - return nil, err - } - } - m.txpool.SetBaseFee(m.blockchain.Header()) m.txpool.Start() @@ -567,9 +558,11 @@ func (s *Server) setupConsensus() error { } config := &consensus.Config{ - Params: s.config.Chain.Params, - Config: engineConfig, - Path: filepath.Join(s.config.DataDir, "consensus"), + Params: s.config.Chain.Params, + Config: engineConfig, + Path: filepath.Join(s.config.DataDir, "consensus"), + IsRelayer: s.config.Relayer, + RPCEndpoint: s.config.JSONRPC.JSONRPCAddr.String(), } consensus, err := engine( @@ -624,41 +617,6 @@ func extractBlockTime(engineConfig map[string]interface{}) (common.Duration, err return blockTime, nil } -// setupRelayer sets up the relayer -func (s *Server) setupRelayer() error { - account, err := wallet.NewAccountFromSecret(s.secretsManager) - if err != nil { - return fmt.Errorf("failed to create account from secret: %w", err) - } - - polyBFTConfig, err := consensusPolyBFT.GetPolyBFTConfig(s.config.Chain) - if err != nil { - return fmt.Errorf("failed to extract polybft config: %w", err) - } - - trackerStartBlockConfig := map[types.Address]uint64{} - if polyBFTConfig.Bridge != nil { - trackerStartBlockConfig = polyBFTConfig.Bridge.EventTrackerStartBlocks - } - - relayer := statesyncrelayer.NewRelayer( - s.config.DataDir, - s.config.JSONRPC.JSONRPCAddr.String(), - ethgo.Address(contracts.StateReceiverContract), - trackerStartBlockConfig[contracts.StateReceiverContract], - s.logger.Named("relayer"), - wallet.NewEcdsaSigner(wallet.NewKey(account)), - s.config.RelayerTrackerPollInterval, - ) - - // start relayer - if err := relayer.Start(); err != nil { - return fmt.Errorf("failed to start relayer: %w", err) - } - - return nil -} - type jsonRPCHub struct { state state.State restoreProgression *progress.ProgressionWrapper From 1063766105b051a0eb8e91a39837a892bcb6bed4 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Sun, 10 Sep 2023 11:19:55 +0200 Subject: [PATCH 02/27] small changes --- consensus/polybft/state_store_state_sync.go | 58 ++++++++----------- .../polybft/state_store_state_sync_test.go | 24 ++++---- consensus/polybft/state_sync_relayer.go | 50 +++++++++++----- consensus/polybft/state_sync_relayer_test.go | 30 +++++----- 4 files changed, 87 insertions(+), 75 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index aaf40c2c58..de194db1d5 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -28,11 +28,9 @@ var ( errCommitmentNotBuilt = errors.New("there is no built commitment to register") // errNoCommitmentForStateSync error message errNoCommitmentForStateSync = errors.New("no commitment found for given state sync event") - // errDataForStateSyncRelayer error message - errDataForStateSyncRelayer = errors.New("no data for state sync relayer") - stateSyncRelayerBlockNumberKey = []byte("block_number_key") - stateSyncRelayerEventIDKey = []byte("event_id_key") + // stateSyncRelayerStateDataKey is db key for serialized state of state sync relayer data + stateSyncRelayerStateDataKey = []byte("data") ) /* @@ -48,8 +46,7 @@ stateSyncProofs/ |--> stateSyncProof.StateSync.Id -> *StateSyncProof (json marshalled) relayer/ -|--> block_number_key -> uint64 block number -|--> event_id_key -> uint64 eventid number +|--> data -> *StateSyncRelayerStateData (json marshalled) */ type StateSyncStore struct { @@ -73,8 +70,6 @@ func (s *StateSyncStore) initialize(tx *bolt.Tx) error { // create bucket for state sync relayer and init default values if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerBucket); err != nil { return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerBucket), err) - } else if err := s.insertStateSyncRelayerDataWithTx(tx, 1, 0); err != nil { - return fmt.Errorf("failed to insert initial values into bucket=%s: %w", string(stateSyncRelayerBucket), err) } return nil @@ -384,40 +379,35 @@ func (s *StateSyncStore) getStateSyncProof(stateSyncID uint64) (*StateSyncProof, return ssp, err } -// insertStateSyncRelayerData inserts the data for state sync relayer -func (s *StateSyncStore) insertStateSyncRelayerData(blockNumber, eventID uint64) error { +// insertStateSyncRelayerStateData inserts the state data for state sync relayer +func (s *StateSyncStore) insertStateSyncRelayerStateData(data *StateSyncRelayerStateData) error { return s.db.Update(func(tx *bolt.Tx) error { - return s.insertStateSyncRelayerDataWithTx(tx, blockNumber, eventID) - }) -} - -// getStateSyncRelayerData gets the data for state sync relayer -func (s *StateSyncStore) getStateSyncRelayerData() (blockNumber uint64, eventID uint64, err error) { - err = s.db.View(func(tx *bolt.Tx) error { - bucket := tx.Bucket(stateSyncRelayerBucket) - blockNumberBytes := bucket.Get(stateSyncRelayerBlockNumberKey) - eventIDBytes := bucket.Get(stateSyncRelayerEventIDKey) - - if len(blockNumberBytes) == 0 || len(eventIDBytes) == 0 { - return errDataForStateSyncRelayer + raw, err := json.Marshal(data) + if err != nil { + return err } - blockNumber = common.EncodeBytesToUint64(blockNumberBytes) - eventID = common.EncodeBytesToUint64(eventIDBytes) + if err := tx.Bucket(stateSyncRelayerBucket).Put(stateSyncRelayerStateDataKey, raw); err != nil { + return err + } return nil }) - - return } -// insertStateSyncRelayerDataWithTx inserts the data for state sync relayer -func (s *StateSyncStore) insertStateSyncRelayerDataWithTx(tx *bolt.Tx, blockNumber, eventID uint64) error { - bucket := tx.Bucket(stateSyncRelayerBucket) +// getStateSyncRelayerStateData gets the state data for state sync relayer +func (s *StateSyncStore) getStateSyncRelayerStateData() (*StateSyncRelayerStateData, error) { + var data *StateSyncRelayerStateData - if err := bucket.Put(stateSyncRelayerBlockNumberKey, common.EncodeUint64ToBytes(blockNumber)); err != nil { - return err - } + err := s.db.View(func(tx *bolt.Tx) error { + if v := tx.Bucket(stateSyncRelayerBucket).Get(stateSyncRelayerStateDataKey); v != nil { + if err := json.Unmarshal(v, &data); err != nil { + return err + } + } + + return nil + }) - return bucket.Put(stateSyncRelayerEventIDKey, common.EncodeUint64ToBytes(eventID)) + return data, err } diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index f9af339b9c..e6fb5ac219 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -298,25 +298,29 @@ func createTestStateSync(index int64) *contractsapi.StateSyncedEvent { } } -func TestState_StateSync_StateSyncRelayerData(t *testing.T) { +func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { t.Parallel() state := newTestState(t) // get before insert - should return initialized values - blockNumber, eventID, err := state.StateSyncStore.getStateSyncRelayerData() + ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() - assert.NoError(t, err) - assert.Equal(t, uint64(1), blockNumber) - assert.Equal(t, uint64(0), eventID) + require.NoError(t, err) + assert.Nil(t, ssrStateData) // insert - require.NoError(t, state.StateSyncStore.insertStateSyncRelayerData(100, 200)) + require.NoError(t, state.StateSyncStore.insertStateSyncRelayerStateData( + &StateSyncRelayerStateData{ + NextBlockNumber: 100, + NextEventID: 200, + }, + )) // get after insert - blockNumber, eventID, err = state.StateSyncStore.getStateSyncRelayerData() + ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() - assert.NoError(t, err) - assert.Equal(t, uint64(100), blockNumber) - assert.Equal(t, uint64(200), eventID) + require.NoError(t, err) + assert.Equal(t, uint64(100), ssrStateData.NextBlockNumber) + assert.Equal(t, uint64(200), ssrStateData.NextEventID) } diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 88f34a38df..0d5e3850b8 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -19,19 +19,21 @@ import ( var errFailedToExecuteStateSync = errors.New("failed to execute state sync") +// StateSyncRelayer is an interface that defines functions for state sync relayer type StateSyncRelayer interface { PostBlock(req *common.PostBlockRequest) error Init() error Close() } +// stateSyncProofRetriever is an interface that exposes function for retrieving state sync proof type stateSyncProofRetriever interface { GetStateSyncProof(stateSyncID uint64) (types.Proof, error) } var _ StateSyncRelayer = (*dummyStakeSyncRelayer)(nil) -// dummyStakeSyncRelayer is a dummy implementation of a StateSyncRelayer used only for unit testing +// dummyStakeSyncRelayer is a dummy implementation of a StateSyncRelayer type dummyStakeSyncRelayer struct{} func (d *dummyStakeSyncRelayer) PostBlock(req *common.PostBlockRequest) error { return nil } @@ -41,6 +43,12 @@ func (d *dummyStakeSyncRelayer) Close() {} var _ StateSyncRelayer = (*stateSyncRelayerImpl)(nil) +// StateSyncRelayerStateData is used to keep state of state sync relayer +type StateSyncRelayerStateData struct { + NextBlockNumber uint64 `json:"nextBlockNumber"` + NextEventID uint64 `json:"nextEventID"` +} + type stateSyncRelayerImpl struct { txRelayer txrelayer.TxRelayer key ethgo.Key @@ -94,28 +102,39 @@ func (ssr *stateSyncRelayerImpl) Init() error { case <-ssr.closeCh: return case req := <-ssr.dataCh: - stateNextBlockNumber, stateNextEventID, err := ssr.state.StateSyncStore.getStateSyncRelayerData() + ssrStateData, err := ssr.state.StateSyncStore.getStateSyncRelayerStateData() if err != nil { ssr.logger.Error("state sync relayer get state failed", "err", err) break } - nextBlockNum, nextEventID, err := ssr.handleNewBlock( - req.FullBlock.Block.Header, req.FullBlock.Receipts, stateNextBlockNumber, stateNextEventID) + // create default state data if this is the first time + if ssrStateData == nil { + ssrStateData = &StateSyncRelayerStateData{ + NextBlockNumber: 1, + NextEventID: 0, + } + } + + nextBlockNumber, nextEventID, err := ssr.handleNewBlock( + req.FullBlock.Block.Header, req.FullBlock.Receipts, ssrStateData) if err != nil { ssr.logger.Error("state sync relayer failed", - "state block", stateNextBlockNumber, "state eventID", stateNextEventID, - "block", nextBlockNum, "eventID", nextEventID, + "state block", ssrStateData.NextBlockNumber, "state eventID", ssrStateData.NextEventID, + "block", nextBlockNumber, "eventID", nextEventID, "err", err) } // we should write data back to database even if handleNewBlock returned some error - if err = ssr.state.StateSyncStore.insertStateSyncRelayerData( - nextBlockNum, nextEventID); err != nil { + err = ssr.state.StateSyncStore.insertStateSyncRelayerStateData(&StateSyncRelayerStateData{ + NextBlockNumber: nextBlockNumber, + NextEventID: nextEventID, + }) + if err != nil { ssr.logger.Error("state sync relayer insert state failed", - "state block", stateNextBlockNumber, "state eventID", stateNextEventID, - "block", nextBlockNum, "eventID", nextEventID, + "state block", ssrStateData.NextBlockNumber, "state eventID", ssrStateData.NextEventID, + "block", nextBlockNumber, "eventID", nextEventID, "err", err) } } @@ -136,11 +155,12 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *common.PostBlockRequest) error { } func (ssr *stateSyncRelayerImpl) handleNewBlock( - header *types.Header, receipts []*types.Receipt, - nextBlockNumber uint64, nextEventID uint64) (uint64, uint64, error) { + header *types.Header, receipts []*types.Receipt, stateData *StateSyncRelayerStateData) (uint64, uint64, error) { var ( - err error - events []*contractsapi.NewCommitmentEvent + err error + events []*contractsapi.NewCommitmentEvent + nextBlockNumber = stateData.NextBlockNumber + nextEventID = stateData.NextEventID ) for nextBlockNumber < header.Number { @@ -183,13 +203,11 @@ func (ssr *stateSyncRelayerImpl) handleEvents( proof, err := ssr.store.GetStateSyncProof(nextEventID) if err != nil { - // ssr.logger.Error("failed to query proof", "id", currEventID, "err", err) return nextEventID, fmt.Errorf("failed to query proof: %w", err) } tx, err := ssr.createTx(proof) if err != nil { - // ssr.logger.Error("failed to create tx", "id", currEventID, "err", err) return nextEventID, fmt.Errorf("failed to create tx: %w", err) } diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 55d523793e..4dae85ee42 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -96,7 +96,9 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(5) dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( - ðgo.Receipt{Status: uint64(types.ReceiptFailed)}, nil).Once() + ðgo.Receipt{ + Status: uint64(types.ReceiptFailed), + }, nil).Once() require.NoError(t, stateSyncRelayer.Init()) @@ -115,12 +117,12 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { time.Sleep(time.Second * 2) // wait for some time // we need to be sure that 5 events are processed and last one failed - blockNumber, eventID, err := state.StateSyncStore.getStateSyncRelayerData() + ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() blockhainMock.AssertExpectations(t) require.NoError(t, err) - require.Equal(t, uint64(2), blockNumber) - require.Equal(t, uint64(6), eventID) + require.Equal(t, uint64(2), ssrStateData.NextBlockNumber) + require.Equal(t, uint64(6), ssrStateData.NextEventID) // post block 3, all the events should be processed and everything should pass blockhainMock.On("GetHeaderByNumber", uint64(2)).Return(&types.Header{ @@ -147,12 +149,12 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { time.Sleep(time.Second * 2) // wait for some time // we need to be sure that 5 events are processed and last one failed - blockNumber, eventID, err = state.StateSyncStore.getStateSyncRelayerData() + ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() blockhainMock.AssertExpectations(t) require.NoError(t, err) - require.Equal(t, uint64(4), blockNumber) - require.Equal(t, uint64(8), eventID) + require.Equal(t, uint64(4), ssrStateData.NextBlockNumber) + require.Equal(t, uint64(8), ssrStateData.NextEventID) } type mockStateSyncProofRetriever struct { @@ -183,15 +185,13 @@ func createTestLogForNewCommitmentEvent( encodedData2, err := abi.MustNewType("uint256").Encode(new(big.Int).SetUint64(endEventID)) require.NoError(t, err) - topics := []types.Hash{ - types.Hash(evnt.Sig()), - types.BytesToHash(encodedData1), - types.BytesToHash(encodedData2), - } - return &types.Log{ Address: stateSyncAddr, - Topics: topics, - Data: rootHash[:], + Topics: []types.Hash{ + types.Hash(evnt.Sig()), + types.BytesToHash(encodedData1), + types.BytesToHash(encodedData2), + }, + Data: rootHash[:], } } From d9d09a3c19394d95f2f4bb9459ca119c87c95f01 Mon Sep 17 00:00:00 2001 From: Goran Rojovic Date: Wed, 4 Oct 2023 10:56:43 +0200 Subject: [PATCH 03/27] Rebase fix --- consensus/polybft/state_sync_relayer.go | 13 ++++++------- consensus/polybft/state_sync_relayer_test.go | 5 ++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 0d5e3850b8..fd5cf9e019 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -7,13 +7,12 @@ import ( "net" "strings" - "github.com/0xPolygon/polygon-edge/consensus/polybft/common" "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" "github.com/0xPolygon/polygon-edge/contracts" "github.com/0xPolygon/polygon-edge/state/runtime" "github.com/0xPolygon/polygon-edge/txrelayer" "github.com/0xPolygon/polygon-edge/types" - hclog "github.com/hashicorp/go-hclog" + "github.com/hashicorp/go-hclog" "github.com/umbracle/ethgo" ) @@ -21,7 +20,7 @@ var errFailedToExecuteStateSync = errors.New("failed to execute state sync") // StateSyncRelayer is an interface that defines functions for state sync relayer type StateSyncRelayer interface { - PostBlock(req *common.PostBlockRequest) error + PostBlock(req *PostBlockRequest) error Init() error Close() } @@ -36,7 +35,7 @@ var _ StateSyncRelayer = (*dummyStakeSyncRelayer)(nil) // dummyStakeSyncRelayer is a dummy implementation of a StateSyncRelayer type dummyStakeSyncRelayer struct{} -func (d *dummyStakeSyncRelayer) PostBlock(req *common.PostBlockRequest) error { return nil } +func (d *dummyStakeSyncRelayer) PostBlock(req *PostBlockRequest) error { return nil } func (d *dummyStakeSyncRelayer) Init() error { return nil } func (d *dummyStakeSyncRelayer) Close() {} @@ -57,7 +56,7 @@ type stateSyncRelayerImpl struct { eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] logger hclog.Logger - dataCh chan *common.PostBlockRequest + dataCh chan *PostBlockRequest closeCh chan struct{} } @@ -76,7 +75,7 @@ func NewStateSyncRelayer( store: store, state: state, closeCh: make(chan struct{}), - dataCh: make(chan *common.PostBlockRequest, 32), + dataCh: make(chan *PostBlockRequest, 32), eventsGetter: &eventsGetter[*contractsapi.NewCommitmentEvent]{ blockchain: blockchain, isValidLogFn: func(l *types.Log) bool { @@ -148,7 +147,7 @@ func (ssr *stateSyncRelayerImpl) Close() { close(ssr.closeCh) } -func (ssr *stateSyncRelayerImpl) PostBlock(req *common.PostBlockRequest) error { +func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { ssr.dataCh <- req // add to consumer queue return nil diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 4dae85ee42..478adcf514 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -5,7 +5,6 @@ import ( "testing" "time" - "github.com/0xPolygon/polygon-edge/consensus/polybft/common" "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" @@ -103,7 +102,7 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { require.NoError(t, stateSyncRelayer.Init()) // post first block - require.NoError(t, stateSyncRelayer.PostBlock(&common.PostBlockRequest{ + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ FullBlock: &types.FullBlock{ Block: &types.Block{ Header: &types.Header{ @@ -133,7 +132,7 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(2) // post another block - require.NoError(t, stateSyncRelayer.PostBlock(&common.PostBlockRequest{ + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ FullBlock: &types.FullBlock{ Block: &types.Block{ Header: &types.Header{ From 7feb8780dd530bbbcc90590eaf5570234c57aa39 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Wed, 4 Oct 2023 14:21:47 +0200 Subject: [PATCH 04/27] refactor(e) --- consensus/polybft/state_store_state_sync.go | 92 ++++++- .../polybft/state_store_state_sync_test.go | 18 +- consensus/polybft/state_sync_relayer.go | 229 +++++++++++------- consensus/polybft/state_sync_relayer_test.go | 22 +- server/server.go | 9 - 5 files changed, 243 insertions(+), 127 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index de194db1d5..e4d775f57c 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -20,7 +20,9 @@ var ( // bucket to store message votes (signatures) messageVotesBucket = []byte("votes") // bucket to store all state sync relayer data - stateSyncRelayerBucket = []byte("relayer") + stateSyncRelayerDataBucket = []byte("relayerData") + // bucket to store all state sync relayer events + stateSyncRelayerEventsBucket = []byte("relayerEvents") // errNotEnoughStateSyncs error message errNotEnoughStateSyncs = errors.New("there is either a gap or not enough sync events") @@ -45,8 +47,11 @@ commitments/ stateSyncProofs/ |--> stateSyncProof.StateSync.Id -> *StateSyncProof (json marshalled) -relayer/ +relayerData/ |--> data -> *StateSyncRelayerStateData (json marshalled) + +relayerEvents/ +|--> StateSyncRelayerEventData.EventID -> *StateSyncRelayerEventData (json marshalled) */ type StateSyncStore struct { @@ -67,9 +72,12 @@ func (s *StateSyncStore) initialize(tx *bolt.Tx) error { return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncProofsBucket), err) } - // create bucket for state sync relayer and init default values - if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerBucket); err != nil { - return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerBucket), err) + if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerDataBucket); err != nil { + return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerDataBucket), err) + } + + if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerEventsBucket); err != nil { + return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerEventsBucket), err) } return nil @@ -379,19 +387,30 @@ func (s *StateSyncStore) getStateSyncProof(stateSyncID uint64) (*StateSyncProof, return ssp, err } -// insertStateSyncRelayerStateData inserts the state data for state sync relayer -func (s *StateSyncStore) insertStateSyncRelayerStateData(data *StateSyncRelayerStateData) error { +// insertStateSyncRelayerStateData inserts the state data for state sync relayer together with new events +func (s *StateSyncStore) insertStateSyncRelayerStateData( + data *StateSyncRelayerStateData, + newEvents []*StateSyncRelayerEventData) error { return s.db.Update(func(tx *bolt.Tx) error { - raw, err := json.Marshal(data) - if err != nil { - return err + for _, evnt := range newEvents { + raw, err := json.Marshal(evnt) + if err != nil { + return err + } + + key := common.EncodeUint64ToBytes(evnt.EventID) + + if err := tx.Bucket(stateSyncRelayerEventsBucket).Put(key, raw); err != nil { + return err + } } - if err := tx.Bucket(stateSyncRelayerBucket).Put(stateSyncRelayerStateDataKey, raw); err != nil { + raw, err := json.Marshal(data) + if err != nil { return err } - return nil + return tx.Bucket(stateSyncRelayerDataBucket).Put(stateSyncRelayerStateDataKey, raw) }) } @@ -400,7 +419,7 @@ func (s *StateSyncStore) getStateSyncRelayerStateData() (*StateSyncRelayerStateD var data *StateSyncRelayerStateData err := s.db.View(func(tx *bolt.Tx) error { - if v := tx.Bucket(stateSyncRelayerBucket).Get(stateSyncRelayerStateDataKey); v != nil { + if v := tx.Bucket(stateSyncRelayerDataBucket).Get(stateSyncRelayerStateDataKey); v != nil { if err := json.Unmarshal(v, &data); err != nil { return err } @@ -411,3 +430,50 @@ func (s *StateSyncStore) getStateSyncRelayerStateData() (*StateSyncRelayerStateD return data, err } + +// updateStateSyncRelayerEvent removes StateSyncRelayerEventData from database +func (s *StateSyncStore) removeStateSyncRelayerEvent(eventID uint64) error { + return s.db.Update(func(tx *bolt.Tx) error { + key := common.EncodeUint64ToBytes(eventID) + + return tx.Bucket(stateSyncRelayerEventsBucket).Delete(key) + }) +} + +// updateStateSyncRelayerEvent updates StateSyncRelayerEventData +func (s *StateSyncStore) updateStateSyncRelayerEvent(evnt *StateSyncRelayerEventData) error { + return s.db.Update(func(tx *bolt.Tx) error { + raw, err := json.Marshal(evnt) + if err != nil { + return err + } + + key := common.EncodeUint64ToBytes(evnt.EventID) + + return tx.Bucket(stateSyncRelayerEventsBucket).Put(key, raw) + }) +} + +// getAllAvailableEvents retrieves all StateSyncRelayerEventData that should be sent as a transactions +func (s *StateSyncStore) getAllAvailableEvents() (result []*StateSyncRelayerEventData, err error) { + if err = s.db.View(func(tx *bolt.Tx) error { + return tx.Bucket(stateSyncRelayerEventsBucket).ForEach(func(k, v []byte) error { + var event *StateSyncRelayerEventData + + if err := json.Unmarshal(v, &event); err != nil { + return err + } + + // consider retrieving old sent events (from earlier blocks) too + if !event.SentStatus { + result = append(result, event) + } + + return nil + }) + }); err != nil { + return nil, err + } + + return result, nil +} diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index e6fb5ac219..3686e7a6bf 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -312,8 +312,11 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { // insert require.NoError(t, state.StateSyncStore.insertStateSyncRelayerStateData( &StateSyncRelayerStateData{ - NextBlockNumber: 100, - NextEventID: 200, + LastBlockNumber: 100, + }, + []*StateSyncRelayerEventData{ + {EventID: 2}, + {EventID: 4}, }, )) @@ -321,6 +324,13 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() require.NoError(t, err) - assert.Equal(t, uint64(100), ssrStateData.NextBlockNumber) - assert.Equal(t, uint64(200), ssrStateData.NextEventID) + assert.Equal(t, uint64(100), ssrStateData.LastBlockNumber) + + // get available events + events, err := state.StateSyncStore.getAllAvailableEvents() + + require.NoError(t, err) + require.Len(t, events, 2) + require.Equal(t, uint64(2), events[0].EventID) + require.Equal(t, uint64(4), events[1].EventID) } diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index fd5cf9e019..9be3d12eb0 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -1,6 +1,7 @@ package polybft import ( + "context" "encoding/json" "errors" "fmt" @@ -14,6 +15,14 @@ import ( "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" "github.com/umbracle/ethgo" + "golang.org/x/sync/semaphore" +) + +const ( + // maxParallelTxWorkers how many transactions can be sent in parallel + maxParallelTxWorkers = 10 + // maxAttemptsToSend how many sending retries for one transaction + maxAttemptsToSend = 6 ) var errFailedToExecuteStateSync = errors.New("failed to execute state sync") @@ -44,8 +53,16 @@ var _ StateSyncRelayer = (*stateSyncRelayerImpl)(nil) // StateSyncRelayerStateData is used to keep state of state sync relayer type StateSyncRelayerStateData struct { - NextBlockNumber uint64 `json:"nextBlockNumber"` - NextEventID uint64 `json:"nextEventID"` + LastBlockNumber uint64 `json:"lastBlockNumber"` +} + +// StateSyncRelayerEventData keeps information about an event +type StateSyncRelayerEventData struct { + EventID uint64 `json:"eventID"` + CountTries uint64 `json:"countTries"` + // block when state sync is sent + BlockNumber uint64 `json:"blockNumber"` + SentStatus bool `json:"sentStatus"` } type stateSyncRelayerImpl struct { @@ -55,9 +72,11 @@ type stateSyncRelayerImpl struct { state *State eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] logger hclog.Logger + blockchain blockchainBackend - dataCh chan *PostBlockRequest - closeCh chan struct{} + sem *semaphore.Weighted + notifyCh chan struct{} + closeCh chan struct{} } func NewStateSyncRelayer( @@ -70,12 +89,14 @@ func NewStateSyncRelayer( logger hclog.Logger, ) StateSyncRelayer { return &stateSyncRelayerImpl{ - txRelayer: txRelayer, - key: key, - store: store, - state: state, - closeCh: make(chan struct{}), - dataCh: make(chan *PostBlockRequest, 32), + txRelayer: txRelayer, + key: key, + store: store, + state: state, + sem: semaphore.NewWeighted(10), + closeCh: make(chan struct{}), + notifyCh: make(chan struct{}, 1), + blockchain: blockchain, eventsGetter: &eventsGetter[*contractsapi.NewCommitmentEvent]{ blockchain: blockchain, isValidLogFn: func(l *types.Log) bool { @@ -100,42 +121,8 @@ func (ssr *stateSyncRelayerImpl) Init() error { select { case <-ssr.closeCh: return - case req := <-ssr.dataCh: - ssrStateData, err := ssr.state.StateSyncStore.getStateSyncRelayerStateData() - if err != nil { - ssr.logger.Error("state sync relayer get state failed", "err", err) - - break - } - - // create default state data if this is the first time - if ssrStateData == nil { - ssrStateData = &StateSyncRelayerStateData{ - NextBlockNumber: 1, - NextEventID: 0, - } - } - - nextBlockNumber, nextEventID, err := ssr.handleNewBlock( - req.FullBlock.Block.Header, req.FullBlock.Receipts, ssrStateData) - if err != nil { - ssr.logger.Error("state sync relayer failed", - "state block", ssrStateData.NextBlockNumber, "state eventID", ssrStateData.NextEventID, - "block", nextBlockNumber, "eventID", nextEventID, - "err", err) - } - - // we should write data back to database even if handleNewBlock returned some error - err = ssr.state.StateSyncStore.insertStateSyncRelayerStateData(&StateSyncRelayerStateData{ - NextBlockNumber: nextBlockNumber, - NextEventID: nextEventID, - }) - if err != nil { - ssr.logger.Error("state sync relayer insert state failed", - "state block", ssrStateData.NextBlockNumber, "state eventID", ssrStateData.NextEventID, - "block", nextBlockNumber, "eventID", nextEventID, - "err", err) - } + case <-ssr.notifyCh: + ssr.processBatch() } } }() @@ -148,77 +135,125 @@ func (ssr *stateSyncRelayerImpl) Close() { } func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { - ssr.dataCh <- req // add to consumer queue + state, err := ssr.state.StateSyncStore.getStateSyncRelayerStateData() + if err != nil { + return fmt.Errorf("state sync relayer get state failed: %w", err) + } - return nil -} + // create default state data if this is the first time + if state == nil { + state = &StateSyncRelayerStateData{LastBlockNumber: 0} + } -func (ssr *stateSyncRelayerImpl) handleNewBlock( - header *types.Header, receipts []*types.Receipt, stateData *StateSyncRelayerStateData) (uint64, uint64, error) { - var ( - err error - events []*contractsapi.NewCommitmentEvent - nextBlockNumber = stateData.NextBlockNumber - nextEventID = stateData.NextEventID - ) - - for nextBlockNumber < header.Number { - if events, err = ssr.eventsGetter.getEvents(nextBlockNumber); err != nil { - return nextBlockNumber, nextEventID, err + for state.LastBlockNumber+1 < req.FullBlock.Block.Header.Number { + state.LastBlockNumber++ + + events, err := ssr.eventsGetter.getEvents(state.LastBlockNumber) + if err != nil { + return fmt.Errorf("state sync relayer: %w", err) } - if nextEventID, err = ssr.handleEvents(nextEventID, events); err != nil { - return nextBlockNumber, nextEventID, err + if err = ssr.state.StateSyncStore.insertStateSyncRelayerStateData(state, getConvertedEvents(events)); err != nil { + return fmt.Errorf("state sync relayer insert state failed: %w", err) } - nextBlockNumber++ + ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber) } - currentEvents, err := ssr.eventsGetter.getEventsFromReceipts(header, receipts) + events, err := ssr.eventsGetter.getEventsFromReceipts(req.FullBlock.Block.Header, req.FullBlock.Receipts) if err != nil { - return nextBlockNumber, nextEventID, err + return err + } + + state.LastBlockNumber = req.FullBlock.Block.Number() + + if err = ssr.state.StateSyncStore.insertStateSyncRelayerStateData(state, getConvertedEvents(events)); err != nil { + return fmt.Errorf("state sync relayer insert state failed: %w", err) } - if nextEventID, err = ssr.handleEvents(nextEventID, currentEvents); err != nil { - return nextBlockNumber, nextEventID, err + ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber) + + select { + case ssr.notifyCh <- struct{}{}: + default: } - return header.Number + 1, nextEventID, nil + return nil } -func (ssr *stateSyncRelayerImpl) handleEvents( - nextEventID uint64, events []*contractsapi.NewCommitmentEvent) (uint64, error) { - for _, event := range events { - if nextEventID > event.EndID.Uint64() { - continue // this event is already processed, but maybe not all events in block are - } +func (ssr *stateSyncRelayerImpl) processBatch() { + events, err := ssr.state.StateSyncStore.getAllAvailableEvents() + if err != nil { + ssr.logger.Error("error while reading available events", "err", err) + + return + } - if nextEventID < event.StartID.Uint64() { - nextEventID = event.StartID.Uint64() // this condition should be executed only first time + for _, eventData := range events { + if err := ssr.processEvent(eventData); err != nil { + ssr.logger.Error("error while processing event", "err", err) } + } +} - for nextEventID <= event.EndID.Uint64() { - ssr.logger.Info("execute commitment", "id", nextEventID) +func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventData) error { + eventData.CountTries++ - proof, err := ssr.store.GetStateSyncProof(nextEventID) - if err != nil { - return nextEventID, fmt.Errorf("failed to query proof: %w", err) - } + if eventData.CountTries >= maxAttemptsToSend { + _ = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) - tx, err := ssr.createTx(proof) - if err != nil { - return nextEventID, fmt.Errorf("failed to create tx: %w", err) - } + return fmt.Errorf("failed to send event too many times: %d", eventData.EventID) + } + + proof, err := ssr.store.GetStateSyncProof(eventData.EventID) + if err != nil { + _ = ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData) + + return fmt.Errorf("failed to query proof: %d, %w", eventData.EventID, err) + } + + tx, err := ssr.createTx(proof) + if err != nil { + _ = ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData) + + return fmt.Errorf("failed to create tx: %d, %w", eventData.EventID, err) + } + + if err := ssr.sem.Acquire(context.Background(), 1); err != nil { + // dont update state in this case! + return fmt.Errorf("failed to acquire semaphore: %d, %w", eventData.EventID, err) + } + + eventData.BlockNumber = ssr.blockchain.CurrentHeader().Number + eventData.SentStatus = true + + if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { + ssr.sem.Release(1) + + return fmt.Errorf("failed to move to sent: %d, %w", eventData.EventID, err) + } + + go func() { + defer ssr.sem.Release(1) + + if err := ssr.sendTx(tx); err != nil { + ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) - if err := ssr.sendTx(tx); err != nil { - return nextEventID, fmt.Errorf("failed to execute tx: %w", err) + eventData.SentStatus = false + + if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { + ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) } + } else { + ssr.logger.Info("state sync relayer has sent event", "eventID", eventData.EventID) - nextEventID++ // update nextEventID + if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { + ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) + } } - } + }() - return nextEventID, nil + return nil } func (ssr *stateSyncRelayerImpl) createTx(proof types.Proof) (*ethgo.Transaction, error) { @@ -297,3 +332,13 @@ func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.T txrelayer.WithIPAddress(rpcEndpoint), txrelayer.WithWriter(logger.StandardWriter(&hclog.StandardLoggerOptions{}))) } + +func getConvertedEvents(events []*contractsapi.NewCommitmentEvent) (newEvents []*StateSyncRelayerEventData) { + for _, event := range events { + for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { + newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) + } + } + + return newEvents +} diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 478adcf514..681311c044 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -20,7 +20,6 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { testKey := createTestKey(t) successStatus := types.ReceiptSuccess block1Hash := types.StringToHash("x087887823ff23423") - block2Hash := types.StringToHash("x08ffeee23ff23423") stateSyncAddr := types.StringToAddress("0x56563") commitment1Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 1, 2, types.StringToHash("0x1")) commitment2Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 3, 3, types.StringToHash("0x2")) @@ -86,6 +85,10 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { hclog.Default(), ) + blockhainMock.On("CurrentHeader").Return(&types.Header{ + Hash: block1Hash, + Number: 1, + }) // post block 2, last state sync fails blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{ Hash: block1Hash, @@ -120,14 +123,11 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { blockhainMock.AssertExpectations(t) require.NoError(t, err) - require.Equal(t, uint64(2), ssrStateData.NextBlockNumber) - require.Equal(t, uint64(6), ssrStateData.NextEventID) + require.Equal(t, uint64(2), ssrStateData.LastBlockNumber) + + time.Sleep(time.Second * 2) // wait for some time // post block 3, all the events should be processed and everything should pass - blockhainMock.On("GetHeaderByNumber", uint64(2)).Return(&types.Header{ - Hash: block2Hash, - }).Once() - blockhainMock.On("GetReceiptsByHash", block2Hash).Return(receiptsBlock2, nil).Once() dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(2) @@ -152,8 +152,12 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { blockhainMock.AssertExpectations(t) require.NoError(t, err) - require.Equal(t, uint64(4), ssrStateData.NextBlockNumber) - require.Equal(t, uint64(8), ssrStateData.NextEventID) + require.Equal(t, uint64(3), ssrStateData.LastBlockNumber) + + events, err := state.StateSyncStore.getAllAvailableEvents() + + require.NoError(t, err) + require.Len(t, events, 0) } type mockStateSyncProofRetriever struct { diff --git a/server/server.go b/server/server.go index 1cdfca68b7..e88e3f27ca 100644 --- a/server/server.go +++ b/server/server.go @@ -23,7 +23,6 @@ import ( "github.com/0xPolygon/polygon-edge/blockchain" "github.com/0xPolygon/polygon-edge/chain" "github.com/0xPolygon/polygon-edge/consensus" - "github.com/0xPolygon/polygon-edge/consensus/polybft/statesyncrelayer" "github.com/0xPolygon/polygon-edge/contracts" "github.com/0xPolygon/polygon-edge/crypto" "github.com/0xPolygon/polygon-edge/helper/common" @@ -87,9 +86,6 @@ type Server struct { // restore restoreProgression *progress.ProgressionWrapper - // stateSyncRelayer is handling state syncs execution (Polybft exclusive) - stateSyncRelayer *statesyncrelayer.StateSyncRelayer - // gasHelper is providing functions regarding gas and fees gasHelper *gasprice.GasHelper } @@ -944,11 +940,6 @@ func (s *Server) Close() { } } - // Stop state sync relayer - if s.stateSyncRelayer != nil { - s.stateSyncRelayer.Stop() - } - // Close the txpool's main loop s.txpool.Close() From a8c6c0c1a53e5143c6bcc1edea86f2af36a9bd10 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Fri, 6 Oct 2023 09:29:12 +0200 Subject: [PATCH 05/27] resend --- consensus/polybft/state_store_state_sync.go | 7 ++--- .../polybft/state_store_state_sync_test.go | 7 +++-- consensus/polybft/state_sync_relayer.go | 27 +++++++++++-------- consensus/polybft/state_sync_relayer_test.go | 2 +- jsonrpc/throttling_test.go | 6 ++--- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index e4d775f57c..ee966441a1 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -455,7 +455,8 @@ func (s *StateSyncStore) updateStateSyncRelayerEvent(evnt *StateSyncRelayerEvent } // getAllAvailableEvents retrieves all StateSyncRelayerEventData that should be sent as a transactions -func (s *StateSyncStore) getAllAvailableEvents() (result []*StateSyncRelayerEventData, err error) { +func (s *StateSyncStore) getAllAvailableEvents( + staleBlockNumber uint64) (result []*StateSyncRelayerEventData, err error) { if err = s.db.View(func(tx *bolt.Tx) error { return tx.Bucket(stateSyncRelayerEventsBucket).ForEach(func(k, v []byte) error { var event *StateSyncRelayerEventData @@ -464,8 +465,8 @@ func (s *StateSyncStore) getAllAvailableEvents() (result []*StateSyncRelayerEven return err } - // consider retrieving old sent events (from earlier blocks) too - if !event.SentStatus { + // event that is sent way long before should be resent again + if !event.SentStatus || (staleBlockNumber > 0 && event.BlockNumber <= staleBlockNumber) { result = append(result, event) } diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 3686e7a6bf..51023f0d38 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -317,6 +317,8 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { []*StateSyncRelayerEventData{ {EventID: 2}, {EventID: 4}, + {EventID: 6, SentStatus: true, BlockNumber: 101}, + {EventID: 7, SentStatus: true, BlockNumber: 100}, }, )) @@ -327,10 +329,11 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { assert.Equal(t, uint64(100), ssrStateData.LastBlockNumber) // get available events - events, err := state.StateSyncStore.getAllAvailableEvents() + events, err := state.StateSyncStore.getAllAvailableEvents(100) require.NoError(t, err) - require.Len(t, events, 2) + require.Len(t, events, 3) require.Equal(t, uint64(2), events[0].EventID) require.Equal(t, uint64(4), events[1].EventID) + require.Equal(t, uint64(7), events[2].EventID) } diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 9be3d12eb0..aee9fe15b8 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -23,6 +23,8 @@ const ( maxParallelTxWorkers = 10 // maxAttemptsToSend how many sending retries for one transaction maxAttemptsToSend = 6 + // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try again to send transaction + maxBlocksToWaitForResend = uint64(50) ) var errFailedToExecuteStateSync = errors.New("failed to execute state sync") @@ -182,7 +184,12 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { } func (ssr *stateSyncRelayerImpl) processBatch() { - events, err := ssr.state.StateSyncStore.getAllAvailableEvents() + staleBlockNumber := uint64(0) + if bn := ssr.blockchain.CurrentHeader().Number; bn > maxBlocksToWaitForResend { + staleBlockNumber = bn - maxBlocksToWaitForResend + } + + events, err := ssr.state.StateSyncStore.getAllAvailableEvents(staleBlockNumber) if err != nil { ssr.logger.Error("error while reading available events", "err", err) @@ -205,14 +212,7 @@ func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventDa return fmt.Errorf("failed to send event too many times: %d", eventData.EventID) } - proof, err := ssr.store.GetStateSyncProof(eventData.EventID) - if err != nil { - _ = ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData) - - return fmt.Errorf("failed to query proof: %d, %w", eventData.EventID, err) - } - - tx, err := ssr.createTx(proof) + tx, err := ssr.createTx(eventData.EventID) if err != nil { _ = ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData) @@ -245,7 +245,7 @@ func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventDa ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) } } else { - ssr.logger.Info("state sync relayer has sent event", "eventID", eventData.EventID) + ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) @@ -256,9 +256,14 @@ func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventDa return nil } -func (ssr *stateSyncRelayerImpl) createTx(proof types.Proof) (*ethgo.Transaction, error) { +func (ssr *stateSyncRelayerImpl) createTx(eventID uint64) (*ethgo.Transaction, error) { var sse *contractsapi.StateSync + proof, err := ssr.store.GetStateSyncProof(eventID) + if err != nil { + return nil, err + } + // since state sync event is a map in the jsonrpc response, // to not have custom logic of converting the map to state sync event // json encoding is used, since it manages to successfully unmarshal the diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 681311c044..c472a1ef06 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -154,7 +154,7 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(3), ssrStateData.LastBlockNumber) - events, err := state.StateSyncStore.getAllAvailableEvents() + events, err := state.StateSyncStore.getAllAvailableEvents(0) require.NoError(t, err) require.Len(t, events, 0) diff --git a/jsonrpc/throttling_test.go b/jsonrpc/throttling_test.go index 056c0bbc69..13b73ac905 100644 --- a/jsonrpc/throttling_test.go +++ b/jsonrpc/throttling_test.go @@ -59,7 +59,7 @@ func TestThrottling(t *testing.T) { }() go func() { - time.Sleep(time.Millisecond * 600) + time.Sleep(time.Millisecond * 620) defer wg.Done() @@ -70,7 +70,7 @@ func TestThrottling(t *testing.T) { }() go func() { - time.Sleep(time.Millisecond * 610) + time.Sleep(time.Millisecond * 640) defer wg.Done() @@ -81,7 +81,7 @@ func TestThrottling(t *testing.T) { }() go func() { - time.Sleep(time.Millisecond * 950) + time.Sleep(time.Millisecond * 1000) defer wg.Done() From 5cd31c7007abe4357906e84f509fbebe0a5dd51e Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Fri, 6 Oct 2023 12:20:00 +0200 Subject: [PATCH 06/27] small fix --- consensus/polybft/state_sync_relayer.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index aee9fe15b8..5886eb0a2f 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -27,7 +27,10 @@ const ( maxBlocksToWaitForResend = uint64(50) ) -var errFailedToExecuteStateSync = errors.New("failed to execute state sync") +var ( + errFailedToExecuteStateSync = errors.New("failed to execute state sync") + errAlreadyProcessedStateSync = errors.New("StateReceiver: STATE_SYNC_IS_PROCESSED") +) // StateSyncRelayer is an interface that defines functions for state sync relayer type StateSyncRelayer interface { @@ -206,7 +209,7 @@ func (ssr *stateSyncRelayerImpl) processBatch() { func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventData) error { eventData.CountTries++ - if eventData.CountTries >= maxAttemptsToSend { + if eventData.CountTries > maxAttemptsToSend { _ = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) return fmt.Errorf("failed to send event too many times: %d", eventData.EventID) @@ -236,18 +239,24 @@ func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventDa go func() { defer ssr.sem.Release(1) - if err := ssr.sendTx(tx); err != nil { + err := ssr.sendTx(tx) + // it is successful if there is no error or if it was successful first time we sent it but db update failed + isSuccessful := err == nil || errors.Is(err, errAlreadyProcessedStateSync) + + if err != nil { ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) + } - eventData.SentStatus = false + if isSuccessful { + ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) - if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { + if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) } } else { - ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) + eventData.SentStatus = false - if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { + if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) } } From f569072800a1da4d7924844a5f0269017252ac6c Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Fri, 6 Oct 2023 14:32:15 +0200 Subject: [PATCH 07/27] small change --- consensus/polybft/state_sync_relayer.go | 35 +++++++++++-------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 5886eb0a2f..78e4fe3a91 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -10,6 +10,7 @@ import ( "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" "github.com/0xPolygon/polygon-edge/contracts" + "github.com/0xPolygon/polygon-edge/helper/hex" "github.com/0xPolygon/polygon-edge/state/runtime" "github.com/0xPolygon/polygon-edge/txrelayer" "github.com/0xPolygon/polygon-edge/types" @@ -19,12 +20,12 @@ import ( ) const ( - // maxParallelTxWorkers how many transactions can be sent in parallel + // maxParallelTxWorkers specifies how many transactions can be sent in parallel maxParallelTxWorkers = 10 - // maxAttemptsToSend how many sending retries for one transaction + // maxAttemptsToSend specifies how many sending retries for one transaction maxAttemptsToSend = 6 - // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try again to send transaction - maxBlocksToWaitForResend = uint64(50) + // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try sending transaction again + maxBlocksToWaitForResend = uint64(75) ) var ( @@ -207,6 +208,8 @@ func (ssr *stateSyncRelayerImpl) processBatch() { } func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventData) error { + ssr.logger.Info("state sync relayer processing event", "eventID", eventData.EventID) + eventData.CountTries++ if eventData.CountTries > maxAttemptsToSend { @@ -239,26 +242,17 @@ func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventDa go func() { defer ssr.sem.Release(1) - err := ssr.sendTx(tx) // it is successful if there is no error or if it was successful first time we sent it but db update failed - isSuccessful := err == nil || errors.Is(err, errAlreadyProcessedStateSync) - - if err != nil { - ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) - } - - if isSuccessful { + if err := ssr.sendTx(tx, eventData.EventID); err == nil || errors.Is(err, errAlreadyProcessedStateSync) { ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) } } else { - eventData.SentStatus = false - - if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { - ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) - } + // do not update database on error (change SentStatus for example) + // event sending will be retried eventually after maxBlocksToWaitForResend blocks + ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) } }() @@ -303,7 +297,9 @@ func (ssr *stateSyncRelayerImpl) createTx(eventID uint64) (*ethgo.Transaction, e }, nil } -func (ssr *stateSyncRelayerImpl) sendTx(txn *ethgo.Transaction) error { +func (ssr *stateSyncRelayerImpl) sendTx(txn *ethgo.Transaction, eventID uint64) error { + ssr.logger.Info("state sync relayer sending event", "eventID", eventID) + receipt, err := ssr.txRelayer.SendTransaction(txn, ssr.key) if err != nil { return err @@ -325,7 +321,8 @@ func (ssr *stateSyncRelayerImpl) sendTx(txn *ethgo.Transaction) error { } if !stateSyncResult.Status { - return errFailedToExecuteStateSync + return fmt.Errorf("Error: %w, Message: %s", errFailedToExecuteStateSync, + hex.EncodeToString(stateSyncResult.Message)) } } From 6ea338bbf8a21cd0e327914216c20bc49f12a3a5 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 9 Oct 2023 12:30:42 +0200 Subject: [PATCH 08/27] remove routine(s) --- consensus/polybft/state_sync_relayer.go | 40 +++++++------------------ 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 78e4fe3a91..fdafdc5124 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -1,7 +1,6 @@ package polybft import ( - "context" "encoding/json" "errors" "fmt" @@ -10,18 +9,14 @@ import ( "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" "github.com/0xPolygon/polygon-edge/contracts" - "github.com/0xPolygon/polygon-edge/helper/hex" "github.com/0xPolygon/polygon-edge/state/runtime" "github.com/0xPolygon/polygon-edge/txrelayer" "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" "github.com/umbracle/ethgo" - "golang.org/x/sync/semaphore" ) const ( - // maxParallelTxWorkers specifies how many transactions can be sent in parallel - maxParallelTxWorkers = 10 // maxAttemptsToSend specifies how many sending retries for one transaction maxAttemptsToSend = 6 // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try sending transaction again @@ -80,7 +75,6 @@ type stateSyncRelayerImpl struct { logger hclog.Logger blockchain blockchainBackend - sem *semaphore.Weighted notifyCh chan struct{} closeCh chan struct{} } @@ -99,7 +93,6 @@ func NewStateSyncRelayer( key: key, store: store, state: state, - sem: semaphore.NewWeighted(10), closeCh: make(chan struct{}), notifyCh: make(chan struct{}, 1), blockchain: blockchain, @@ -225,36 +218,25 @@ func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventDa return fmt.Errorf("failed to create tx: %d, %w", eventData.EventID, err) } - if err := ssr.sem.Acquire(context.Background(), 1); err != nil { - // dont update state in this case! - return fmt.Errorf("failed to acquire semaphore: %d, %w", eventData.EventID, err) - } - eventData.BlockNumber = ssr.blockchain.CurrentHeader().Number eventData.SentStatus = true if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { - ssr.sem.Release(1) - return fmt.Errorf("failed to move to sent: %d, %w", eventData.EventID, err) } - go func() { - defer ssr.sem.Release(1) - - // it is successful if there is no error or if it was successful first time we sent it but db update failed - if err := ssr.sendTx(tx, eventData.EventID); err == nil || errors.Is(err, errAlreadyProcessedStateSync) { - ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) + // it is successful if there is no error or if it was successful first time we sent it but db update failed + if err := ssr.sendTx(tx, eventData.EventID); err == nil || errors.Is(err, errAlreadyProcessedStateSync) { + ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) - if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { - ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) - } - } else { - // do not update database on error (change SentStatus for example) - // event sending will be retried eventually after maxBlocksToWaitForResend blocks - ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) + if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { + ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) } - }() + } else { + // do not update database on error (change SentStatus for example) + // event sending will be retried eventually after maxBlocksToWaitForResend blocks + ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) + } return nil } @@ -322,7 +304,7 @@ func (ssr *stateSyncRelayerImpl) sendTx(txn *ethgo.Transaction, eventID uint64) if !stateSyncResult.Status { return fmt.Errorf("Error: %w, Message: %s", errFailedToExecuteStateSync, - hex.EncodeToString(stateSyncResult.Message)) + string(stateSyncResult.Message)) } } From c8deb5629423778b5b07ef28cbe22e1c1c82b44d Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 9 Oct 2023 15:12:59 +0200 Subject: [PATCH 09/27] because we need to send in order, we should retry imediatelly --- consensus/polybft/state_store_state_sync.go | 8 ++------ consensus/polybft/state_store_state_sync_test.go | 3 +-- consensus/polybft/state_sync_relayer.go | 9 +-------- consensus/polybft/state_sync_relayer_test.go | 2 +- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index ee966441a1..30735c0c5d 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -455,8 +455,7 @@ func (s *StateSyncStore) updateStateSyncRelayerEvent(evnt *StateSyncRelayerEvent } // getAllAvailableEvents retrieves all StateSyncRelayerEventData that should be sent as a transactions -func (s *StateSyncStore) getAllAvailableEvents( - staleBlockNumber uint64) (result []*StateSyncRelayerEventData, err error) { +func (s *StateSyncStore) getAllAvailableEvents() (result []*StateSyncRelayerEventData, err error) { if err = s.db.View(func(tx *bolt.Tx) error { return tx.Bucket(stateSyncRelayerEventsBucket).ForEach(func(k, v []byte) error { var event *StateSyncRelayerEventData @@ -465,10 +464,7 @@ func (s *StateSyncStore) getAllAvailableEvents( return err } - // event that is sent way long before should be resent again - if !event.SentStatus || (staleBlockNumber > 0 && event.BlockNumber <= staleBlockNumber) { - result = append(result, event) - } + result = append(result, event) return nil }) diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 51023f0d38..8343a89b6f 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -317,7 +317,6 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { []*StateSyncRelayerEventData{ {EventID: 2}, {EventID: 4}, - {EventID: 6, SentStatus: true, BlockNumber: 101}, {EventID: 7, SentStatus: true, BlockNumber: 100}, }, )) @@ -329,7 +328,7 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { assert.Equal(t, uint64(100), ssrStateData.LastBlockNumber) // get available events - events, err := state.StateSyncStore.getAllAvailableEvents(100) + events, err := state.StateSyncStore.getAllAvailableEvents() require.NoError(t, err) require.Len(t, events, 3) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index fdafdc5124..bf89209738 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -19,8 +19,6 @@ import ( const ( // maxAttemptsToSend specifies how many sending retries for one transaction maxAttemptsToSend = 6 - // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try sending transaction again - maxBlocksToWaitForResend = uint64(75) ) var ( @@ -181,12 +179,7 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { } func (ssr *stateSyncRelayerImpl) processBatch() { - staleBlockNumber := uint64(0) - if bn := ssr.blockchain.CurrentHeader().Number; bn > maxBlocksToWaitForResend { - staleBlockNumber = bn - maxBlocksToWaitForResend - } - - events, err := ssr.state.StateSyncStore.getAllAvailableEvents(staleBlockNumber) + events, err := ssr.state.StateSyncStore.getAllAvailableEvents() if err != nil { ssr.logger.Error("error while reading available events", "err", err) diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index c472a1ef06..681311c044 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -154,7 +154,7 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(3), ssrStateData.LastBlockNumber) - events, err := state.StateSyncStore.getAllAvailableEvents(0) + events, err := state.StateSyncStore.getAllAvailableEvents() require.NoError(t, err) require.Len(t, events, 0) From 0d5d68e08dfcdbfcaeefa5a8460c0c64ea3ac46f Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 10 Oct 2023 15:05:38 +0200 Subject: [PATCH 10/27] contract logs --- consensus/polybft/contractsapi/gen_sc_data.go | 14 +++++++------- state/runtime/precompiled/precompiled.go | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/consensus/polybft/contractsapi/gen_sc_data.go b/consensus/polybft/contractsapi/gen_sc_data.go index a3da7259b0..6b2c386151 100644 --- a/consensus/polybft/contractsapi/gen_sc_data.go +++ b/consensus/polybft/contractsapi/gen_sc_data.go @@ -2,22 +2,22 @@ package contractsapi var L2StateSenderArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"L2StateSender","sourceName":"contracts/child/L2StateSender.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"L2StateSynced","type":"event"},{"inputs":[],"name":"MAX_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"syncState","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea264697066735822122041815082e2111df07ce129b83f0000ecca6c4886247dffeae7090f8f048b665164736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea264697066735822122041815082e2111df07ce129b83f0000ecca6c4886247dffeae7090f8f048b665164736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var StateReceiverArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"StateReceiver","sourceName":"contracts/child/StateReceiver.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"startId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"NewCommitment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"counter","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"StateSyncResult","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync[]","name":"objs","type":"tuple[]"}],"name":"batchExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"commitment","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"bitmap","type":"bytes"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitmentCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitmentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync","name":"obj","type":"tuple"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCommitmentByStateSyncId","outputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRootByStateSyncId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCommittedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedStateSyncs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611244806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004610cd6565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004610cd6565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e5366004610d3a565b610356565b005b6101346002600160a01b0381565b61021d610208366004610cd6565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004610da9565b61041d565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004610cd6565b6105bd565b6101ea610294366004610e55565b6105de565b61013461203081565b6102b56102b0366004610cd6565b6107c2565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610885565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061036282356107c2565b80519091506103d290610376908435610ef3565b825160208401516103879190610ef3565b610392906001610f06565b83604001518787876040516020016103aa9190610f5e565b604051602081830303815290604052805190602001206109329095949392919063ffffffff16565b61040e5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b61041782610995565b50505050565b828181146104805760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b818110156105b55760006104ba8585848181106104a2576104a2610ffa565b90506020028101906104b49190611010565b356107c2565b9050600061056e82600001518787868181106104d8576104d8610ffa565b90506020028101906104ea9190611010565b6104f5919035610ef3565b835160208501516105069190610ef3565b610511906001610f06565b84604001518b8b8881811061052857610528610ffa565b905060200281019061053a9190611030565b8b8b8a81811061054c5761054c610ffa565b905060200281019061055e9190611010565b6040516020016103aa9190610f5e565b90508061057f575050600101610483565b6105ab86868581811061059457610594610ffa565b90506020028101906105a69190611010565b610995565b5050600101610483565b505050505050565b603681815481106105cd57600080fd5b600091825260209091200154905081565b336002600160a01b03146106225760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b603354610630906001610f06565b8535146106725760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156106b85760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b604080518635602080830191909152870135818301529086013560608201526106fd906080016040516020818303038152906040528051906020012085858585610bb0565b6032805486916035916000918261071383611079565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b60408051606081018252600080825260208201819052918101829052906107ea603684610885565b603654909150810361084a5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361089857506000610350565b82546000905b808210156108e55760006108b28383610cb4565b600087815260209020909150859082015411156108d1578091506108df565b6108dc816001610f06565b92505b5061089e565b60008211801561091157508361090e86610900600186610ef3565b600091825260209091200190565b54145b1561092a57610921600183610ef3565b92505050610350565b509392505050565b60008115610971578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c97506020810190508181106109425750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b803560009081526034602052604090205460ff1615610a055760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610a156060820160408301611092565b6001600160a01b03163b600003610a69576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610a979060608501908501611092565b6001600160a01b03168335610ab26040860160208701611092565b610abf60608701876110ad565b604051602401610ad294939291906110f3565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610b07919061114c565b6000604051808303816000865af19150503d8060008114610b44576040519150601f19603f3d011682016040523d82523d6000602084013e610b49565b606091505b509150915081610b6c5782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610ba3919061115e565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610bdc959493929190611191565b60408051601f1981840301815290829052610bf69161114c565b6000604051808303818686fa925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5091509150600081806020019051810190610c5291906111ca565b9050828015610c5e5750805b610caa5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610cc360028484186111ec565b610ccf90848416610f06565b9392505050565b600060208284031215610ce857600080fd5b5035919050565b60008083601f840112610d0157600080fd5b5081356001600160401b03811115610d1857600080fd5b6020830191508360208260051b8501011115610d3357600080fd5b9250929050565b600080600060408486031215610d4f57600080fd5b83356001600160401b0380821115610d6657600080fd5b610d7287838801610cef565b90955093506020860135915080821115610d8b57600080fd5b50840160808187031215610d9e57600080fd5b809150509250925092565b60008060008060408587031215610dbf57600080fd5b84356001600160401b0380821115610dd657600080fd5b610de288838901610cef565b90965094506020870135915080821115610dfb57600080fd5b50610e0887828801610cef565b95989497509550505050565b60008083601f840112610e2657600080fd5b5081356001600160401b03811115610e3d57600080fd5b602083019150836020828501011115610d3357600080fd5b600080600080600085870360a0811215610e6e57600080fd5b6060811215610e7c57600080fd5b5085945060608601356001600160401b0380821115610e9a57600080fd5b610ea689838a01610e14565b90965094506080880135915080821115610ebf57600080fd5b50610ecc88828901610e14565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350610edd565b8082018082111561035057610350610edd565b80356001600160a01b0381168114610f3057600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152813560208201526000610f7760208401610f19565b60018060a01b03808216604085015280610f9360408701610f19565b16606085015250506060830135601e19843603018112610fb257600080fd5b83016020810190356001600160401b03811115610fce57600080fd5b803603821315610fdd57600080fd5b608080850152610ff160a085018284610f35565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261102657600080fd5b9190910192915050565b6000808335601e1984360301811261104757600080fd5b8301803591506001600160401b0382111561106157600080fd5b6020019150600581901b3603821315610d3357600080fd5b60006001820161108b5761108b610edd565b5060010190565b6000602082840312156110a457600080fd5b610ccf82610f19565b6000808335601e198436030181126110c457600080fd5b8301803591506001600160401b038211156110de57600080fd5b602001915036819003821315610d3357600080fd5b8481526001600160a01b038416602082015260606040820181905260009061111e9083018486610f35565b9695505050505050565b60005b8381101561114357818101518382015260200161112b565b50506000910152565b60008251611026818460208701611128565b602081526000825180602084015261117d816040850160208701611128565b601f01601f19169190910160400192915050565b8581526060602082015260006111ab606083018688610f35565b82810360408401526111be818587610f35565b98975050505050505050565b6000602082840312156111dc57600080fd5b81518015158114610ccf57600080fd5b60008261120957634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212205e465487d9414dfe77390f61a0c38958de52ee524ceeb4baa7548b12c5998a1564736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004610cd6565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004610cd6565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e5366004610d3a565b610356565b005b6101346002600160a01b0381565b61021d610208366004610cd6565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004610da9565b61041d565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004610cd6565b6105bd565b6101ea610294366004610e55565b6105de565b61013461203081565b6102b56102b0366004610cd6565b6107c2565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610885565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061036282356107c2565b80519091506103d290610376908435610ef3565b825160208401516103879190610ef3565b610392906001610f06565b83604001518787876040516020016103aa9190610f5e565b604051602081830303815290604052805190602001206109329095949392919063ffffffff16565b61040e5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b61041782610995565b50505050565b828181146104805760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b818110156105b55760006104ba8585848181106104a2576104a2610ffa565b90506020028101906104b49190611010565b356107c2565b9050600061056e82600001518787868181106104d8576104d8610ffa565b90506020028101906104ea9190611010565b6104f5919035610ef3565b835160208501516105069190610ef3565b610511906001610f06565b84604001518b8b8881811061052857610528610ffa565b905060200281019061053a9190611030565b8b8b8a81811061054c5761054c610ffa565b905060200281019061055e9190611010565b6040516020016103aa9190610f5e565b90508061057f575050600101610483565b6105ab86868581811061059457610594610ffa565b90506020028101906105a69190611010565b610995565b5050600101610483565b505050505050565b603681815481106105cd57600080fd5b600091825260209091200154905081565b336002600160a01b03146106225760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b603354610630906001610f06565b8535146106725760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156106b85760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b604080518635602080830191909152870135818301529086013560608201526106fd906080016040516020818303038152906040528051906020012085858585610bb0565b6032805486916035916000918261071383611079565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b60408051606081018252600080825260208201819052918101829052906107ea603684610885565b603654909150810361084a5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361089857506000610350565b82546000905b808210156108e55760006108b28383610cb4565b600087815260209020909150859082015411156108d1578091506108df565b6108dc816001610f06565b92505b5061089e565b60008211801561091157508361090e86610900600186610ef3565b600091825260209091200190565b54145b1561092a57610921600183610ef3565b92505050610350565b509392505050565b60008115610971578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c97506020810190508181106109425750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b803560009081526034602052604090205460ff1615610a055760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610a156060820160408301611092565b6001600160a01b03163b600003610a69576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610a979060608501908501611092565b6001600160a01b03168335610ab26040860160208701611092565b610abf60608701876110ad565b604051602401610ad294939291906110f3565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610b07919061114c565b6000604051808303816000865af19150503d8060008114610b44576040519150601f19603f3d011682016040523d82523d6000602084013e610b49565b606091505b509150915081610b6c5782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610ba3919061115e565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610bdc959493929190611191565b60408051601f1981840301815290829052610bf69161114c565b6000604051808303818686fa925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5091509150600081806020019051810190610c5291906111ca565b9050828015610c5e5750805b610caa5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610cc360028484186111ec565b610ccf90848416610f06565b9392505050565b600060208284031215610ce857600080fd5b5035919050565b60008083601f840112610d0157600080fd5b5081356001600160401b03811115610d1857600080fd5b6020830191508360208260051b8501011115610d3357600080fd5b9250929050565b600080600060408486031215610d4f57600080fd5b83356001600160401b0380821115610d6657600080fd5b610d7287838801610cef565b90955093506020860135915080821115610d8b57600080fd5b50840160808187031215610d9e57600080fd5b809150509250925092565b60008060008060408587031215610dbf57600080fd5b84356001600160401b0380821115610dd657600080fd5b610de288838901610cef565b90965094506020870135915080821115610dfb57600080fd5b50610e0887828801610cef565b95989497509550505050565b60008083601f840112610e2657600080fd5b5081356001600160401b03811115610e3d57600080fd5b602083019150836020828501011115610d3357600080fd5b600080600080600085870360a0811215610e6e57600080fd5b6060811215610e7c57600080fd5b5085945060608601356001600160401b0380821115610e9a57600080fd5b610ea689838a01610e14565b90965094506080880135915080821115610ebf57600080fd5b50610ecc88828901610e14565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350610edd565b8082018082111561035057610350610edd565b80356001600160a01b0381168114610f3057600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152813560208201526000610f7760208401610f19565b60018060a01b03808216604085015280610f9360408701610f19565b16606085015250506060830135601e19843603018112610fb257600080fd5b83016020810190356001600160401b03811115610fce57600080fd5b803603821315610fdd57600080fd5b608080850152610ff160a085018284610f35565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261102657600080fd5b9190910192915050565b6000808335601e1984360301811261104757600080fd5b8301803591506001600160401b0382111561106157600080fd5b6020019150600581901b3603821315610d3357600080fd5b60006001820161108b5761108b610edd565b5060010190565b6000602082840312156110a457600080fd5b610ccf82610f19565b6000808335601e198436030181126110c457600080fd5b8301803591506001600160401b038211156110de57600080fd5b602001915036819003821315610d3357600080fd5b8481526001600160a01b038416602082015260606040820181905260009061111e9083018486610f35565b9695505050505050565b60005b8381101561114357818101518382015260200161112b565b50506000910152565b60008251611026818460208701611128565b602081526000825180602084015261117d816040850160208701611128565b601f01601f19169190910160400192915050565b8581526060602082015260006111ab606083018688610f35565b82810360408401526111be818587610f35565b98975050505050505050565b6000602082840312156111dc57600080fd5b81518015158114610ccf57600080fd5b60008261120957634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212205e465487d9414dfe77390f61a0c38958de52ee524ceeb4baa7548b12c5998a1564736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var StateReceiverArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"StateReceiver","sourceName":"contracts/child/StateReceiver.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"startId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"NewCommitment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"counter","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"StateSyncResult","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync[]","name":"objs","type":"tuple[]"}],"name":"batchExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"commitment","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"bitmap","type":"bytes"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitmentCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitmentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync","name":"obj","type":"tuple"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCommitmentByStateSyncId","outputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRootByStateSyncId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCommittedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedStateSyncs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506115d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004611041565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004611041565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e53660046110a5565b610356565b005b6101346002600160a01b0381565b61021d610208366004611041565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004611114565b6104be565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004611041565b61065e565b6101ea6102943660046111c0565b61067f565b61013461203081565b6102b56102b0366004611041565b610863565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610926565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b6103866040518060400160405280600f81526020016e53746174655265636569766572203160881b8152506109d3565b6103986103938235610a19565b6109d3565b60006103a48235610863565b90506103d66040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101960891b8152506109d3565b8051610443906103e790843561125e565b825160208401516103f8919061125e565b610403906001611271565b836040015187878760405160200161041b91906112c9565b60405160208183030381529060405280519060200120610aab9095949392919063ffffffff16565b61047f5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b6104af6040518060400160405280600f81526020016e53746174655265636569766572203360881b8152506109d3565b6104b882610b0e565b50505050565b828181146105215760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b8181101561065657600061055b85858481811061054357610543611365565b9050602002810190610555919061137b565b35610863565b9050600061060f826000015187878681811061057957610579611365565b905060200281019061058b919061137b565b61059691903561125e565b835160208501516105a7919061125e565b6105b2906001611271565b84604001518b8b888181106105c9576105c9611365565b90506020028101906105db919061139b565b8b8b8a8181106105ed576105ed611365565b90506020028101906105ff919061137b565b60405160200161041b91906112c9565b905080610620575050600101610524565b61064c86868581811061063557610635611365565b9050602002810190610647919061137b565b610b0e565b5050600101610524565b505050505050565b6036818154811061066e57600080fd5b600091825260209091200154905081565b336002600160a01b03146106c35760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b6033546106d1906001611271565b8535146107135760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156107595760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b6040805186356020808301919091528701358183015290860135606082015261079e906080016040516020818303038152906040528051906020012085858585610e19565b603280548691603591600091826107b4836113e4565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b604080516060810182526000808252602082018190529181018290529061088b603684610926565b60365490915081036108eb5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361093957506000610350565b82546000905b808210156109865760006109538383610f1d565b6000878152602090209091508590820154111561097257809150610980565b61097d816001611271565b92505b5061093f565b6000821180156109b25750836109af866109a160018661125e565b600091825260209091200190565b54145b156109cb576109c260018361125e565b92505050610350565b509392505050565b610a16816040516024016109e7919061144d565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610f3f565b50565b60606000610a2683610f48565b60010190506000816001600160401b03811115610a4557610a45611460565b6040519080825280601f01601f191660200182016040528015610a6f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610a7957509392505050565b60008115610aea578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c9750602081019050818110610abb5750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b610b3e6040518060400160405280600f81526020016e14dd185d19549958d95a5d995c880d608a1b8152506109d3565b803560009081526034602052604090205460ff1615610bae5760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610bde6040518060400160405280600f81526020016e53746174655265636569766572203560881b8152506109d3565b610bee6060820160408301611476565b6001600160a01b03163b600003610c7257610c2f6040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101b60891b8152506109d3565b6040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020908152604091829020805460ff191660011790558151808301909252600f82526e53746174655265636569766572203760881b90820152610cbd906109d3565b600080610cd06060840160408501611476565b6001600160a01b03168335610ceb6040860160208701611476565b610cf86060870187611491565b604051602401610d0b94939291906114d7565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610d40919061150c565b6000604051808303816000865af19150503d8060008114610d7d576040519150601f19603f3d011682016040523d82523d6000602084013e610d82565b606091505b5091509150610db76040518060400160405280600f81526020016e0a6e8c2e8caa4cac6cad2eccae4407608b1b8152506109d3565b81610dd55782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610e0c919061144d565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610e4595949392919061151e565b60408051601f1981840301815290829052610e5f9161150c565b6000604051808303818686fa925050503d8060008114610e9b576040519150601f19603f3d011682016040523d82523d6000602084013e610ea0565b606091505b5091509150600081806020019051810190610ebb9190611557565b9050828015610ec75750805b610f135760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610f2c6002848418611579565b610f3890848416611271565b9392505050565b610a1681611020565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610f875772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610fb3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610fd157662386f26fc10000830492506010015b6305f5e1008310610fe9576305f5e100830492506008015b6127108310610ffd57612710830492506004015b6064831061100f576064830492506002015b600a83106103505760010192915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b60006020828403121561105357600080fd5b5035919050565b60008083601f84011261106c57600080fd5b5081356001600160401b0381111561108357600080fd5b6020830191508360208260051b850101111561109e57600080fd5b9250929050565b6000806000604084860312156110ba57600080fd5b83356001600160401b03808211156110d157600080fd5b6110dd8783880161105a565b909550935060208601359150808211156110f657600080fd5b5084016080818703121561110957600080fd5b809150509250925092565b6000806000806040858703121561112a57600080fd5b84356001600160401b038082111561114157600080fd5b61114d8883890161105a565b9096509450602087013591508082111561116657600080fd5b506111738782880161105a565b95989497509550505050565b60008083601f84011261119157600080fd5b5081356001600160401b038111156111a857600080fd5b60208301915083602082850101111561109e57600080fd5b600080600080600085870360a08112156111d957600080fd5b60608112156111e757600080fd5b5085945060608601356001600160401b038082111561120557600080fd5b61121189838a0161117f565b9096509450608088013591508082111561122a57600080fd5b506112378882890161117f565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350611248565b8082018082111561035057610350611248565b80356001600160a01b038116811461129b57600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081528135602082015260006112e260208401611284565b60018060a01b038082166040850152806112fe60408701611284565b16606085015250506060830135601e1984360301811261131d57600080fd5b83016020810190356001600160401b0381111561133957600080fd5b80360382131561134857600080fd5b60808085015261135c60a0850182846112a0565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261139157600080fd5b9190910192915050565b6000808335601e198436030181126113b257600080fd5b8301803591506001600160401b038211156113cc57600080fd5b6020019150600581901b360382131561109e57600080fd5b6000600182016113f6576113f6611248565b5060010190565b60005b83811015611418578181015183820152602001611400565b50506000910152565b600081518084526114398160208601602086016113fd565b601f01601f19169290920160200192915050565b602081526000610f386020830184611421565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561148857600080fd5b610f3882611284565b6000808335601e198436030181126114a857600080fd5b8301803591506001600160401b038211156114c257600080fd5b60200191503681900382131561109e57600080fd5b8481526001600160a01b038416602082015260606040820181905260009061150290830184866112a0565b9695505050505050565b600082516113918184602087016113fd565b8581526060602082015260006115386060830186886112a0565b828103604084015261154b8185876112a0565b98975050505050505050565b60006020828403121561156957600080fd5b81518015158114610f3857600080fd5b60008261159657634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220329a2dd999c566ec5693f89063a2812ecb671fa2dcb49d33f239384bbf1ab6da64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004611041565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004611041565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e53660046110a5565b610356565b005b6101346002600160a01b0381565b61021d610208366004611041565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004611114565b6104be565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004611041565b61065e565b6101ea6102943660046111c0565b61067f565b61013461203081565b6102b56102b0366004611041565b610863565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610926565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b6103866040518060400160405280600f81526020016e53746174655265636569766572203160881b8152506109d3565b6103986103938235610a19565b6109d3565b60006103a48235610863565b90506103d66040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101960891b8152506109d3565b8051610443906103e790843561125e565b825160208401516103f8919061125e565b610403906001611271565b836040015187878760405160200161041b91906112c9565b60405160208183030381529060405280519060200120610aab9095949392919063ffffffff16565b61047f5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b6104af6040518060400160405280600f81526020016e53746174655265636569766572203360881b8152506109d3565b6104b882610b0e565b50505050565b828181146105215760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b8181101561065657600061055b85858481811061054357610543611365565b9050602002810190610555919061137b565b35610863565b9050600061060f826000015187878681811061057957610579611365565b905060200281019061058b919061137b565b61059691903561125e565b835160208501516105a7919061125e565b6105b2906001611271565b84604001518b8b888181106105c9576105c9611365565b90506020028101906105db919061139b565b8b8b8a8181106105ed576105ed611365565b90506020028101906105ff919061137b565b60405160200161041b91906112c9565b905080610620575050600101610524565b61064c86868581811061063557610635611365565b9050602002810190610647919061137b565b610b0e565b5050600101610524565b505050505050565b6036818154811061066e57600080fd5b600091825260209091200154905081565b336002600160a01b03146106c35760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b6033546106d1906001611271565b8535146107135760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156107595760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b6040805186356020808301919091528701358183015290860135606082015261079e906080016040516020818303038152906040528051906020012085858585610e19565b603280548691603591600091826107b4836113e4565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b604080516060810182526000808252602082018190529181018290529061088b603684610926565b60365490915081036108eb5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361093957506000610350565b82546000905b808210156109865760006109538383610f1d565b6000878152602090209091508590820154111561097257809150610980565b61097d816001611271565b92505b5061093f565b6000821180156109b25750836109af866109a160018661125e565b600091825260209091200190565b54145b156109cb576109c260018361125e565b92505050610350565b509392505050565b610a16816040516024016109e7919061144d565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610f3f565b50565b60606000610a2683610f48565b60010190506000816001600160401b03811115610a4557610a45611460565b6040519080825280601f01601f191660200182016040528015610a6f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610a7957509392505050565b60008115610aea578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c9750602081019050818110610abb5750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b610b3e6040518060400160405280600f81526020016e14dd185d19549958d95a5d995c880d608a1b8152506109d3565b803560009081526034602052604090205460ff1615610bae5760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610bde6040518060400160405280600f81526020016e53746174655265636569766572203560881b8152506109d3565b610bee6060820160408301611476565b6001600160a01b03163b600003610c7257610c2f6040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101b60891b8152506109d3565b6040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020908152604091829020805460ff191660011790558151808301909252600f82526e53746174655265636569766572203760881b90820152610cbd906109d3565b600080610cd06060840160408501611476565b6001600160a01b03168335610ceb6040860160208701611476565b610cf86060870187611491565b604051602401610d0b94939291906114d7565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610d40919061150c565b6000604051808303816000865af19150503d8060008114610d7d576040519150601f19603f3d011682016040523d82523d6000602084013e610d82565b606091505b5091509150610db76040518060400160405280600f81526020016e0a6e8c2e8caa4cac6cad2eccae4407608b1b8152506109d3565b81610dd55782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610e0c919061144d565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610e4595949392919061151e565b60408051601f1981840301815290829052610e5f9161150c565b6000604051808303818686fa925050503d8060008114610e9b576040519150601f19603f3d011682016040523d82523d6000602084013e610ea0565b606091505b5091509150600081806020019051810190610ebb9190611557565b9050828015610ec75750805b610f135760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610f2c6002848418611579565b610f3890848416611271565b9392505050565b610a1681611020565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610f875772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610fb3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610fd157662386f26fc10000830492506010015b6305f5e1008310610fe9576305f5e100830492506008015b6127108310610ffd57612710830492506004015b6064831061100f576064830492506002015b600a83106103505760010192915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b60006020828403121561105357600080fd5b5035919050565b60008083601f84011261106c57600080fd5b5081356001600160401b0381111561108357600080fd5b6020830191508360208260051b850101111561109e57600080fd5b9250929050565b6000806000604084860312156110ba57600080fd5b83356001600160401b03808211156110d157600080fd5b6110dd8783880161105a565b909550935060208601359150808211156110f657600080fd5b5084016080818703121561110957600080fd5b809150509250925092565b6000806000806040858703121561112a57600080fd5b84356001600160401b038082111561114157600080fd5b61114d8883890161105a565b9096509450602087013591508082111561116657600080fd5b506111738782880161105a565b95989497509550505050565b60008083601f84011261119157600080fd5b5081356001600160401b038111156111a857600080fd5b60208301915083602082850101111561109e57600080fd5b600080600080600085870360a08112156111d957600080fd5b60608112156111e757600080fd5b5085945060608601356001600160401b038082111561120557600080fd5b61121189838a0161117f565b9096509450608088013591508082111561122a57600080fd5b506112378882890161117f565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350611248565b8082018082111561035057610350611248565b80356001600160a01b038116811461129b57600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081528135602082015260006112e260208401611284565b60018060a01b038082166040850152806112fe60408701611284565b16606085015250506060830135601e1984360301811261131d57600080fd5b83016020810190356001600160401b0381111561133957600080fd5b80360382131561134857600080fd5b60808085015261135c60a0850182846112a0565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261139157600080fd5b9190910192915050565b6000808335601e198436030181126113b257600080fd5b8301803591506001600160401b038211156113cc57600080fd5b6020019150600581901b360382131561109e57600080fd5b6000600182016113f6576113f6611248565b5060010190565b60005b83811015611418578181015183820152602001611400565b50506000910152565b600081518084526114398160208601602086016113fd565b601f01601f19169290920160200192915050565b602081526000610f386020830184611421565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561148857600080fd5b610f3882611284565b6000808335601e198436030181126114a857600080fd5b8301803591506001600160401b038211156114c257600080fd5b60200191503681900382131561109e57600080fd5b8481526001600160a01b038416602082015260606040820181905260009061150290830184866112a0565b9695505050505050565b600082516113918184602087016113fd565b8581526060602082015260006115386060830186886112a0565b828103604084015261154b8185876112a0565b98975050505050505050565b60006020828403121561156957600080fd5b81518015158114610f3857600080fd5b60008261159657634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220329a2dd999c566ec5693f89063a2812ecb671fa2dcb49d33f239384bbf1ab6da64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var NativeERC20Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"NativeERC20","sourceName":"contracts/child/NativeERC20.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"predicate_","type":"address"},{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"tokenSupply_","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061121c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101635760003560e01c806355b01e4d116100ce57806397e5230d1161008757806397e5230d146102b85780639dc29fac146102c2578063a457c2d7146102d5578063a9059cbb146102e8578063dd62ed3e146102fb578063e0563ab11461030e578063e61987051461031757600080fd5b806355b01e4d146102605780635ea5df791461026e57806370a0823114610277578063740b08dc14610292578063947287cf146102a757806395d89b41146102b057600080fd5b8063284017f511610120578063284017f514610205578063313ce5671461020e57806339509351146102235780633b878c221461023657806340c10f191461023f57806351351d531461025257600080fd5b806306fdde031461016857806307b3e25214610186578063095ea7b3146101ac57806318160ddd146101cf5780631f2d0065146101e157806323b872dd146101f2575b600080fd5b610170610328565b60405161017d9190610d4d565b60405180910390f35b6101946004600360981b0181565b6040516001600160a01b03909116815260200161017d565b6101bf6101ba366004610d9c565b6103ba565b604051901515815260200161017d565b6034545b60405190815260200161017d565b6036546001600160a01b0316610194565b6101bf610200366004610dc6565b6103d4565b61019461202081565b60395460405160ff909116815260200161017d565b6101bf610231366004610d9c565b6103f8565b61019461101081565b6101bf61024d366004610d9c565b61041a565b6101946002600160a01b0381565b6101946004600160991b0181565b6101d361138881565b6101d3610285366004610e02565b6001600160a01b03163190565b6102a56102a0366004610e6d565b610463565b005b6101d361520881565b610170610618565b6101d3620249f081565b6101bf6102d0366004610d9c565b610627565b6101bf6102e3366004610d9c565b61065e565b6101bf6102f6366004610d9c565b6106d9565b6101d3610309366004610f21565b6106e7565b61019461203081565b6035546001600160a01b0316610194565b60606037805461033790610f54565b80601f016020809104026020016040519081016040528092919081815260200182805461036390610f54565b80156103b05780601f10610385576101008083540402835291602001916103b0565b820191906000526020600020905b81548152906001019060200180831161039357829003601f168201915b5050505050905090565b6000336103c8818585610712565b60019150505b92915050565b6000336103e2858285610836565b6103ed8585856108b0565b506001949350505050565b6000336103c881858561040b83836106e7565b6104159190610fa4565b610712565b6035546000906001600160a01b031633146104505760405162461bcd60e51b815260040161044790610fb7565b60405180910390fd5b61045a8383610a75565b50600192915050565b600054610100900460ff16158080156104835750600054600160ff909116105b8061049d5750303b15801561049d575060005460ff166001145b6105005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610447565b6000805460ff191660011790558015610523576000805461ff0019166101001790555b336002600160a01b03146105675760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610447565b603580546001600160a01b03808c166001600160a01b03199283161790925560368054928b169290911691909117905560376105a4878983611060565b5060386105b2858783611060565b506039805460ff191660ff85161790556034829055801561060d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b60606038805461033790610f54565b6035546000906001600160a01b031633146106545760405162461bcd60e51b815260040161044790610fb7565b61045a8383610bcf565b6000338161066c82866106e7565b9050838110156106cc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610447565b6103ed8286868403610712565b6000336103c88185856108b0565b6001600160a01b03918216600090815260336020908152604080832093909416825291909152205490565b6001600160a01b0383166107745760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610447565b6001600160a01b0382166107d55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610447565b6001600160a01b0383811660008181526033602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061084284846106e7565b905060001981146108aa578181101561089d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610447565b6108aa8484848403610712565b50505050565b6001600160a01b0383166109145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610447565b6001600160a01b0382166109765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610447565b6000806120206001600160a01b031685858560405160200161099a93929190611121565b60408051601f19818403018152908290526109b491611145565b6000604051808303816000865af19150503d80600081146109f1576040519150601f19603f3d011682016040523d82523d6000602084013e6109f6565b606091505b5091509150818015610a17575080806020019051810190610a179190611161565b610a335760405162461bcd60e51b815260040161044790611183565b836001600160a01b0316856001600160a01b03166000805160206111c783398151915285604051610a6691815260200190565b60405180910390a35050505050565b6001600160a01b038216610acb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610447565b8060346000828254610add9190610fa4565b9091555050604051600090819061202090610b0090839087908790602001611121565b60408051601f1981840301815290829052610b1a91611145565b6000604051808303816000865af19150503d8060008114610b57576040519150601f19603f3d011682016040523d82523d6000602084013e610b5c565b606091505b5091509150818015610b7d575080806020019051810190610b7d9190611161565b610b995760405162461bcd60e51b815260040161044790611183565b6040518381526001600160a01b038516906000906000805160206111c7833981519152906020015b60405180910390a350505050565b6001600160a01b038216610c2f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610447565b8060346000828254610c4191906111b3565b9091555050604051600090819061202090610c6490869084908790602001611121565b60408051601f1981840301815290829052610c7e91611145565b6000604051808303816000865af19150503d8060008114610cbb576040519150601f19603f3d011682016040523d82523d6000602084013e610cc0565b606091505b5091509150818015610ce1575080806020019051810190610ce19190611161565b610cfd5760405162461bcd60e51b815260040161044790611183565b6040518381526000906001600160a01b038616906000805160206111c783398151915290602001610bc1565b60005b83811015610d44578181015183820152602001610d2c565b50506000910152565b6020815260008251806020840152610d6c816040850160208701610d29565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610d9757600080fd5b919050565b60008060408385031215610daf57600080fd5b610db883610d80565b946020939093013593505050565b600080600060608486031215610ddb57600080fd5b610de484610d80565b9250610df260208501610d80565b9150604084013590509250925092565b600060208284031215610e1457600080fd5b610e1d82610d80565b9392505050565b60008083601f840112610e3657600080fd5b50813567ffffffffffffffff811115610e4e57600080fd5b602083019150836020828501011115610e6657600080fd5b9250929050565b60008060008060008060008060c0898b031215610e8957600080fd5b610e9289610d80565b9750610ea060208a01610d80565b9650604089013567ffffffffffffffff80821115610ebd57600080fd5b610ec98c838d01610e24565b909850965060608b0135915080821115610ee257600080fd5b50610eef8b828c01610e24565b909550935050608089013560ff81168114610f0957600080fd5b8092505060a089013590509295985092959890939650565b60008060408385031215610f3457600080fd5b610f3d83610d80565b9150610f4b60208401610d80565b90509250929050565b600181811c90821680610f6857607f821691505b602082108103610f8857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103ce576103ce610f8e565b60208082526024908201527f4e617469766545524332303a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561105b57600081815260208120601f850160051c810160208610156110385750805b601f850160051c820191505b8181101561105757828155600101611044565b5050505b505050565b67ffffffffffffffff83111561107857611078610ffb565b61108c836110868354610f54565b83611011565b6000601f8411600181146110c057600085156110a85750838201355b600019600387901b1c1916600186901b17835561111a565b600083815260209020601f19861690835b828110156110f157868501358255602094850194600190920191016110d1565b508682101561110e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611157818460208701610d29565b9190910192915050565b60006020828403121561117357600080fd5b81518015158114610e1d57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b818103818111156103ce576103ce610f8e56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203e253e3b3f3175f58563f905e4d35905dc8b894d96a80a43930b6a730edd9a2a64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101635760003560e01c806355b01e4d116100ce57806397e5230d1161008757806397e5230d146102b85780639dc29fac146102c2578063a457c2d7146102d5578063a9059cbb146102e8578063dd62ed3e146102fb578063e0563ab11461030e578063e61987051461031757600080fd5b806355b01e4d146102605780635ea5df791461026e57806370a0823114610277578063740b08dc14610292578063947287cf146102a757806395d89b41146102b057600080fd5b8063284017f511610120578063284017f514610205578063313ce5671461020e57806339509351146102235780633b878c221461023657806340c10f191461023f57806351351d531461025257600080fd5b806306fdde031461016857806307b3e25214610186578063095ea7b3146101ac57806318160ddd146101cf5780631f2d0065146101e157806323b872dd146101f2575b600080fd5b610170610328565b60405161017d9190610d4d565b60405180910390f35b6101946004600360981b0181565b6040516001600160a01b03909116815260200161017d565b6101bf6101ba366004610d9c565b6103ba565b604051901515815260200161017d565b6034545b60405190815260200161017d565b6036546001600160a01b0316610194565b6101bf610200366004610dc6565b6103d4565b61019461202081565b60395460405160ff909116815260200161017d565b6101bf610231366004610d9c565b6103f8565b61019461101081565b6101bf61024d366004610d9c565b61041a565b6101946002600160a01b0381565b6101946004600160991b0181565b6101d361138881565b6101d3610285366004610e02565b6001600160a01b03163190565b6102a56102a0366004610e6d565b610463565b005b6101d361520881565b610170610618565b6101d3620249f081565b6101bf6102d0366004610d9c565b610627565b6101bf6102e3366004610d9c565b61065e565b6101bf6102f6366004610d9c565b6106d9565b6101d3610309366004610f21565b6106e7565b61019461203081565b6035546001600160a01b0316610194565b60606037805461033790610f54565b80601f016020809104026020016040519081016040528092919081815260200182805461036390610f54565b80156103b05780601f10610385576101008083540402835291602001916103b0565b820191906000526020600020905b81548152906001019060200180831161039357829003601f168201915b5050505050905090565b6000336103c8818585610712565b60019150505b92915050565b6000336103e2858285610836565b6103ed8585856108b0565b506001949350505050565b6000336103c881858561040b83836106e7565b6104159190610fa4565b610712565b6035546000906001600160a01b031633146104505760405162461bcd60e51b815260040161044790610fb7565b60405180910390fd5b61045a8383610a75565b50600192915050565b600054610100900460ff16158080156104835750600054600160ff909116105b8061049d5750303b15801561049d575060005460ff166001145b6105005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610447565b6000805460ff191660011790558015610523576000805461ff0019166101001790555b336002600160a01b03146105675760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610447565b603580546001600160a01b03808c166001600160a01b03199283161790925560368054928b169290911691909117905560376105a4878983611060565b5060386105b2858783611060565b506039805460ff191660ff85161790556034829055801561060d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b60606038805461033790610f54565b6035546000906001600160a01b031633146106545760405162461bcd60e51b815260040161044790610fb7565b61045a8383610bcf565b6000338161066c82866106e7565b9050838110156106cc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610447565b6103ed8286868403610712565b6000336103c88185856108b0565b6001600160a01b03918216600090815260336020908152604080832093909416825291909152205490565b6001600160a01b0383166107745760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610447565b6001600160a01b0382166107d55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610447565b6001600160a01b0383811660008181526033602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061084284846106e7565b905060001981146108aa578181101561089d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610447565b6108aa8484848403610712565b50505050565b6001600160a01b0383166109145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610447565b6001600160a01b0382166109765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610447565b6000806120206001600160a01b031685858560405160200161099a93929190611121565b60408051601f19818403018152908290526109b491611145565b6000604051808303816000865af19150503d80600081146109f1576040519150601f19603f3d011682016040523d82523d6000602084013e6109f6565b606091505b5091509150818015610a17575080806020019051810190610a179190611161565b610a335760405162461bcd60e51b815260040161044790611183565b836001600160a01b0316856001600160a01b03166000805160206111c783398151915285604051610a6691815260200190565b60405180910390a35050505050565b6001600160a01b038216610acb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610447565b8060346000828254610add9190610fa4565b9091555050604051600090819061202090610b0090839087908790602001611121565b60408051601f1981840301815290829052610b1a91611145565b6000604051808303816000865af19150503d8060008114610b57576040519150601f19603f3d011682016040523d82523d6000602084013e610b5c565b606091505b5091509150818015610b7d575080806020019051810190610b7d9190611161565b610b995760405162461bcd60e51b815260040161044790611183565b6040518381526001600160a01b038516906000906000805160206111c7833981519152906020015b60405180910390a350505050565b6001600160a01b038216610c2f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610447565b8060346000828254610c4191906111b3565b9091555050604051600090819061202090610c6490869084908790602001611121565b60408051601f1981840301815290829052610c7e91611145565b6000604051808303816000865af19150503d8060008114610cbb576040519150601f19603f3d011682016040523d82523d6000602084013e610cc0565b606091505b5091509150818015610ce1575080806020019051810190610ce19190611161565b610cfd5760405162461bcd60e51b815260040161044790611183565b6040518381526000906001600160a01b038616906000805160206111c783398151915290602001610bc1565b60005b83811015610d44578181015183820152602001610d2c565b50506000910152565b6020815260008251806020840152610d6c816040850160208701610d29565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610d9757600080fd5b919050565b60008060408385031215610daf57600080fd5b610db883610d80565b946020939093013593505050565b600080600060608486031215610ddb57600080fd5b610de484610d80565b9250610df260208501610d80565b9150604084013590509250925092565b600060208284031215610e1457600080fd5b610e1d82610d80565b9392505050565b60008083601f840112610e3657600080fd5b50813567ffffffffffffffff811115610e4e57600080fd5b602083019150836020828501011115610e6657600080fd5b9250929050565b60008060008060008060008060c0898b031215610e8957600080fd5b610e9289610d80565b9750610ea060208a01610d80565b9650604089013567ffffffffffffffff80821115610ebd57600080fd5b610ec98c838d01610e24565b909850965060608b0135915080821115610ee257600080fd5b50610eef8b828c01610e24565b909550935050608089013560ff81168114610f0957600080fd5b8092505060a089013590509295985092959890939650565b60008060408385031215610f3457600080fd5b610f3d83610d80565b9150610f4b60208401610d80565b90509250929050565b600181811c90821680610f6857607f821691505b602082108103610f8857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103ce576103ce610f8e565b60208082526024908201527f4e617469766545524332303a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561105b57600081815260208120601f850160051c810160208610156110385750805b601f850160051c820191505b8181101561105757828155600101611044565b5050505b505050565b67ffffffffffffffff83111561107857611078610ffb565b61108c836110868354610f54565b83611011565b6000601f8411600181146110c057600085156110a85750838201355b600019600387901b1c1916600186901b17835561111a565b600083815260209020601f19861690835b828110156110f157868501358255602094850194600190920191016110d1565b508682101561110e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611157818460208701610d29565b9190910192915050565b60006020828403121561117357600080fd5b81518015158114610e1d57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b818103818111156103ce576103ce610f8e56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203e253e3b3f3175f58563f905e4d35905dc8b894d96a80a43930b6a730edd9a2a64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var NativeERC20MintableArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"NativeERC20Mintable","sourceName":"contracts/child/NativeERC20Mintable.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"predicate_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"tokenSupply_","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061001a3361001f565b61008d565b603480546001600160a01b03191690556100388161003b565b50565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61150a8061009c6000396000f3fe608060405234801561001057600080fd5b506004361061019a5760003560e01c806370a08231116100e45780639dc29fac116100925780639dc29fac1461031a578063a457c2d71461032d578063a9059cbb14610340578063dd62ed3e14610353578063e0563ab114610366578063e30c39781461036f578063e619870514610380578063f2fde38b1461039157600080fd5b806370a08231146102c3578063715018a6146102de57806379ba5097146102e65780638da5cb5b146102ee578063947287cf146102ff57806395d89b411461030857806397e5230d1461031057600080fd5b8063313ce5671161014c578063313ce56714610245578063395093511461025a5780633b878c221461026d57806340c10f191461027657806351351d531461028957806355b01e4d146102975780635ea5df79146102a55780636091636b146102ae57600080fd5b806306fdde031461019f57806307b3e252146101bd578063095ea7b3146101e357806318160ddd146102065780631f2d00651461021857806323b872dd14610229578063284017f51461023c575b600080fd5b6101a76103a4565b6040516101b49190611022565b60405180910390f35b6101cb6004600360981b0181565b6040516001600160a01b0390911681526020016101b4565b6101f66101f1366004611071565b610436565b60405190151581526020016101b4565b6036545b6040519081526020016101b4565b6038546001600160a01b03166101cb565b6101f661023736600461109b565b610450565b6101cb61202081565b603b5460405160ff90911681526020016101b4565b6101f6610268366004611071565b610474565b6101cb61101081565b6101f6610284366004611071565b610496565b6101cb6002600160a01b0381565b6101cb6004600160991b0181565b61020a61138881565b6102c16102bc366004611120565b6104f4565b005b61020a6102d13660046111e4565b6001600160a01b03163190565b6102c1610714565b6102c1610728565b6033546001600160a01b03166101cb565b61020a61520881565b6101a76107a2565b61020a620249f081565b6101f6610328366004611071565b6107b1565b6101f661033b366004611071565b6107fd565b6101f661034e366004611071565b610878565b61020a610361366004611206565b610886565b6101cb61203081565b6034546001600160a01b03166101cb565b6037546001600160a01b03166101cb565b6102c161039f3660046111e4565b6108b1565b6060603980546103b390611239565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90611239565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600033610444818585610922565b60019150505b92915050565b60003361045e858285610a46565b610469858585610ac0565b506001949350505050565b6000336104448185856104878383610886565b6104919190611289565b610922565b6037546000906001600160a01b03163314806104bc57506033546001600160a01b031633145b6104e15760405162461bcd60e51b81526004016104d89061129c565b60405180910390fd5b6104eb8383610c85565b50600192915050565b600054610100900460ff16158080156105145750600054600160ff909116105b8061052e5750303b15801561052e575060005460ff166001145b6105915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104d8565b6000805460ff1916600117905580156105b4576000805461ff0019166101001790555b336002600160a01b03146105f85760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016104d8565b6001600160a01b0389166106595760405162461bcd60e51b815260206004820152602260248201527f4e617469766545524332303a20496e76616c6964206f776e6572206164647265604482015261737360f01b60648201526084016104d8565b603780546001600160a01b03808d166001600160a01b03199283161790925560388054928b1692909116919091179055603961069687898361134e565b50603a6106a485878361134e565b50603b805460ff191660ff851617905560368290556106c289610ddf565b8015610708576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61071c610df8565b6107266000610ddf565b565b60345433906001600160a01b031681146107965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016104d8565b61079f81610ddf565b50565b6060603a80546103b390611239565b6037546000906001600160a01b03163314806107d757506033546001600160a01b031633145b6107f35760405162461bcd60e51b81526004016104d89061129c565b6104eb8383610e52565b6000338161080b8286610886565b90508381101561086b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d8565b6104698286868403610922565b600033610444818585610ac0565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6108b9610df8565b603480546001600160a01b0383166001600160a01b031990911681179091556108ea6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0383166109845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d8565b6001600160a01b0382166109e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d8565b6001600160a01b0383811660008181526035602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a528484610886565b90506000198114610aba5781811015610aad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d8565b610aba8484848403610922565b50505050565b6001600160a01b038316610b245760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d8565b6001600160a01b038216610b865760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d8565b6000806120206001600160a01b0316858585604051602001610baa9392919061140f565b60408051601f1981840301815290829052610bc491611433565b6000604051808303816000865af19150503d8060008114610c01576040519150601f19603f3d011682016040523d82523d6000602084013e610c06565b606091505b5091509150818015610c27575080806020019051810190610c27919061144f565b610c435760405162461bcd60e51b81526004016104d890611471565b836001600160a01b0316856001600160a01b03166000805160206114b583398151915285604051610c7691815260200190565b60405180910390a35050505050565b6001600160a01b038216610cdb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d8565b8060366000828254610ced9190611289565b9091555050604051600090819061202090610d109083908790879060200161140f565b60408051601f1981840301815290829052610d2a91611433565b6000604051808303816000865af19150503d8060008114610d67576040519150601f19603f3d011682016040523d82523d6000602084013e610d6c565b606091505b5091509150818015610d8d575080806020019051810190610d8d919061144f565b610da95760405162461bcd60e51b81526004016104d890611471565b6040518381526001600160a01b038516906000906000805160206114b5833981519152906020015b60405180910390a350505050565b603480546001600160a01b031916905561079f81610fac565b6033546001600160a01b031633146107265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b6001600160a01b038216610eb25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d8565b8060366000828254610ec491906114a1565b9091555050604051600090819061202090610ee79086908490879060200161140f565b60408051601f1981840301815290829052610f0191611433565b6000604051808303816000865af19150503d8060008114610f3e576040519150601f19603f3d011682016040523d82523d6000602084013e610f43565b606091505b5091509150818015610f64575080806020019051810190610f64919061144f565b610f805760405162461bcd60e51b81526004016104d890611471565b6040518381526000906001600160a01b038616906000805160206114b583398151915290602001610dd1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b83811015611019578181015183820152602001611001565b50506000910152565b6020815260008251806020840152611041816040850160208701610ffe565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461106c57600080fd5b919050565b6000806040838503121561108457600080fd5b61108d83611055565b946020939093013593505050565b6000806000606084860312156110b057600080fd5b6110b984611055565b92506110c760208501611055565b9150604084013590509250925092565b60008083601f8401126110e957600080fd5b50813567ffffffffffffffff81111561110157600080fd5b60208301915083602082850101111561111957600080fd5b9250929050565b600080600080600080600080600060e08a8c03121561113e57600080fd5b6111478a611055565b985061115560208b01611055565b975061116360408b01611055565b965060608a013567ffffffffffffffff8082111561118057600080fd5b61118c8d838e016110d7565b909850965060808c01359150808211156111a557600080fd5b506111b28c828d016110d7565b90955093505060a08a013560ff811681146111cc57600080fd5b8092505060c08a013590509295985092959850929598565b6000602082840312156111f657600080fd5b6111ff82611055565b9392505050565b6000806040838503121561121957600080fd5b61122283611055565b915061123060208401611055565b90509250929050565b600181811c9082168061124d57607f821691505b60208210810361126d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561044a5761044a611273565b6020808252602d908201527f4e617469766545524332303a204f6e6c7920707265646963617465206f72206f60408201526c1ddb995c8818d85b8818d85b1b609a1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561134957600081815260208120601f850160051c810160208610156113265750805b601f850160051c820191505b8181101561134557828155600101611332565b5050505b505050565b67ffffffffffffffff831115611366576113666112e9565b61137a836113748354611239565b836112ff565b6000601f8411600181146113ae57600085156113965750838201355b600019600387901b1c1916600186901b178355611408565b600083815260209020601f19861690835b828110156113df57868501358255602094850194600190920191016113bf565b50868210156113fc5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611445818460208701610ffe565b9190910192915050565b60006020828403121561146157600080fd5b815180151581146111ff57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561044a5761044a61127356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c841ea6b2ede0321e38158aa4ac46f255ea0caf34a5429d64b9287ce7df103b364736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061019a5760003560e01c806370a08231116100e45780639dc29fac116100925780639dc29fac1461031a578063a457c2d71461032d578063a9059cbb14610340578063dd62ed3e14610353578063e0563ab114610366578063e30c39781461036f578063e619870514610380578063f2fde38b1461039157600080fd5b806370a08231146102c3578063715018a6146102de57806379ba5097146102e65780638da5cb5b146102ee578063947287cf146102ff57806395d89b411461030857806397e5230d1461031057600080fd5b8063313ce5671161014c578063313ce56714610245578063395093511461025a5780633b878c221461026d57806340c10f191461027657806351351d531461028957806355b01e4d146102975780635ea5df79146102a55780636091636b146102ae57600080fd5b806306fdde031461019f57806307b3e252146101bd578063095ea7b3146101e357806318160ddd146102065780631f2d00651461021857806323b872dd14610229578063284017f51461023c575b600080fd5b6101a76103a4565b6040516101b49190611022565b60405180910390f35b6101cb6004600360981b0181565b6040516001600160a01b0390911681526020016101b4565b6101f66101f1366004611071565b610436565b60405190151581526020016101b4565b6036545b6040519081526020016101b4565b6038546001600160a01b03166101cb565b6101f661023736600461109b565b610450565b6101cb61202081565b603b5460405160ff90911681526020016101b4565b6101f6610268366004611071565b610474565b6101cb61101081565b6101f6610284366004611071565b610496565b6101cb6002600160a01b0381565b6101cb6004600160991b0181565b61020a61138881565b6102c16102bc366004611120565b6104f4565b005b61020a6102d13660046111e4565b6001600160a01b03163190565b6102c1610714565b6102c1610728565b6033546001600160a01b03166101cb565b61020a61520881565b6101a76107a2565b61020a620249f081565b6101f6610328366004611071565b6107b1565b6101f661033b366004611071565b6107fd565b6101f661034e366004611071565b610878565b61020a610361366004611206565b610886565b6101cb61203081565b6034546001600160a01b03166101cb565b6037546001600160a01b03166101cb565b6102c161039f3660046111e4565b6108b1565b6060603980546103b390611239565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90611239565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600033610444818585610922565b60019150505b92915050565b60003361045e858285610a46565b610469858585610ac0565b506001949350505050565b6000336104448185856104878383610886565b6104919190611289565b610922565b6037546000906001600160a01b03163314806104bc57506033546001600160a01b031633145b6104e15760405162461bcd60e51b81526004016104d89061129c565b60405180910390fd5b6104eb8383610c85565b50600192915050565b600054610100900460ff16158080156105145750600054600160ff909116105b8061052e5750303b15801561052e575060005460ff166001145b6105915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104d8565b6000805460ff1916600117905580156105b4576000805461ff0019166101001790555b336002600160a01b03146105f85760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016104d8565b6001600160a01b0389166106595760405162461bcd60e51b815260206004820152602260248201527f4e617469766545524332303a20496e76616c6964206f776e6572206164647265604482015261737360f01b60648201526084016104d8565b603780546001600160a01b03808d166001600160a01b03199283161790925560388054928b1692909116919091179055603961069687898361134e565b50603a6106a485878361134e565b50603b805460ff191660ff851617905560368290556106c289610ddf565b8015610708576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61071c610df8565b6107266000610ddf565b565b60345433906001600160a01b031681146107965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016104d8565b61079f81610ddf565b50565b6060603a80546103b390611239565b6037546000906001600160a01b03163314806107d757506033546001600160a01b031633145b6107f35760405162461bcd60e51b81526004016104d89061129c565b6104eb8383610e52565b6000338161080b8286610886565b90508381101561086b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d8565b6104698286868403610922565b600033610444818585610ac0565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6108b9610df8565b603480546001600160a01b0383166001600160a01b031990911681179091556108ea6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0383166109845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d8565b6001600160a01b0382166109e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d8565b6001600160a01b0383811660008181526035602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a528484610886565b90506000198114610aba5781811015610aad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d8565b610aba8484848403610922565b50505050565b6001600160a01b038316610b245760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d8565b6001600160a01b038216610b865760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d8565b6000806120206001600160a01b0316858585604051602001610baa9392919061140f565b60408051601f1981840301815290829052610bc491611433565b6000604051808303816000865af19150503d8060008114610c01576040519150601f19603f3d011682016040523d82523d6000602084013e610c06565b606091505b5091509150818015610c27575080806020019051810190610c27919061144f565b610c435760405162461bcd60e51b81526004016104d890611471565b836001600160a01b0316856001600160a01b03166000805160206114b583398151915285604051610c7691815260200190565b60405180910390a35050505050565b6001600160a01b038216610cdb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d8565b8060366000828254610ced9190611289565b9091555050604051600090819061202090610d109083908790879060200161140f565b60408051601f1981840301815290829052610d2a91611433565b6000604051808303816000865af19150503d8060008114610d67576040519150601f19603f3d011682016040523d82523d6000602084013e610d6c565b606091505b5091509150818015610d8d575080806020019051810190610d8d919061144f565b610da95760405162461bcd60e51b81526004016104d890611471565b6040518381526001600160a01b038516906000906000805160206114b5833981519152906020015b60405180910390a350505050565b603480546001600160a01b031916905561079f81610fac565b6033546001600160a01b031633146107265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b6001600160a01b038216610eb25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d8565b8060366000828254610ec491906114a1565b9091555050604051600090819061202090610ee79086908490879060200161140f565b60408051601f1981840301815290829052610f0191611433565b6000604051808303816000865af19150503d8060008114610f3e576040519150601f19603f3d011682016040523d82523d6000602084013e610f43565b606091505b5091509150818015610f64575080806020019051810190610f64919061144f565b610f805760405162461bcd60e51b81526004016104d890611471565b6040518381526000906001600160a01b038616906000805160206114b583398151915290602001610dd1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b83811015611019578181015183820152602001611001565b50506000910152565b6020815260008251806020840152611041816040850160208701610ffe565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461106c57600080fd5b919050565b6000806040838503121561108457600080fd5b61108d83611055565b946020939093013593505050565b6000806000606084860312156110b057600080fd5b6110b984611055565b92506110c760208501611055565b9150604084013590509250925092565b60008083601f8401126110e957600080fd5b50813567ffffffffffffffff81111561110157600080fd5b60208301915083602082850101111561111957600080fd5b9250929050565b600080600080600080600080600060e08a8c03121561113e57600080fd5b6111478a611055565b985061115560208b01611055565b975061116360408b01611055565b965060608a013567ffffffffffffffff8082111561118057600080fd5b61118c8d838e016110d7565b909850965060808c01359150808211156111a557600080fd5b506111b28c828d016110d7565b90955093505060a08a013560ff811681146111cc57600080fd5b8092505060c08a013590509295985092959850929598565b6000602082840312156111f657600080fd5b6111ff82611055565b9392505050565b6000806040838503121561121957600080fd5b61122283611055565b915061123060208401611055565b90509250929050565b600181811c9082168061124d57607f821691505b60208210810361126d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561044a5761044a611273565b6020808252602d908201527f4e617469766545524332303a204f6e6c7920707265646963617465206f72206f60408201526c1ddb995c8818d85b8818d85b1b609a1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561134957600081815260208120601f850160051c810160208610156113265750805b601f850160051c820191505b8181101561134557828155600101611332565b5050505b505050565b67ffffffffffffffff831115611366576113666112e9565b61137a836113748354611239565b836112ff565b6000601f8411600181146113ae57600085156113965750838201355b600019600387901b1c1916600186901b178355611408565b600083815260209020601f19861690835b828110156113df57868501358255602094850194600190920191016113bf565b50868210156113fc5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611445818460208701610ffe565b9190910192915050565b60006020828403121561146157600080fd5b815180151581146111ff57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561044a5761044a61127356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c841ea6b2ede0321e38158aa4ac46f255ea0caf34a5429d64b9287ce7df103b364736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var ChildERC20Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20","sourceName":"contracts/child/ChildERC20.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"invalidateNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611920806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806340c10f19116100ad578063a457c2d711610071578063a457c2d71461028b578063a9059cbb1461029e578063dd62ed3e146102b1578063e6198705146102c4578063f6d2ee86146102d557600080fd5b806340c10f191461021f57806370a082311461023257806395d89b411461025b5780639b77ef11146102635780639dc29fac1461027857600080fd5b80631f2d0065116100f45780631f2d00651461018c57806323b872dd146101b15780632d0335ab146101c4578063313ce567146101ed578063395093511461020c57600080fd5b806306fdde0314610126578063095ea7b3146101445780630c53c51c1461016757806318160ddd1461017a575b600080fd5b61012e6102e8565b60405161013b9190611395565b60405180910390f35b6101576101523660046113cb565b61037a565b604051901515815260200161013b565b61012e61017536600461144f565b61039e565b60a0545b60405190815260200161013b565b60d1546001600160a01b03165b6040516001600160a01b03909116815260200161013b565b6101576101bf3660046114c5565b610681565b61017e6101d2366004611501565b6001600160a01b031660009081526038602052604090205490565b60d154600160a01b900460ff1660405160ff909116815260200161013b565b61015761021a3660046113cb565b6106af565b61015761022d3660046113cb565b6106db565b61017e610240366004611501565b6001600160a01b03166000908152609e602052604090205490565b61012e61071b565b61027661027136600461151c565b61072a565b005b6101576102863660046113cb565b610751565b6101576102993660046113cb565b610788565b6101576102ac3660046113cb565b61080e565b61017e6102bf366004611535565b610826565b60d0546001600160a01b0316610199565b6102766102e3366004611568565b610851565b606060a180546102f7906115ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610323906115ec565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600080610385610ad1565b9050610392818585610ae0565b60019150505b92915050565b606060006103e187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0592505050565b90506001600160e01b031960003581169082160361046c5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084015b60405180910390fd5b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506104dd8982888888610c20565b6105335760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610463565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161058893929190611626565b60408051601f19818403018152908290526105a29161164c565b6000604051808303816000865af19150503d80600081146105df576040519150601f19603f3d011682016040523d82523d6000602084013e6105e4565b606091505b5091509150816106365760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610463565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161066b9493929190611668565b60405180910390a19a9950505050505050505050565b60008061068c610ad1565b9050610699858285610cfc565b6106a4858585610d76565b506001949350505050565b6000806106ba610ad1565b90506103928185856106cc8589610826565b6106d691906116b4565b610ae0565b60d0546000906001600160a01b031633146107085760405162461bcd60e51b8152600401610463906116d5565b6107128383610f0f565b50600192915050565b606060a280546102f7906115ec565b33600090815260386020526040812080548392906107499084906116b4565b909155505050565b60d0546000906001600160a01b0316331461077e5760405162461bcd60e51b8152600401610463906116d5565b6107128383610fbf565b600080610793610ad1565b905060006107a18286610826565b9050838110156108015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610463565b6106a48286868403610ae0565b600080610819610ad1565b9050610392818585610d76565b6001600160a01b039182166000908152609f6020908152604080832093909416825291909152205490565b606b54610100900460ff16158080156108715750606b54600160ff909116105b8061088b5750303b15801561088b5750606b5460ff166001145b6108ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610463565b606b805460ff19166001179055801561091157606b805461ff0019166101001790555b6001600160a01b0387161580159061092857508415155b801561093357508215155b61097f5760405162461bcd60e51b815260206004820152601e60248201527f4368696c6445524332303a204241445f494e495449414c495a4154494f4e00006044820152606401610463565b60d1805460ff8416600160a01b026001600160a81b03199091166001600160a01b038a161717905560d080546001600160a01b03191633179055604080516020601f8801819004810282018101909252868152610a2a91889088908190840183828082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506110de92505050565b610a8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b6020820152915061110f9050565b8015610ac857606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000610adb61117b565b905090565b6001600160a01b038316610b425760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610463565b6001600160a01b038216610ba35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610463565b6001600160a01b038381166000818152609f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008151600003610c1857506000919050565b506020015190565b6000806001610c36610c31886111d7565b611254565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610c84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cdb5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610463565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610d088484610826565b90506000198114610d705781811015610d635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610463565b610d708484848403610ae0565b50505050565b6001600160a01b038316610dda5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610463565b6001600160a01b038216610e3c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610463565b6001600160a01b0383166000908152609e602052604090205481811015610eb45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610463565b6001600160a01b038085166000818152609e602052604080822086860390559286168082529083902080548601905591516000805160206118cb83398151915290610f029086815260200190565b60405180910390a3610d70565b6001600160a01b038216610f655760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610463565b8060a06000828254610f7791906116b4565b90915550506001600160a01b0382166000818152609e60209081526040808320805486019055518481526000805160206118cb833981519152910160405180910390a35b5050565b6001600160a01b03821661101f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610463565b6001600160a01b0382166000908152609e6020526040902054818110156110935760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610463565b6001600160a01b0383166000818152609e60209081526040808320868603905560a080548790039055518581529192916000805160206118cb8339815191529101610bf8565b505050565b606b54610100900460ff166111055760405162461bcd60e51b815260040161046390611718565b610fbb8282611281565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61115d8184846112c1565b600055600280546001600160a01b0319163017905560055550505050565b60003033036111d157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111d49050565b50335b90565b60006040518060800160405280604381526020016118886043913980516020918201208351848301516040808701518051908601209051611237950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039861126161130a565b8360405161190160f01b8152600281019290925260228201526042902090565b606b54610100900460ff166112a85760405162461bcd60e51b815260040161046390611718565b60a16112b483826117c7565b5060a26110d982826117c7565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611328575060015446145b15611334575060005490565b610adb6005546003546004546112c1565b60005b83811015611360578181015183820152602001611348565b50506000910152565b60008151808452611381816020860160208601611345565b601f01601f19169290920160200192915050565b6020815260006113a86020830184611369565b9392505050565b80356001600160a01b03811681146113c657600080fd5b919050565b600080604083850312156113de57600080fd5b6113e7836113af565b946020939093013593505050565b60008083601f84011261140757600080fd5b50813567ffffffffffffffff81111561141f57600080fd5b60208301915083602082850101111561143757600080fd5b9250929050565b803560ff811681146113c657600080fd5b60008060008060008060a0878903121561146857600080fd5b611471876113af565b9550602087013567ffffffffffffffff81111561148d57600080fd5b61149989828a016113f5565b90965094505060408701359250606087013591506114b96080880161143e565b90509295509295509295565b6000806000606084860312156114da57600080fd5b6114e3846113af565b92506114f1602085016113af565b9150604084013590509250925092565b60006020828403121561151357600080fd5b6113a8826113af565b60006020828403121561152e57600080fd5b5035919050565b6000806040838503121561154857600080fd5b611551836113af565b915061155f602084016113af565b90509250929050565b6000806000806000806080878903121561158157600080fd5b61158a876113af565b9550602087013567ffffffffffffffff808211156115a757600080fd5b6115b38a838b016113f5565b909750955060408901359150808211156115cc57600080fd5b506115d989828a016113f5565b90945092506114b990506060880161143e565b600181811c9082168061160057607f821691505b60208210810361162057634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161165e818460208701611345565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b8082018082111561039857634e487b7160e01b600052601160045260246000fd5b60208082526023908201527f4368696c6445524332303a204f6e6c79207072656469636174652063616e2063604082015262185b1b60ea1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156110d957600081815260208120601f850160051c810160208610156117a05750805b601f850160051c820191505b818110156117bf578281556001016117ac565b505050505050565b815167ffffffffffffffff8111156117e1576117e1611763565b6117f5816117ef84546115ec565b84611779565b602080601f83116001811461182a57600084156118125750858301515b600019600386901b1c1916600185901b1785556117bf565b600085815260208120601f198616915b828110156118595788860151825594840194600190910190840161183a565b50858210156118775787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b322ab3a17e671324178982233e8fdd83f1d7487c05f56ee80ebf7cb64b9b2c964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c806340c10f19116100ad578063a457c2d711610071578063a457c2d71461028b578063a9059cbb1461029e578063dd62ed3e146102b1578063e6198705146102c4578063f6d2ee86146102d557600080fd5b806340c10f191461021f57806370a082311461023257806395d89b411461025b5780639b77ef11146102635780639dc29fac1461027857600080fd5b80631f2d0065116100f45780631f2d00651461018c57806323b872dd146101b15780632d0335ab146101c4578063313ce567146101ed578063395093511461020c57600080fd5b806306fdde0314610126578063095ea7b3146101445780630c53c51c1461016757806318160ddd1461017a575b600080fd5b61012e6102e8565b60405161013b9190611395565b60405180910390f35b6101576101523660046113cb565b61037a565b604051901515815260200161013b565b61012e61017536600461144f565b61039e565b60a0545b60405190815260200161013b565b60d1546001600160a01b03165b6040516001600160a01b03909116815260200161013b565b6101576101bf3660046114c5565b610681565b61017e6101d2366004611501565b6001600160a01b031660009081526038602052604090205490565b60d154600160a01b900460ff1660405160ff909116815260200161013b565b61015761021a3660046113cb565b6106af565b61015761022d3660046113cb565b6106db565b61017e610240366004611501565b6001600160a01b03166000908152609e602052604090205490565b61012e61071b565b61027661027136600461151c565b61072a565b005b6101576102863660046113cb565b610751565b6101576102993660046113cb565b610788565b6101576102ac3660046113cb565b61080e565b61017e6102bf366004611535565b610826565b60d0546001600160a01b0316610199565b6102766102e3366004611568565b610851565b606060a180546102f7906115ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610323906115ec565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600080610385610ad1565b9050610392818585610ae0565b60019150505b92915050565b606060006103e187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0592505050565b90506001600160e01b031960003581169082160361046c5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084015b60405180910390fd5b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506104dd8982888888610c20565b6105335760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610463565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161058893929190611626565b60408051601f19818403018152908290526105a29161164c565b6000604051808303816000865af19150503d80600081146105df576040519150601f19603f3d011682016040523d82523d6000602084013e6105e4565b606091505b5091509150816106365760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610463565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161066b9493929190611668565b60405180910390a19a9950505050505050505050565b60008061068c610ad1565b9050610699858285610cfc565b6106a4858585610d76565b506001949350505050565b6000806106ba610ad1565b90506103928185856106cc8589610826565b6106d691906116b4565b610ae0565b60d0546000906001600160a01b031633146107085760405162461bcd60e51b8152600401610463906116d5565b6107128383610f0f565b50600192915050565b606060a280546102f7906115ec565b33600090815260386020526040812080548392906107499084906116b4565b909155505050565b60d0546000906001600160a01b0316331461077e5760405162461bcd60e51b8152600401610463906116d5565b6107128383610fbf565b600080610793610ad1565b905060006107a18286610826565b9050838110156108015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610463565b6106a48286868403610ae0565b600080610819610ad1565b9050610392818585610d76565b6001600160a01b039182166000908152609f6020908152604080832093909416825291909152205490565b606b54610100900460ff16158080156108715750606b54600160ff909116105b8061088b5750303b15801561088b5750606b5460ff166001145b6108ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610463565b606b805460ff19166001179055801561091157606b805461ff0019166101001790555b6001600160a01b0387161580159061092857508415155b801561093357508215155b61097f5760405162461bcd60e51b815260206004820152601e60248201527f4368696c6445524332303a204241445f494e495449414c495a4154494f4e00006044820152606401610463565b60d1805460ff8416600160a01b026001600160a81b03199091166001600160a01b038a161717905560d080546001600160a01b03191633179055604080516020601f8801819004810282018101909252868152610a2a91889088908190840183828082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506110de92505050565b610a8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b6020820152915061110f9050565b8015610ac857606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000610adb61117b565b905090565b6001600160a01b038316610b425760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610463565b6001600160a01b038216610ba35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610463565b6001600160a01b038381166000818152609f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008151600003610c1857506000919050565b506020015190565b6000806001610c36610c31886111d7565b611254565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610c84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cdb5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610463565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610d088484610826565b90506000198114610d705781811015610d635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610463565b610d708484848403610ae0565b50505050565b6001600160a01b038316610dda5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610463565b6001600160a01b038216610e3c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610463565b6001600160a01b0383166000908152609e602052604090205481811015610eb45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610463565b6001600160a01b038085166000818152609e602052604080822086860390559286168082529083902080548601905591516000805160206118cb83398151915290610f029086815260200190565b60405180910390a3610d70565b6001600160a01b038216610f655760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610463565b8060a06000828254610f7791906116b4565b90915550506001600160a01b0382166000818152609e60209081526040808320805486019055518481526000805160206118cb833981519152910160405180910390a35b5050565b6001600160a01b03821661101f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610463565b6001600160a01b0382166000908152609e6020526040902054818110156110935760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610463565b6001600160a01b0383166000818152609e60209081526040808320868603905560a080548790039055518581529192916000805160206118cb8339815191529101610bf8565b505050565b606b54610100900460ff166111055760405162461bcd60e51b815260040161046390611718565b610fbb8282611281565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61115d8184846112c1565b600055600280546001600160a01b0319163017905560055550505050565b60003033036111d157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111d49050565b50335b90565b60006040518060800160405280604381526020016118886043913980516020918201208351848301516040808701518051908601209051611237950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039861126161130a565b8360405161190160f01b8152600281019290925260228201526042902090565b606b54610100900460ff166112a85760405162461bcd60e51b815260040161046390611718565b60a16112b483826117c7565b5060a26110d982826117c7565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611328575060015446145b15611334575060005490565b610adb6005546003546004546112c1565b60005b83811015611360578181015183820152602001611348565b50506000910152565b60008151808452611381816020860160208601611345565b601f01601f19169290920160200192915050565b6020815260006113a86020830184611369565b9392505050565b80356001600160a01b03811681146113c657600080fd5b919050565b600080604083850312156113de57600080fd5b6113e7836113af565b946020939093013593505050565b60008083601f84011261140757600080fd5b50813567ffffffffffffffff81111561141f57600080fd5b60208301915083602082850101111561143757600080fd5b9250929050565b803560ff811681146113c657600080fd5b60008060008060008060a0878903121561146857600080fd5b611471876113af565b9550602087013567ffffffffffffffff81111561148d57600080fd5b61149989828a016113f5565b90965094505060408701359250606087013591506114b96080880161143e565b90509295509295509295565b6000806000606084860312156114da57600080fd5b6114e3846113af565b92506114f1602085016113af565b9150604084013590509250925092565b60006020828403121561151357600080fd5b6113a8826113af565b60006020828403121561152e57600080fd5b5035919050565b6000806040838503121561154857600080fd5b611551836113af565b915061155f602084016113af565b90509250929050565b6000806000806000806080878903121561158157600080fd5b61158a876113af565b9550602087013567ffffffffffffffff808211156115a757600080fd5b6115b38a838b016113f5565b909750955060408901359150808211156115cc57600080fd5b506115d989828a016113f5565b90945092506114b990506060880161143e565b600181811c9082168061160057607f821691505b60208210810361162057634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161165e818460208701611345565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b8082018082111561039857634e487b7160e01b600052601160045260246000fd5b60208082526023908201527f4368696c6445524332303a204f6e6c79207072656469636174652063616e2063604082015262185b1b60ea1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156110d957600081815260208120601f850160051c810160208610156117a05750805b601f850160051c820191505b818110156117bf578281556001016117ac565b505050505050565b815167ffffffffffffffff8111156117e1576117e1611763565b6117f5816117ef84546115ec565b84611779565b602080601f83116001811461182a57600084156118125750858301515b600019600386901b1c1916600185901b1785556117bf565b600085815260208120601f198616915b828110156118595788860151825594840194600190910190840161183a565b50858210156118775787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b322ab3a17e671324178982233e8fdd83f1d7487c05f56ee80ebf7cb64b9b2c964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC20PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20Predicate","sourceName":"contracts/child/ChildERC20Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506114ea806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d610188366004610ff2565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f610208366004611063565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611087565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c13660046110c8565b610474565b61018d6102d4366004611151565b610648565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610657565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836107a7565b505050565b6034546001600160a01b031633146104df5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b6035546001600160a01b0384811691161461054d5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161057c60206000848661117d565b610585916111a7565b036105a45761059f61059a826020818661117d565b610b1d565b610642565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6105d360206000848661117d565b6105dc916111a7565b036105eb5761059f8282610dc8565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6106538233836107a7565b5050565b6001600160a01b0385161580159061067757506001600160a01b03841615155b801561068b57506001600160a01b03831615155b801561069f57506001600160a01b03821615155b6106fb5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156107a0576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b60000361080b5760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f91906111c5565b6001600160a01b038181166000908152603760205260409020549192508581169116146108ae5760405162461bcd60e51b8152600401610340906111e2565b6001600160a01b0381166108c4576108c4611225565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906111c5565b6001600160a01b03161461094657610946611225565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610974903390869060040161123b565b6020604051808303816000875af1158015610993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b79190611254565b610a035760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610a8e9391169160c4016112bc565b600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610b0f92919061123b565b60405180910390a450505050565b6000808080610b2e858701876112e8565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610b715760405162461bcd60e51b8152600401610340906111e2565b806001600160a01b03163b600003610b8b57610b8b611225565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef91906111c5565b9050856001600160a01b0316816001600160a01b031614610c1257610c12611225565b6001600160a01b038116610c2857610c28611225565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9491906111c5565b6001600160a01b031614610caa57610caa611225565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610cd8908790879060040161123b565b6020604051808303816000875af1158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190611254565b610d675760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd8887604051610db692919061123b565b60405180910390a45050505050505050565b6000808080610dd9858701876113dc565b92975090955093509150506001600160a01b038416610dfa57610dfa611225565b6001600160a01b038481166000908152603760205260409020541615610e2257610e22611225565b6036546040516bffffffffffffffffffffffff19606087901b166020820152600091610e72916001600160a01b039091169060340160405160208183030381529060405280519060200120610f3d565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690610eca908890889088908890600401611469565b600060405180830381600087803b158015610ee457600080fd5b505af1158015610ef8573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116610fd45760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b6001600160a01b0381168114610fef57600080fd5b50565b600080600080600060a0868803121561100a57600080fd5b853561101581610fda565b9450602086013561102581610fda565b9350604086013561103581610fda565b9250606086013561104581610fda565b9150608086013561105581610fda565b809150509295509295909350565b60006020828403121561107557600080fd5b813561108081610fda565b9392505050565b60008060006060848603121561109c57600080fd5b83356110a781610fda565b925060208401356110b781610fda565b929592945050506040919091013590565b600080600080606085870312156110de57600080fd5b8435935060208501356110f081610fda565b9250604085013567ffffffffffffffff8082111561110d57600080fd5b818701915087601f83011261112157600080fd5b81358181111561113057600080fd5b88602082850101111561114257600080fd5b95989497505060200194505050565b6000806040838503121561116457600080fd5b823561116f81610fda565b946020939093013593505050565b6000808585111561118d57600080fd5b8386111561119a57600080fd5b5050820193919092039150565b80356020831015610fd457600019602084900360031b1b1692915050565b6000602082840312156111d757600080fd5b815161108081610fda565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60006020828403121561126657600080fd5b8151801515811461108057600080fd5b6000815180845260005b8181101561129c57602081850181015186830182015201611280565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190526000906112e090830184611276565b949350505050565b600080600080608085870312156112fe57600080fd5b843561130981610fda565b9350602085013561131981610fda565b9250604085013561132981610fda565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261136057600080fd5b813567ffffffffffffffff8082111561137b5761137b611339565b604051601f8301601f19908116603f011681019082821181831017156113a3576113a3611339565b816040528381528660208588010111156113bc57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156113f457600080fd5b85359450602086013561140681610fda565b9350604086013567ffffffffffffffff8082111561142357600080fd5b61142f89838a0161134f565b9450606088013591508082111561144557600080fd5b506114528882890161134f565b925050608086013560ff8116811461105557600080fd5b6001600160a01b038516815260806020820181905260009061148d90830186611276565b828103604084015261149f8186611276565b91505060ff831660608301529594505050505056fea2646970667358221220e0f44ad7883c5cd2dbd85a60832f6c9874795bf975cefd366724cc91bbc22dcd64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d610188366004610ff2565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f610208366004611063565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611087565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c13660046110c8565b610474565b61018d6102d4366004611151565b610648565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610657565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836107a7565b505050565b6034546001600160a01b031633146104df5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b6035546001600160a01b0384811691161461054d5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161057c60206000848661117d565b610585916111a7565b036105a45761059f61059a826020818661117d565b610b1d565b610642565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6105d360206000848661117d565b6105dc916111a7565b036105eb5761059f8282610dc8565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6106538233836107a7565b5050565b6001600160a01b0385161580159061067757506001600160a01b03841615155b801561068b57506001600160a01b03831615155b801561069f57506001600160a01b03821615155b6106fb5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156107a0576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b60000361080b5760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f91906111c5565b6001600160a01b038181166000908152603760205260409020549192508581169116146108ae5760405162461bcd60e51b8152600401610340906111e2565b6001600160a01b0381166108c4576108c4611225565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906111c5565b6001600160a01b03161461094657610946611225565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610974903390869060040161123b565b6020604051808303816000875af1158015610993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b79190611254565b610a035760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610a8e9391169160c4016112bc565b600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610b0f92919061123b565b60405180910390a450505050565b6000808080610b2e858701876112e8565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610b715760405162461bcd60e51b8152600401610340906111e2565b806001600160a01b03163b600003610b8b57610b8b611225565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef91906111c5565b9050856001600160a01b0316816001600160a01b031614610c1257610c12611225565b6001600160a01b038116610c2857610c28611225565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9491906111c5565b6001600160a01b031614610caa57610caa611225565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610cd8908790879060040161123b565b6020604051808303816000875af1158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190611254565b610d675760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd8887604051610db692919061123b565b60405180910390a45050505050505050565b6000808080610dd9858701876113dc565b92975090955093509150506001600160a01b038416610dfa57610dfa611225565b6001600160a01b038481166000908152603760205260409020541615610e2257610e22611225565b6036546040516bffffffffffffffffffffffff19606087901b166020820152600091610e72916001600160a01b039091169060340160405160208183030381529060405280519060200120610f3d565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690610eca908890889088908890600401611469565b600060405180830381600087803b158015610ee457600080fd5b505af1158015610ef8573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116610fd45760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b6001600160a01b0381168114610fef57600080fd5b50565b600080600080600060a0868803121561100a57600080fd5b853561101581610fda565b9450602086013561102581610fda565b9350604086013561103581610fda565b9250606086013561104581610fda565b9150608086013561105581610fda565b809150509295509295909350565b60006020828403121561107557600080fd5b813561108081610fda565b9392505050565b60008060006060848603121561109c57600080fd5b83356110a781610fda565b925060208401356110b781610fda565b929592945050506040919091013590565b600080600080606085870312156110de57600080fd5b8435935060208501356110f081610fda565b9250604085013567ffffffffffffffff8082111561110d57600080fd5b818701915087601f83011261112157600080fd5b81358181111561113057600080fd5b88602082850101111561114257600080fd5b95989497505060200194505050565b6000806040838503121561116457600080fd5b823561116f81610fda565b946020939093013593505050565b6000808585111561118d57600080fd5b8386111561119a57600080fd5b5050820193919092039150565b80356020831015610fd457600019602084900360031b1b1692915050565b6000602082840312156111d757600080fd5b815161108081610fda565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60006020828403121561126657600080fd5b8151801515811461108057600080fd5b6000815180845260005b8181101561129c57602081850181015186830182015201611280565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190526000906112e090830184611276565b949350505050565b600080600080608085870312156112fe57600080fd5b843561130981610fda565b9350602085013561131981610fda565b9250604085013561132981610fda565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261136057600080fd5b813567ffffffffffffffff8082111561137b5761137b611339565b604051601f8301601f19908116603f011681019082821181831017156113a3576113a3611339565b816040528381528660208588010111156113bc57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156113f457600080fd5b85359450602086013561140681610fda565b9350604086013567ffffffffffffffff8082111561142357600080fd5b61142f89838a0161134f565b9450606088013591508082111561144557600080fd5b506114528882890161134f565b925050608086013560ff8116811461105557600080fd5b6001600160a01b038516815260806020820181905260009061148d90830186611276565b828103604084015261149f8186611276565b91505060ff831660608301529594505050505056fea2646970667358221220e0f44ad7883c5cd2dbd85a60832f6c9874795bf975cefd366724cc91bbc22dcd64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC20PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20PredicateAccessList","sourceName":"contracts/child/ChildERC20PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611c8e806100206000396000f3fe608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e0366004611616565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e5610228366004611695565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a761028336600461173e565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b366004611762565b61068c565b6101e561031e36600461177f565b6106db565b6101e5610331366004611762565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e56103853660046117c0565b61073a565b6101e561039836600461173e565b61090e565b6101e56103ab366004611849565b61097f565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611875565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611899565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610996565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611875565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611899565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610996565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610ae7565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610b00565b6106106000610ae7565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610ae7565b50565b610694610b00565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610b5a565b6106ee838383610b62565b505050565b6106fb610b00565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b60fe546001600160a01b038481169116146108135760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108426020600084866118e7565b61084b91611911565b0361086a5761086561086082602081866118e7565b610ed9565b610908565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108996020600084866118e7565b6108a291611911565b036108b1576108658282611185565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610916610b00565b606580546001600160a01b0383166001600160a01b031990911681179091556109476033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610987610b5a565b610992823383610b62565b5050565b6001600160a01b038516158015906109b657506001600160a01b03841615155b80156109ca57506001600160a01b03831615155b80156109de57506001600160a01b03821615155b610a3a5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610ae0576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b0319169055610689816112fc565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b61061061134e565b826001600160a01b03163b600003610bc65760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a919061192f565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610c6a5760405162461bcd60e51b81526004016103fe9061194c565b6001600160a01b038116610c8057610c8061198f565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061192f565b6001600160a01b031614610d0257610d0261198f565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610d3090339086906004016119a5565b6020604051808303816000875af1158015610d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7391906119be565b610dbf5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e4a9391169160c401611a2b565b600060405180830381600087803b158015610e6457600080fd5b505af1158015610e78573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610ecb9291906119a5565b60405180910390a450505050565b6000808080610eea85870187611a57565b6001600160a01b038085166000908152610100602052604090205494985092965090945092501680610f2e5760405162461bcd60e51b81526004016103fe9061194c565b806001600160a01b03163b600003610f4857610f4861198f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac919061192f565b9050856001600160a01b0316816001600160a01b031614610fcf57610fcf61198f565b6001600160a01b038116610fe557610fe561198f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561102d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611051919061192f565b6001600160a01b0316146110675761106761198f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061109590879087906004016119a5565b6020604051808303816000875af11580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d891906119be565b6111245760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516111739291906119a5565b60405180910390a45050505050505050565b600080808061119685870187611b4b565b92975090955093509150506001600160a01b0384166111b7576111b761198f565b6001600160a01b038481166000908152610100602052604090205416156111e0576111e061198f565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611230916001600160a01b039091169060340160405160208183030381529060405280519060200120611564565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690611289908890889088908890600401611bd8565b600060405180830381600087803b1580156112a357600080fd5b505af11580156112b7573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff161561145957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916113b09190611c23565b6000604051808303818686fa925050503d80600081146113ec576040519150601f19603f3d011682016040523d82523d6000602084013e6113f1565b606091505b509150915081801561141657506000818060200190518101906114149190611c3f565b115b6114565760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916114c09190611c23565b6000604051808303818686fa925050503d80600081146114fc576040519150601f19603f3d011682016040523d82523d6000602084013e611501565b606091505b50915091508180156115275750808060200190518101906115229190611c3f565b600114155b6109925760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115fb5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b6001600160a01b038116811461068957600080fd5b600080600080600060a0868803121561162e57600080fd5b853561163981611601565b9450602086013561164981611601565b9350604086013561165981611601565b9250606086013561166981611601565b9150608086013561167981611601565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b0312156116b257600080fd5b88356116bd81611601565b975060208901356116cd81611601565b965060408901356116dd81611601565b955060608901356116ed81611601565b945060808901356116fd81611601565b935060a089013561170d81611687565b925060c089013561171d81611687565b915060e089013561172d81611601565b809150509295985092959890939650565b60006020828403121561175057600080fd5b813561175b81611601565b9392505050565b60006020828403121561177457600080fd5b813561175b81611687565b60008060006060848603121561179457600080fd5b833561179f81611601565b925060208401356117af81611601565b929592945050506040919091013590565b600080600080606085870312156117d657600080fd5b8435935060208501356117e881611601565b9250604085013567ffffffffffffffff8082111561180557600080fd5b818701915087601f83011261181957600080fd5b81358181111561182857600080fd5b88602082850101111561183a57600080fd5b95989497505060200194505050565b6000806040838503121561185c57600080fd5b823561186781611601565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156118f757600080fd5b8386111561190457600080fd5b5050820193919092039150565b803560208310156115fb57600019602084900360031b1b1692915050565b60006020828403121561194157600080fd5b815161175b81611601565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156119d057600080fd5b815161175b81611687565b60005b838110156119f65781810151838201526020016119de565b50506000910152565b60008151808452611a178160208601602086016119db565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611a4f908301846119ff565b949350505050565b60008060008060808587031215611a6d57600080fd5b8435611a7881611601565b93506020850135611a8881611601565b92506040850135611a9881611601565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611acf57600080fd5b813567ffffffffffffffff80821115611aea57611aea611aa8565b604051601f8301601f19908116603f01168101908282118183101715611b1257611b12611aa8565b81604052838152866020858801011115611b2b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611b6357600080fd5b853594506020860135611b7581611601565b9350604086013567ffffffffffffffff80821115611b9257600080fd5b611b9e89838a01611abe565b94506060880135915080821115611bb457600080fd5b50611bc188828901611abe565b925050608086013560ff8116811461167957600080fd5b6001600160a01b0385168152608060208201819052600090611bfc908301866119ff565b8281036040840152611c0e81866119ff565b91505060ff8316606083015295945050505050565b60008251611c358184602087016119db565b9190910192915050565b600060208284031215611c5157600080fd5b505191905056fea26469706673582212206ea7447ee1c5e059d53f0d5e7f2241d867a55a3968ed1a50039de2f2d55b996664736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e0366004611616565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e5610228366004611695565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a761028336600461173e565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b366004611762565b61068c565b6101e561031e36600461177f565b6106db565b6101e5610331366004611762565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e56103853660046117c0565b61073a565b6101e561039836600461173e565b61090e565b6101e56103ab366004611849565b61097f565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611875565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611899565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610996565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611875565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611899565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610996565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610ae7565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610b00565b6106106000610ae7565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610ae7565b50565b610694610b00565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610b5a565b6106ee838383610b62565b505050565b6106fb610b00565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b60fe546001600160a01b038481169116146108135760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108426020600084866118e7565b61084b91611911565b0361086a5761086561086082602081866118e7565b610ed9565b610908565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108996020600084866118e7565b6108a291611911565b036108b1576108658282611185565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610916610b00565b606580546001600160a01b0383166001600160a01b031990911681179091556109476033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610987610b5a565b610992823383610b62565b5050565b6001600160a01b038516158015906109b657506001600160a01b03841615155b80156109ca57506001600160a01b03831615155b80156109de57506001600160a01b03821615155b610a3a5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610ae0576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b0319169055610689816112fc565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b61061061134e565b826001600160a01b03163b600003610bc65760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a919061192f565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610c6a5760405162461bcd60e51b81526004016103fe9061194c565b6001600160a01b038116610c8057610c8061198f565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061192f565b6001600160a01b031614610d0257610d0261198f565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610d3090339086906004016119a5565b6020604051808303816000875af1158015610d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7391906119be565b610dbf5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e4a9391169160c401611a2b565b600060405180830381600087803b158015610e6457600080fd5b505af1158015610e78573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610ecb9291906119a5565b60405180910390a450505050565b6000808080610eea85870187611a57565b6001600160a01b038085166000908152610100602052604090205494985092965090945092501680610f2e5760405162461bcd60e51b81526004016103fe9061194c565b806001600160a01b03163b600003610f4857610f4861198f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac919061192f565b9050856001600160a01b0316816001600160a01b031614610fcf57610fcf61198f565b6001600160a01b038116610fe557610fe561198f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561102d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611051919061192f565b6001600160a01b0316146110675761106761198f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061109590879087906004016119a5565b6020604051808303816000875af11580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d891906119be565b6111245760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516111739291906119a5565b60405180910390a45050505050505050565b600080808061119685870187611b4b565b92975090955093509150506001600160a01b0384166111b7576111b761198f565b6001600160a01b038481166000908152610100602052604090205416156111e0576111e061198f565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611230916001600160a01b039091169060340160405160208183030381529060405280519060200120611564565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690611289908890889088908890600401611bd8565b600060405180830381600087803b1580156112a357600080fd5b505af11580156112b7573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff161561145957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916113b09190611c23565b6000604051808303818686fa925050503d80600081146113ec576040519150601f19603f3d011682016040523d82523d6000602084013e6113f1565b606091505b509150915081801561141657506000818060200190518101906114149190611c3f565b115b6114565760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916114c09190611c23565b6000604051808303818686fa925050503d80600081146114fc576040519150601f19603f3d011682016040523d82523d6000602084013e611501565b606091505b50915091508180156115275750808060200190518101906115229190611c3f565b600114155b6109925760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115fb5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b6001600160a01b038116811461068957600080fd5b600080600080600060a0868803121561162e57600080fd5b853561163981611601565b9450602086013561164981611601565b9350604086013561165981611601565b9250606086013561166981611601565b9150608086013561167981611601565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b0312156116b257600080fd5b88356116bd81611601565b975060208901356116cd81611601565b965060408901356116dd81611601565b955060608901356116ed81611601565b945060808901356116fd81611601565b935060a089013561170d81611687565b925060c089013561171d81611687565b915060e089013561172d81611601565b809150509295985092959890939650565b60006020828403121561175057600080fd5b813561175b81611601565b9392505050565b60006020828403121561177457600080fd5b813561175b81611687565b60008060006060848603121561179457600080fd5b833561179f81611601565b925060208401356117af81611601565b929592945050506040919091013590565b600080600080606085870312156117d657600080fd5b8435935060208501356117e881611601565b9250604085013567ffffffffffffffff8082111561180557600080fd5b818701915087601f83011261181957600080fd5b81358181111561182857600080fd5b88602082850101111561183a57600080fd5b95989497505060200194505050565b6000806040838503121561185c57600080fd5b823561186781611601565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156118f757600080fd5b8386111561190457600080fd5b5050820193919092039150565b803560208310156115fb57600019602084900360031b1b1692915050565b60006020828403121561194157600080fd5b815161175b81611601565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156119d057600080fd5b815161175b81611687565b60005b838110156119f65781810151838201526020016119de565b50506000910152565b60008151808452611a178160208601602086016119db565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611a4f908301846119ff565b949350505050565b60008060008060808587031215611a6d57600080fd5b8435611a7881611601565b93506020850135611a8881611601565b92506040850135611a9881611601565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611acf57600080fd5b813567ffffffffffffffff80821115611aea57611aea611aa8565b604051601f8301601f19908116603f01168101908282118183101715611b1257611b12611aa8565b81604052838152866020858801011115611b2b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611b6357600080fd5b853594506020860135611b7581611601565b9350604086013567ffffffffffffffff80821115611b9257600080fd5b611b9e89838a01611abe565b94506060880135915080821115611bb457600080fd5b50611bc188828901611abe565b925050608086013560ff8116811461167957600080fd5b6001600160a01b0385168152608060208201819052600090611bfc908301866119ff565b8281036040840152611c0e81866119ff565b91505060ff8316606083015295945050505050565b60008251611c358184602087016119db565b9190910192915050565b600060208284031215611c5157600080fd5b505191905056fea26469706673582212206ea7447ee1c5e059d53f0d5e7f2241d867a55a3968ed1a50039de2f2d55b996664736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC20PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20Predicate","sourceName":"contracts/child/ChildERC20Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611787806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d61018836600461127c565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f6102083660046112ed565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611311565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c1366004611352565b610474565b61018d6102d43660046113db565b610865565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610874565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836109c4565b505050565b6104aa604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b815250610d3a565b6034546001600160a01b031633146105155760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b61054b6040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b815250610d3a565b6035546001600160a01b038481169116146105b95760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b6105ef604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b815250610d3a565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161061e602060008486611407565b61062791611431565b0361071e576106626040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b815250610d3a565b610698604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b815250610d3a565b6106ad6106a88260208186611407565b610d80565b6106e36040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b815250610d3a565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b815250610d3a565b61085f565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61074d602060008486611407565b61075691611431565b036107d15761079160405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b815250610d3a565b61079b828261102b565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b815250610d3a565b6108086040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b815250610d3a565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6108708233836109c4565b5050565b6001600160a01b0385161580159061089457506001600160a01b03841615155b80156108a857506001600160a01b03831615155b80156108bc57506001600160a01b03821615155b6109185760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156109bd576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b600003610a285760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c919061144f565b6001600160a01b03818116600090815260376020526040902054919250858116911614610acb5760405162461bcd60e51b81526004016103409061146c565b6001600160a01b038116610ae157610ae16114af565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d919061144f565b6001600160a01b031614610b6357610b636114af565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610b9190339086906004016114c5565b6020604051808303816000875af1158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906114de565b610c205760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610cab9391169160c401611546565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610d2c9291906114c5565b60405180910390a450505050565b610d7d81604051602401610d4e9190611572565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526111a0565b50565b6000808080610d9185870187611585565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610dd45760405162461bcd60e51b81526004016103409061146c565b806001600160a01b03163b600003610dee57610dee6114af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e52919061144f565b9050856001600160a01b0316816001600160a01b031614610e7557610e756114af565b6001600160a01b038116610e8b57610e8b6114af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef7919061144f565b6001600160a01b031614610f0d57610f0d6114af565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f3b90879087906004016114c5565b6020604051808303816000875af1158015610f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e91906114de565b610fca5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516110199291906114c5565b60405180910390a45050505050505050565b600080808061103c85870187611679565b92975090955093509150506001600160a01b03841661105d5761105d6114af565b6001600160a01b038481166000908152603760205260409020541615611085576110856114af565b6036546040516bffffffffffffffffffffffff19606087901b1660208201526000916110d5916001600160a01b0390911690603401604051602081830303815290604052805190602001206111a9565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee869061112d908890889088908890600401611706565b600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b610d7d81611246565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166112405760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b0381168114610d7d57600080fd5b600080600080600060a0868803121561129457600080fd5b853561129f81611267565b945060208601356112af81611267565b935060408601356112bf81611267565b925060608601356112cf81611267565b915060808601356112df81611267565b809150509295509295909350565b6000602082840312156112ff57600080fd5b813561130a81611267565b9392505050565b60008060006060848603121561132657600080fd5b833561133181611267565b9250602084013561134181611267565b929592945050506040919091013590565b6000806000806060858703121561136857600080fd5b84359350602085013561137a81611267565b9250604085013567ffffffffffffffff8082111561139757600080fd5b818701915087601f8301126113ab57600080fd5b8135818111156113ba57600080fd5b8860208285010111156113cc57600080fd5b95989497505060200194505050565b600080604083850312156113ee57600080fd5b82356113f981611267565b946020939093013593505050565b6000808585111561141757600080fd5b8386111561142457600080fd5b5050820193919092039150565b8035602083101561124057600019602084900360031b1b1692915050565b60006020828403121561146157600080fd5b815161130a81611267565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156114f057600080fd5b8151801515811461130a57600080fd5b6000815180845260005b818110156115265760208185018101518683018201520161150a565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061156a90830184611500565b949350505050565b60208152600061130a6020830184611500565b6000806000806080858703121561159b57600080fd5b84356115a681611267565b935060208501356115b681611267565b925060408501356115c681611267565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126115fd57600080fd5b813567ffffffffffffffff80821115611618576116186115d6565b604051601f8301601f19908116603f01168101908282118183101715611640576116406115d6565b8160405283815286602085880101111561165957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561169157600080fd5b8535945060208601356116a381611267565b9350604086013567ffffffffffffffff808211156116c057600080fd5b6116cc89838a016115ec565b945060608801359150808211156116e257600080fd5b506116ef888289016115ec565b925050608086013560ff811681146112df57600080fd5b6001600160a01b038516815260806020820181905260009061172a90830186611500565b828103604084015261173c8186611500565b91505060ff831660608301529594505050505056fea2646970667358221220ab62d536b030923404efb7e5aabfc0a2fe40cb918bc51c862ac28b92f822139164736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d61018836600461127c565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f6102083660046112ed565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611311565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c1366004611352565b610474565b61018d6102d43660046113db565b610865565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610874565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836109c4565b505050565b6104aa604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b815250610d3a565b6034546001600160a01b031633146105155760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b61054b6040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b815250610d3a565b6035546001600160a01b038481169116146105b95760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b6105ef604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b815250610d3a565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161061e602060008486611407565b61062791611431565b0361071e576106626040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b815250610d3a565b610698604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b815250610d3a565b6106ad6106a88260208186611407565b610d80565b6106e36040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b815250610d3a565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b815250610d3a565b61085f565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61074d602060008486611407565b61075691611431565b036107d15761079160405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b815250610d3a565b61079b828261102b565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b815250610d3a565b6108086040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b815250610d3a565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6108708233836109c4565b5050565b6001600160a01b0385161580159061089457506001600160a01b03841615155b80156108a857506001600160a01b03831615155b80156108bc57506001600160a01b03821615155b6109185760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156109bd576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b600003610a285760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c919061144f565b6001600160a01b03818116600090815260376020526040902054919250858116911614610acb5760405162461bcd60e51b81526004016103409061146c565b6001600160a01b038116610ae157610ae16114af565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d919061144f565b6001600160a01b031614610b6357610b636114af565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610b9190339086906004016114c5565b6020604051808303816000875af1158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906114de565b610c205760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610cab9391169160c401611546565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610d2c9291906114c5565b60405180910390a450505050565b610d7d81604051602401610d4e9190611572565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526111a0565b50565b6000808080610d9185870187611585565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610dd45760405162461bcd60e51b81526004016103409061146c565b806001600160a01b03163b600003610dee57610dee6114af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e52919061144f565b9050856001600160a01b0316816001600160a01b031614610e7557610e756114af565b6001600160a01b038116610e8b57610e8b6114af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef7919061144f565b6001600160a01b031614610f0d57610f0d6114af565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f3b90879087906004016114c5565b6020604051808303816000875af1158015610f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e91906114de565b610fca5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516110199291906114c5565b60405180910390a45050505050505050565b600080808061103c85870187611679565b92975090955093509150506001600160a01b03841661105d5761105d6114af565b6001600160a01b038481166000908152603760205260409020541615611085576110856114af565b6036546040516bffffffffffffffffffffffff19606087901b1660208201526000916110d5916001600160a01b0390911690603401604051602081830303815290604052805190602001206111a9565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee869061112d908890889088908890600401611706565b600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b610d7d81611246565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166112405760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b0381168114610d7d57600080fd5b600080600080600060a0868803121561129457600080fd5b853561129f81611267565b945060208601356112af81611267565b935060408601356112bf81611267565b925060608601356112cf81611267565b915060808601356112df81611267565b809150509295509295909350565b6000602082840312156112ff57600080fd5b813561130a81611267565b9392505050565b60008060006060848603121561132657600080fd5b833561133181611267565b9250602084013561134181611267565b929592945050506040919091013590565b6000806000806060858703121561136857600080fd5b84359350602085013561137a81611267565b9250604085013567ffffffffffffffff8082111561139757600080fd5b818701915087601f8301126113ab57600080fd5b8135818111156113ba57600080fd5b8860208285010111156113cc57600080fd5b95989497505060200194505050565b600080604083850312156113ee57600080fd5b82356113f981611267565b946020939093013593505050565b6000808585111561141757600080fd5b8386111561142457600080fd5b5050820193919092039150565b8035602083101561124057600019602084900360031b1b1692915050565b60006020828403121561146157600080fd5b815161130a81611267565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156114f057600080fd5b8151801515811461130a57600080fd5b6000815180845260005b818110156115265760208185018101518683018201520161150a565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061156a90830184611500565b949350505050565b60208152600061130a6020830184611500565b6000806000806080858703121561159b57600080fd5b84356115a681611267565b935060208501356115b681611267565b925060408501356115c681611267565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126115fd57600080fd5b813567ffffffffffffffff80821115611618576116186115d6565b604051601f8301601f19908116603f01168101908282118183101715611640576116406115d6565b8160405283815286602085880101111561165957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561169157600080fd5b8535945060208601356116a381611267565b9350604086013567ffffffffffffffff808211156116c057600080fd5b6116cc89838a016115ec565b945060608801359150808211156116e257600080fd5b506116ef888289016115ec565b925050608086013560ff811681146112df57600080fd5b6001600160a01b038516815260806020820181905260009061172a90830186611500565b828103604084015261173c8186611500565b91505060ff831660608301529594505050505056fea2646970667358221220ab62d536b030923404efb7e5aabfc0a2fe40cb918bc51c862ac28b92f822139164736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC20PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20PredicateAccessList","sourceName":"contracts/child/ChildERC20PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611f2b806100206000396000f3fe608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e03660046118a0565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e561022836600461191f565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a76102833660046119c8565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b3660046119ec565b61068c565b6101e561031e366004611a09565b6106db565b6101e56103313660046119ec565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e5610385366004611a4a565b61073a565b6101e56103983660046119c8565b610b2b565b6101e56103ab366004611ad3565b610b9c565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611aff565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610bb3565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611aff565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610bb3565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610d04565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610d1d565b6106106000610d04565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610d04565b50565b610694610d1d565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610d77565b6106ee838383610d7f565b505050565b6106fb610d1d565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b610770604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b8152506110f6565b60fd546001600160a01b031633146107db5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b6108116040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b8152506110f6565b60fe546001600160a01b0384811691161461087f5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b6108b5604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b8152506110f6565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108e4602060008486611b71565b6108ed91611b9b565b036109e4576109286040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b8152506110f6565b61095e604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b8152506110f6565b61097361096e8260208186611b71565b611139565b6109a96040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b8152506110f6565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b8152506110f6565b610b25565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610a13602060008486611b71565b610a1c91611b9b565b03610a9757610a5760405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b8152506110f6565b610a6182826113e5565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b8152506110f6565b610ace6040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b8152506110f6565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610b33610d1d565b606580546001600160a01b0383166001600160a01b03199091168117909155610b646033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610ba4610d77565b610baf823383610d7f565b5050565b6001600160a01b03851615801590610bd357506001600160a01b03841615155b8015610be757506001600160a01b03831615155b8015610bfb57506001600160a01b03821615155b610c575760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610cfd576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b03191690556106898161155c565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b6106106115ae565b826001600160a01b03163b600003610de35760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e479190611bb9565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610e875760405162461bcd60e51b81526004016103fe90611bd6565b6001600160a01b038116610e9d57610e9d611c19565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f099190611bb9565b6001600160a01b031614610f1f57610f1f611c19565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610f4d9033908690600401611c2f565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190611c48565b610fdc5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110679391169160c401611cb5565b600060405180830381600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb2733866040516110e8929190611c2f565b60405180910390a450505050565b6106898160405160240161110a9190611ce1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526117c4565b600080808061114a85870187611cf4565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061118e5760405162461bcd60e51b81526004016103fe90611bd6565b806001600160a01b03163b6000036111a8576111a8611c19565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190611bb9565b9050856001600160a01b0316816001600160a01b03161461122f5761122f611c19565b6001600160a01b03811661124557611245611c19565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b19190611bb9565b6001600160a01b0316146112c7576112c7611c19565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112f59087908790600401611c2f565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113389190611c48565b6113845760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516113d3929190611c2f565b60405180910390a45050505050505050565b60008080806113f685870187611de8565b92975090955093509150506001600160a01b03841661141757611417611c19565b6001600160a01b0384811660009081526101006020526040902054161561144057611440611c19565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611490916001600160a01b0390911690603401604051602081830303815290604052805190602001206117cd565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee86906114e9908890889088908890600401611e75565b600060405180830381600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116b957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916116109190611ec0565b6000604051808303818686fa925050503d806000811461164c576040519150601f19603f3d011682016040523d82523d6000602084013e611651565b606091505b509150915081801561167657506000818060200190518101906116749190611edc565b115b6116b65760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916117209190611ec0565b6000604051808303818686fa925050503d806000811461175c576040519150601f19603f3d011682016040523d82523d6000602084013e611761565b606091505b50915091508180156117875750808060200190518101906117829190611edc565b600114155b610baf5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6106898161186a565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118645760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461068957600080fd5b600080600080600060a086880312156118b857600080fd5b85356118c38161188b565b945060208601356118d38161188b565b935060408601356118e38161188b565b925060608601356118f38161188b565b915060808601356119038161188b565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b03121561193c57600080fd5b88356119478161188b565b975060208901356119578161188b565b965060408901356119678161188b565b955060608901356119778161188b565b945060808901356119878161188b565b935060a089013561199781611911565b925060c08901356119a781611911565b915060e08901356119b78161188b565b809150509295985092959890939650565b6000602082840312156119da57600080fd5b81356119e58161188b565b9392505050565b6000602082840312156119fe57600080fd5b81356119e581611911565b600080600060608486031215611a1e57600080fd5b8335611a298161188b565b92506020840135611a398161188b565b929592945050506040919091013590565b60008060008060608587031215611a6057600080fd5b843593506020850135611a728161188b565b9250604085013567ffffffffffffffff80821115611a8f57600080fd5b818701915087601f830112611aa357600080fd5b813581811115611ab257600080fd5b886020828501011115611ac457600080fd5b95989497505060200194505050565b60008060408385031215611ae657600080fd5b8235611af18161188b565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611b8157600080fd5b83861115611b8e57600080fd5b5050820193919092039150565b8035602083101561186457600019602084900360031b1b1692915050565b600060208284031215611bcb57600080fd5b81516119e58161188b565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060208284031215611c5a57600080fd5b81516119e581611911565b60005b83811015611c80578181015183820152602001611c68565b50506000910152565b60008151808452611ca1816020860160208601611c65565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611cd990830184611c89565b949350505050565b6020815260006119e56020830184611c89565b60008060008060808587031215611d0a57600080fd5b8435611d158161188b565b93506020850135611d258161188b565b92506040850135611d358161188b565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d6c57600080fd5b813567ffffffffffffffff80821115611d8757611d87611d45565b604051601f8301601f19908116603f01168101908282118183101715611daf57611daf611d45565b81604052838152866020858801011115611dc857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611e0057600080fd5b853594506020860135611e128161188b565b9350604086013567ffffffffffffffff80821115611e2f57600080fd5b611e3b89838a01611d5b565b94506060880135915080821115611e5157600080fd5b50611e5e88828901611d5b565b925050608086013560ff8116811461190357600080fd5b6001600160a01b0385168152608060208201819052600090611e9990830186611c89565b8281036040840152611eab8186611c89565b91505060ff8316606083015295945050505050565b60008251611ed2818460208701611c65565b9190910192915050565b600060208284031215611eee57600080fd5b505191905056fea26469706673582212205618dec3166c9a39a417717e4fa60b32a5b16648711fc3252ae9981457c3d6e864736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e03660046118a0565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e561022836600461191f565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a76102833660046119c8565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b3660046119ec565b61068c565b6101e561031e366004611a09565b6106db565b6101e56103313660046119ec565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e5610385366004611a4a565b61073a565b6101e56103983660046119c8565b610b2b565b6101e56103ab366004611ad3565b610b9c565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611aff565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610bb3565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611aff565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610bb3565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610d04565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610d1d565b6106106000610d04565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610d04565b50565b610694610d1d565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610d77565b6106ee838383610d7f565b505050565b6106fb610d1d565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b610770604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b8152506110f6565b60fd546001600160a01b031633146107db5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b6108116040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b8152506110f6565b60fe546001600160a01b0384811691161461087f5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b6108b5604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b8152506110f6565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108e4602060008486611b71565b6108ed91611b9b565b036109e4576109286040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b8152506110f6565b61095e604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b8152506110f6565b61097361096e8260208186611b71565b611139565b6109a96040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b8152506110f6565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b8152506110f6565b610b25565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610a13602060008486611b71565b610a1c91611b9b565b03610a9757610a5760405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b8152506110f6565b610a6182826113e5565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b8152506110f6565b610ace6040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b8152506110f6565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610b33610d1d565b606580546001600160a01b0383166001600160a01b03199091168117909155610b646033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610ba4610d77565b610baf823383610d7f565b5050565b6001600160a01b03851615801590610bd357506001600160a01b03841615155b8015610be757506001600160a01b03831615155b8015610bfb57506001600160a01b03821615155b610c575760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610cfd576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b03191690556106898161155c565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b6106106115ae565b826001600160a01b03163b600003610de35760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e479190611bb9565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610e875760405162461bcd60e51b81526004016103fe90611bd6565b6001600160a01b038116610e9d57610e9d611c19565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f099190611bb9565b6001600160a01b031614610f1f57610f1f611c19565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610f4d9033908690600401611c2f565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190611c48565b610fdc5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110679391169160c401611cb5565b600060405180830381600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb2733866040516110e8929190611c2f565b60405180910390a450505050565b6106898160405160240161110a9190611ce1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526117c4565b600080808061114a85870187611cf4565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061118e5760405162461bcd60e51b81526004016103fe90611bd6565b806001600160a01b03163b6000036111a8576111a8611c19565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190611bb9565b9050856001600160a01b0316816001600160a01b03161461122f5761122f611c19565b6001600160a01b03811661124557611245611c19565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b19190611bb9565b6001600160a01b0316146112c7576112c7611c19565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112f59087908790600401611c2f565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113389190611c48565b6113845760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516113d3929190611c2f565b60405180910390a45050505050505050565b60008080806113f685870187611de8565b92975090955093509150506001600160a01b03841661141757611417611c19565b6001600160a01b0384811660009081526101006020526040902054161561144057611440611c19565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611490916001600160a01b0390911690603401604051602081830303815290604052805190602001206117cd565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee86906114e9908890889088908890600401611e75565b600060405180830381600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116b957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916116109190611ec0565b6000604051808303818686fa925050503d806000811461164c576040519150601f19603f3d011682016040523d82523d6000602084013e611651565b606091505b509150915081801561167657506000818060200190518101906116749190611edc565b115b6116b65760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916117209190611ec0565b6000604051808303818686fa925050503d806000811461175c576040519150601f19603f3d011682016040523d82523d6000602084013e611761565b606091505b50915091508180156117875750808060200190518101906117829190611edc565b600114155b610baf5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6106898161186a565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118645760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461068957600080fd5b600080600080600060a086880312156118b857600080fd5b85356118c38161188b565b945060208601356118d38161188b565b935060408601356118e38161188b565b925060608601356118f38161188b565b915060808601356119038161188b565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b03121561193c57600080fd5b88356119478161188b565b975060208901356119578161188b565b965060408901356119678161188b565b955060608901356119778161188b565b945060808901356119878161188b565b935060a089013561199781611911565b925060c08901356119a781611911565b915060e08901356119b78161188b565b809150509295985092959890939650565b6000602082840312156119da57600080fd5b81356119e58161188b565b9392505050565b6000602082840312156119fe57600080fd5b81356119e581611911565b600080600060608486031215611a1e57600080fd5b8335611a298161188b565b92506020840135611a398161188b565b929592945050506040919091013590565b60008060008060608587031215611a6057600080fd5b843593506020850135611a728161188b565b9250604085013567ffffffffffffffff80821115611a8f57600080fd5b818701915087601f830112611aa357600080fd5b813581811115611ab257600080fd5b886020828501011115611ac457600080fd5b95989497505060200194505050565b60008060408385031215611ae657600080fd5b8235611af18161188b565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611b8157600080fd5b83861115611b8e57600080fd5b5050820193919092039150565b8035602083101561186457600019602084900360031b1b1692915050565b600060208284031215611bcb57600080fd5b81516119e58161188b565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060208284031215611c5a57600080fd5b81516119e581611911565b60005b83811015611c80578181015183820152602001611c68565b50506000910152565b60008151808452611ca1816020860160208601611c65565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611cd990830184611c89565b949350505050565b6020815260006119e56020830184611c89565b60008060008060808587031215611d0a57600080fd5b8435611d158161188b565b93506020850135611d258161188b565b92506040850135611d358161188b565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d6c57600080fd5b813567ffffffffffffffff80821115611d8757611d87611d45565b604051601f8301601f19908116603f01168101908282118183101715611daf57611daf611d45565b81604052838152866020858801011115611dc857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611e0057600080fd5b853594506020860135611e128161188b565b9350604086013567ffffffffffffffff80821115611e2f57600080fd5b611e3b89838a01611d5b565b94506060880135915080821115611e5157600080fd5b50611e5e88828901611d5b565b925050608086013560ff8116811461190357600080fd5b6001600160a01b0385168152608060208201819052600090611e9990830186611c89565b8281036040840152611eab8186611c89565b91505060ff8316606083015295945050505050565b60008251611ed2818460208701611c65565b9190910192915050565b600060208284031215611eee57600080fd5b505191905056fea26469706673582212205618dec3166c9a39a417717e4fa60b32a5b16648711fc3252ae9981457c3d6e864736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC20PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC20Predicate","sourceName":"contracts/child/RootMintableERC20Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061149f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806397e5230d116100b8578063e0563ab11161007c578063e0563ab1146102a2578063eeb49945146102ab578063f213159c146102be578063f4a120f7146102d1578063f6451255146102e4578063f8c8765e1461030b57600080fd5b806397e5230d14610224578063b17680651461022e578063b68ad1e414610255578063d41f177114610268578063d57184e41461028f57600080fd5b806347e7ef241161010a57806347e7ef24146101aa57806351351d53146101bf57806355b01e4d146101cd5780635ea5df79146101db5780637efab4f5146101f2578063947287cf1461021b57600080fd5b806305dc2e8f1461014757806307b3e252146101775780631bc114ba14610185578063284017f5146101985780633b878c22146101a1575b600080fd5b60345461015a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015a6004600360981b0181565b60335461015a906001600160a01b031681565b61015a61202081565b61015a61101081565b6101bd6101b8366004611038565b61031e565b005b61015a6002600160a01b0381565b61015a6004600160991b0181565b6101e461138881565b60405190815260200161016e565b61015a610200366004611064565b6037602052600090815260409020546001600160a01b031681565b6101e461520881565b6101e4620249f081565b6101e47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461015a906001600160a01b031681565b6101e47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60355461015a906001600160a01b031681565b61015a61203081565b6101bd6102b9366004611088565b61032d565b6101bd6102cc366004611111565b6104d5565b61015a6102df366004611064565b6104e5565b6101e47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6101bd610319366004611152565b6108b1565b610329823383610a0e565b5050565b6034546001600160a01b031633146103a45760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461041a5760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b606482015260840161039b565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696104496020600084866111ae565b610452916111d8565b036104715761046c61046782602081866111ae565b610b7e565b6104cf565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b606482015260840161039b565b50505050565b6104e0838383610a0e565b505050565b60006001600160a01b03821661054f5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b606482015260840161039b565b6001600160a01b0382811660009081526037602052604090205416156105ca5760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b606482015260840161039b565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261067892911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610710573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107389190810190611231565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610776573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261079e9190810190611231565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080091906112d3565b604051602001610814959493929190611322565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610840929190611374565b600060405180830381600087803b15801561085a57600080fd5b505af115801561086e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b03146108f55760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161039b565b600054610100900460ff16158080156109155750600054600160ff909116105b8061092f5750303b15801561092f575060005460ff166001145b6109925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161039b565b6000805460ff1916600117905580156109b5576000805461ff0019166101001790555b6109c185858585610c36565b8015610a07576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6001600160a01b038084166000908152603760205260409020541680610a3a57610a37846104e5565b90505b6001600160a01b038116610a5057610a50611398565b610a656001600160a01b038516333085610d31565b603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610af09391169160c401611374565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610b719291906113ae565b60405180910390a46104cf565b6000808080610b8f858701876113c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610bc257610bc2611398565b610bd66001600160a01b0386168484610d9c565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee88786604051610c259291906113ae565b60405180910390a450505050505050565b6001600160a01b03841615801590610c5657506001600160a01b03831615155b8015610c6a57506001600160a01b03821615155b8015610c7e57506001600160a01b03811615155b610ce15760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b606482015260840161039b565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6040516001600160a01b03808516602483015283166044820152606481018290526104cf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610dbb565b6104e08363a9059cbb60e01b8484604051602401610d659291906113ae565b6000610e10826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e909092919063ffffffff16565b9050805160001480610e31575080806020019051810190610e319190611418565b6104e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161039b565b6060610e9f8484600085610ea7565b949350505050565b606082471015610f085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161039b565b600080866001600160a01b03168587604051610f24919061143a565b60006040518083038185875af1925050503d8060008114610f61576040519150601f19603f3d011682016040523d82523d6000602084013e610f66565b606091505b5091509150610f7787838387610f82565b979650505050505050565b60608315610ff1578251600003610fea576001600160a01b0385163b610fea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161039b565b5081610e9f565b610e9f83838151156110065781518083602001fd5b8060405162461bcd60e51b815260040161039b9190611456565b6001600160a01b038116811461103557600080fd5b50565b6000806040838503121561104b57600080fd5b823561105681611020565b946020939093013593505050565b60006020828403121561107657600080fd5b813561108181611020565b9392505050565b6000806000806060858703121561109e57600080fd5b8435935060208501356110b081611020565b9250604085013567ffffffffffffffff808211156110cd57600080fd5b818701915087601f8301126110e157600080fd5b8135818111156110f057600080fd5b88602082850101111561110257600080fd5b95989497505060200194505050565b60008060006060848603121561112657600080fd5b833561113181611020565b9250602084013561114181611020565b929592945050506040919091013590565b6000806000806080858703121561116857600080fd5b843561117381611020565b9350602085013561118381611020565b9250604085013561119381611020565b915060608501356111a381611020565b939692955090935050565b600080858511156111be57600080fd5b838611156111cb57600080fd5b5050820193919092039150565b803560208310156111f157600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611228578181015183820152602001611210565b50506000910152565b60006020828403121561124357600080fd5b815167ffffffffffffffff8082111561125b57600080fd5b818401915084601f83011261126f57600080fd5b815181811115611281576112816111f7565b604051601f8201601f19908116603f011681019083821181831017156112a9576112a96111f7565b816040528281528760208487010111156112c257600080fd5b610f7783602083016020880161120d565b6000602082840312156112e557600080fd5b815160ff8116811461108157600080fd5b6000815180845261130e81602086016020860161120d565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a06040820181905260009061134c908301866112f6565b828103606084015261135e81866112f6565b91505060ff831660808301529695505050505050565b6001600160a01b0383168152604060208201819052600090610e9f908301846112f6565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156113dd57600080fd5b84356113e881611020565b935060208501356113f881611020565b9250604085013561140881611020565b9396929550929360600135925050565b60006020828403121561142a57600080fd5b8151801515811461108157600080fd5b6000825161144c81846020870161120d565b9190910192915050565b60208152600061108160208301846112f656fea264697066735822122084ec8ad36f0d03abcfc5bde4447836ff970764edfea496ff308f22046530682b64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101425760003560e01c806397e5230d116100b8578063e0563ab11161007c578063e0563ab1146102a2578063eeb49945146102ab578063f213159c146102be578063f4a120f7146102d1578063f6451255146102e4578063f8c8765e1461030b57600080fd5b806397e5230d14610224578063b17680651461022e578063b68ad1e414610255578063d41f177114610268578063d57184e41461028f57600080fd5b806347e7ef241161010a57806347e7ef24146101aa57806351351d53146101bf57806355b01e4d146101cd5780635ea5df79146101db5780637efab4f5146101f2578063947287cf1461021b57600080fd5b806305dc2e8f1461014757806307b3e252146101775780631bc114ba14610185578063284017f5146101985780633b878c22146101a1575b600080fd5b60345461015a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015a6004600360981b0181565b60335461015a906001600160a01b031681565b61015a61202081565b61015a61101081565b6101bd6101b8366004611038565b61031e565b005b61015a6002600160a01b0381565b61015a6004600160991b0181565b6101e461138881565b60405190815260200161016e565b61015a610200366004611064565b6037602052600090815260409020546001600160a01b031681565b6101e461520881565b6101e4620249f081565b6101e47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461015a906001600160a01b031681565b6101e47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60355461015a906001600160a01b031681565b61015a61203081565b6101bd6102b9366004611088565b61032d565b6101bd6102cc366004611111565b6104d5565b61015a6102df366004611064565b6104e5565b6101e47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6101bd610319366004611152565b6108b1565b610329823383610a0e565b5050565b6034546001600160a01b031633146103a45760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461041a5760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b606482015260840161039b565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696104496020600084866111ae565b610452916111d8565b036104715761046c61046782602081866111ae565b610b7e565b6104cf565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b606482015260840161039b565b50505050565b6104e0838383610a0e565b505050565b60006001600160a01b03821661054f5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b606482015260840161039b565b6001600160a01b0382811660009081526037602052604090205416156105ca5760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b606482015260840161039b565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261067892911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610710573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107389190810190611231565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610776573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261079e9190810190611231565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080091906112d3565b604051602001610814959493929190611322565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610840929190611374565b600060405180830381600087803b15801561085a57600080fd5b505af115801561086e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b03146108f55760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161039b565b600054610100900460ff16158080156109155750600054600160ff909116105b8061092f5750303b15801561092f575060005460ff166001145b6109925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161039b565b6000805460ff1916600117905580156109b5576000805461ff0019166101001790555b6109c185858585610c36565b8015610a07576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6001600160a01b038084166000908152603760205260409020541680610a3a57610a37846104e5565b90505b6001600160a01b038116610a5057610a50611398565b610a656001600160a01b038516333085610d31565b603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610af09391169160c401611374565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610b719291906113ae565b60405180910390a46104cf565b6000808080610b8f858701876113c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610bc257610bc2611398565b610bd66001600160a01b0386168484610d9c565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee88786604051610c259291906113ae565b60405180910390a450505050505050565b6001600160a01b03841615801590610c5657506001600160a01b03831615155b8015610c6a57506001600160a01b03821615155b8015610c7e57506001600160a01b03811615155b610ce15760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b606482015260840161039b565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6040516001600160a01b03808516602483015283166044820152606481018290526104cf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610dbb565b6104e08363a9059cbb60e01b8484604051602401610d659291906113ae565b6000610e10826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e909092919063ffffffff16565b9050805160001480610e31575080806020019051810190610e319190611418565b6104e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161039b565b6060610e9f8484600085610ea7565b949350505050565b606082471015610f085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161039b565b600080866001600160a01b03168587604051610f24919061143a565b60006040518083038185875af1925050503d8060008114610f61576040519150601f19603f3d011682016040523d82523d6000602084013e610f66565b606091505b5091509150610f7787838387610f82565b979650505050505050565b60608315610ff1578251600003610fea576001600160a01b0385163b610fea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161039b565b5081610e9f565b610e9f83838151156110065781518083602001fd5b8060405162461bcd60e51b815260040161039b9190611456565b6001600160a01b038116811461103557600080fd5b50565b6000806040838503121561104b57600080fd5b823561105681611020565b946020939093013593505050565b60006020828403121561107657600080fd5b813561108181611020565b9392505050565b6000806000806060858703121561109e57600080fd5b8435935060208501356110b081611020565b9250604085013567ffffffffffffffff808211156110cd57600080fd5b818701915087601f8301126110e157600080fd5b8135818111156110f057600080fd5b88602082850101111561110257600080fd5b95989497505060200194505050565b60008060006060848603121561112657600080fd5b833561113181611020565b9250602084013561114181611020565b929592945050506040919091013590565b6000806000806080858703121561116857600080fd5b843561117381611020565b9350602085013561118381611020565b9250604085013561119381611020565b915060608501356111a381611020565b939692955090935050565b600080858511156111be57600080fd5b838611156111cb57600080fd5b5050820193919092039150565b803560208310156111f157600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611228578181015183820152602001611210565b50506000910152565b60006020828403121561124357600080fd5b815167ffffffffffffffff8082111561125b57600080fd5b818401915084601f83011261126f57600080fd5b815181811115611281576112816111f7565b604051601f8201601f19908116603f011681019083821181831017156112a9576112a96111f7565b816040528281528760208487010111156112c257600080fd5b610f7783602083016020880161120d565b6000602082840312156112e557600080fd5b815160ff8116811461108157600080fd5b6000815180845261130e81602086016020860161120d565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a06040820181905260009061134c908301866112f6565b828103606084015261135e81866112f6565b91505060ff831660808301529695505050505050565b6001600160a01b0383168152604060208201819052600090610e9f908301846112f6565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156113dd57600080fd5b84356113e881611020565b935060208501356113f881611020565b9250604085013561140881611020565b9396929550929360600135925050565b60006020828403121561142a57600080fd5b8151801515811461108157600080fd5b6000825161144c81846020870161120d565b9190910192915050565b60208152600061108160208301846112f656fea264697066735822122084ec8ad36f0d03abcfc5bde4447836ff970764edfea496ff308f22046530682b64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC20PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC20PredicateAccessList","sourceName":"contracts/child/RootMintableERC20PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611bfb806100206000396000f3fe608060405234801561001057600080fd5b506004361061019a5760003560e01c8063b1768065116100e4578063e0563ab111610092578063e0563ab114610355578063e30c39781461035e578063eeb499451461036f578063f213159c14610382578063f2fde38b14610395578063f4a120f7146103a8578063f6451255146103bb578063f8c8765e146103e257600080fd5b8063b1768065146102a8578063b68ad1e4146102cf578063c1225a20146102e2578063c5e4683a146102f5578063d41f177114610308578063d57184e41461032f578063d8dd17731461034257600080fd5b806355b01e4d1161014c57806355b01e4d146102255780635ea5df7914610233578063715018a61461024a57806379ba5097146102525780637efab4f51461025a5780638da5cb5b14610284578063947287cf1461029557806397e5230d1461029e57600080fd5b806305dc2e8f1461019f57806307b3e252146101cf5780631bc114ba146101dd578063284017f5146101f05780633b878c22146101f957806347e7ef241461020257806351351d5314610217575b600080fd5b60fd546101b2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101b26004600360981b0181565b60fc546101b2906001600160a01b031681565b6101b261202081565b6101b261101081565b61021561021036600461164d565b6103f5565b005b6101b26002600160a01b0381565b6101b26004600160991b0181565b61023c61138881565b6040519081526020016101c6565b610215610404565b610215610418565b6101b2610268366004611679565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101b2565b61023c61520881565b61023c620249f081565b61023c7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101b2906001600160a01b031681565b6102156102f03660046116ab565b610497565b6102156103033660046116ab565b6104e6565b61023c7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60fe546101b2906001600160a01b031681565b6102156103503660046116c8565b61052d565b6101b261203081565b6065546001600160a01b03166101b2565b61021561037d36600461175e565b61064e565b6102156103903660046117e7565b6107f1565b6102156103a3366004611679565b610801565b6101b26103b6366004611679565b610872565b61023c7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102156103f0366004611828565b610c40565b610400823383610d39565b5050565b61040c610eb2565b6104166000610f0c565b565b60655433906001600160a01b0316811461048b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61049481610f0c565b50565b61049f610eb2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6104ee610eb2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105545760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff16158080156105745750600054600160ff909116105b8061058e5750303b15801561058e575060005460ff166001145b6105aa5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff1916600117905580156105cd576000805461ff0019166101001790555b6105d988888888610f25565b60c9805461ffff191685151561ff00191617610100851515021790556105fe82610f0c565b8015610644576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146106c05760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b6064820152608401610482565b60fe546001600160a01b038481169116146107365760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b6064820152608401610482565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696107656020600084866118f6565b61076e91611920565b0361078d5761078861078382602081866118f6565b611020565b6107eb565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b6064820152608401610482565b50505050565b6107fc838383610d39565b505050565b610809610eb2565b606580546001600160a01b0383166001600160a01b0319909116811790915561083a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166108dc5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b6064820152608401610482565b6001600160a01b038281166000908152610100602052604090205416156109585760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b6064820152608401610482565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610a0692911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610a9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ac79190810190611979565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b05573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b2d9190810190611979565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f9190611a1b565b604051602001610ba3959493929190611a6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bcf929190611abc565b600060405180830381600087803b158015610be957600080fd5b505af1158015610bfd573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610c675760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff1615808015610c875750600054600160ff909116105b80610ca15750303b158015610ca1575060005460ff166001145b610cbd5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff191660011790558015610ce0576000805461ff0019166101001790555b610cec85858585610f25565b8015610d32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610d416110d9565b6001600160a01b03808416600090815261010060205260409020541680610d6e57610d6b84610872565b90505b6001600160a01b038116610d8457610d84611ae0565b610d996001600160a01b0385163330856110e1565b60fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e249391169160c401611abc565b600060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610ea5929190611af6565b60405180910390a46107eb565b6033546001600160a01b031633146104165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610482565b606580546001600160a01b03191690556104948161114c565b6001600160a01b03841615801590610f4557506001600160a01b03831615155b8015610f5957506001600160a01b03821615155b8015610f6d57506001600160a01b03811615155b610fd05760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b6064820152608401610482565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061103185870187611b0f565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061106557611065611ae0565b6110796001600160a01b038616848461119e565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee887866040516110c8929190611af6565b60405180910390a450505050505050565b6104166111bd565b6040516001600160a01b03808516602483015283166044820152606481018290526107eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526113d3565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107fc8363a9059cbb60e01b8484604051602401611115929190611af6565b60c95460ff16156112c857604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161121f9190611b60565b6000604051808303818686fa925050503d806000811461125b576040519150601f19603f3d011682016040523d82523d6000602084013e611260565b606091505b509150915081801561128557506000818060200190518101906112839190611b7c565b115b6112c55760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610482565b50505b60c954610100900460ff161561041657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161132f9190611b60565b6000604051808303818686fa925050503d806000811461136b576040519150601f19603f3d011682016040523d82523d6000602084013e611370565b606091505b50915091508180156113965750808060200190518101906113919190611b7c565b600114155b6104005760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610482565b6000611428826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114a89092919063ffffffff16565b90508051600014806114495750808060200190518101906114499190611b95565b6107fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610482565b60606114b784846000856114bf565b949350505050565b6060824710156115205760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610482565b600080866001600160a01b0316858760405161153c9190611b60565b60006040518083038185875af1925050503d8060008114611579576040519150601f19603f3d011682016040523d82523d6000602084013e61157e565b606091505b509150915061158f8783838761159a565b979650505050505050565b60608315611609578251600003611602576001600160a01b0385163b6116025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610482565b50816114b7565b6114b7838381511561161e5781518083602001fd5b8060405162461bcd60e51b81526004016104829190611bb2565b6001600160a01b038116811461049457600080fd5b6000806040838503121561166057600080fd5b823561166b81611638565b946020939093013593505050565b60006020828403121561168b57600080fd5b813561169681611638565b9392505050565b801515811461049457600080fd5b6000602082840312156116bd57600080fd5b81356116968161169d565b600080600080600080600060e0888a0312156116e357600080fd5b87356116ee81611638565b965060208801356116fe81611638565b9550604088013561170e81611638565b9450606088013561171e81611638565b9350608088013561172e8161169d565b925060a088013561173e8161169d565b915060c088013561174e81611638565b8091505092959891949750929550565b6000806000806060858703121561177457600080fd5b84359350602085013561178681611638565b9250604085013567ffffffffffffffff808211156117a357600080fd5b818701915087601f8301126117b757600080fd5b8135818111156117c657600080fd5b8860208285010111156117d857600080fd5b95989497505060200194505050565b6000806000606084860312156117fc57600080fd5b833561180781611638565b9250602084013561181781611638565b929592945050506040919091013590565b6000806000806080858703121561183e57600080fd5b843561184981611638565b9350602085013561185981611638565b9250604085013561186981611638565b9150606085013561187981611638565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561190657600080fd5b8386111561191357600080fd5b5050820193919092039150565b8035602083101561193957600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611970578181015183820152602001611958565b50506000910152565b60006020828403121561198b57600080fd5b815167ffffffffffffffff808211156119a357600080fd5b818401915084601f8301126119b757600080fd5b8151818111156119c9576119c961193f565b604051601f8201601f19908116603f011681019083821181831017156119f1576119f161193f565b81604052828152876020848701011115611a0a57600080fd5b61158f836020830160208801611955565b600060208284031215611a2d57600080fd5b815160ff8116811461169657600080fd5b60008151808452611a56816020860160208601611955565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a060408201819052600090611a9490830186611a3e565b8281036060840152611aa68186611a3e565b91505060ff831660808301529695505050505050565b6001600160a01b03831681526040602082018190526000906114b790830184611a3e565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b2557600080fd5b8435611b3081611638565b93506020850135611b4081611638565b92506040850135611b5081611638565b9396929550929360600135925050565b60008251611b72818460208701611955565b9190910192915050565b600060208284031215611b8e57600080fd5b5051919050565b600060208284031215611ba757600080fd5b81516116968161169d565b6020815260006116966020830184611a3e56fea2646970667358221220176d1307d83cd6036f83b91e4ae24d7832bdefc3a6d526f5cfd719424ef4671864736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061019a5760003560e01c8063b1768065116100e4578063e0563ab111610092578063e0563ab114610355578063e30c39781461035e578063eeb499451461036f578063f213159c14610382578063f2fde38b14610395578063f4a120f7146103a8578063f6451255146103bb578063f8c8765e146103e257600080fd5b8063b1768065146102a8578063b68ad1e4146102cf578063c1225a20146102e2578063c5e4683a146102f5578063d41f177114610308578063d57184e41461032f578063d8dd17731461034257600080fd5b806355b01e4d1161014c57806355b01e4d146102255780635ea5df7914610233578063715018a61461024a57806379ba5097146102525780637efab4f51461025a5780638da5cb5b14610284578063947287cf1461029557806397e5230d1461029e57600080fd5b806305dc2e8f1461019f57806307b3e252146101cf5780631bc114ba146101dd578063284017f5146101f05780633b878c22146101f957806347e7ef241461020257806351351d5314610217575b600080fd5b60fd546101b2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101b26004600360981b0181565b60fc546101b2906001600160a01b031681565b6101b261202081565b6101b261101081565b61021561021036600461164d565b6103f5565b005b6101b26002600160a01b0381565b6101b26004600160991b0181565b61023c61138881565b6040519081526020016101c6565b610215610404565b610215610418565b6101b2610268366004611679565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101b2565b61023c61520881565b61023c620249f081565b61023c7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101b2906001600160a01b031681565b6102156102f03660046116ab565b610497565b6102156103033660046116ab565b6104e6565b61023c7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60fe546101b2906001600160a01b031681565b6102156103503660046116c8565b61052d565b6101b261203081565b6065546001600160a01b03166101b2565b61021561037d36600461175e565b61064e565b6102156103903660046117e7565b6107f1565b6102156103a3366004611679565b610801565b6101b26103b6366004611679565b610872565b61023c7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102156103f0366004611828565b610c40565b610400823383610d39565b5050565b61040c610eb2565b6104166000610f0c565b565b60655433906001600160a01b0316811461048b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61049481610f0c565b50565b61049f610eb2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6104ee610eb2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105545760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff16158080156105745750600054600160ff909116105b8061058e5750303b15801561058e575060005460ff166001145b6105aa5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff1916600117905580156105cd576000805461ff0019166101001790555b6105d988888888610f25565b60c9805461ffff191685151561ff00191617610100851515021790556105fe82610f0c565b8015610644576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146106c05760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b6064820152608401610482565b60fe546001600160a01b038481169116146107365760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b6064820152608401610482565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696107656020600084866118f6565b61076e91611920565b0361078d5761078861078382602081866118f6565b611020565b6107eb565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b6064820152608401610482565b50505050565b6107fc838383610d39565b505050565b610809610eb2565b606580546001600160a01b0383166001600160a01b0319909116811790915561083a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166108dc5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b6064820152608401610482565b6001600160a01b038281166000908152610100602052604090205416156109585760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b6064820152608401610482565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610a0692911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610a9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ac79190810190611979565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b05573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b2d9190810190611979565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f9190611a1b565b604051602001610ba3959493929190611a6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bcf929190611abc565b600060405180830381600087803b158015610be957600080fd5b505af1158015610bfd573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610c675760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff1615808015610c875750600054600160ff909116105b80610ca15750303b158015610ca1575060005460ff166001145b610cbd5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff191660011790558015610ce0576000805461ff0019166101001790555b610cec85858585610f25565b8015610d32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610d416110d9565b6001600160a01b03808416600090815261010060205260409020541680610d6e57610d6b84610872565b90505b6001600160a01b038116610d8457610d84611ae0565b610d996001600160a01b0385163330856110e1565b60fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e249391169160c401611abc565b600060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610ea5929190611af6565b60405180910390a46107eb565b6033546001600160a01b031633146104165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610482565b606580546001600160a01b03191690556104948161114c565b6001600160a01b03841615801590610f4557506001600160a01b03831615155b8015610f5957506001600160a01b03821615155b8015610f6d57506001600160a01b03811615155b610fd05760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b6064820152608401610482565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061103185870187611b0f565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061106557611065611ae0565b6110796001600160a01b038616848461119e565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee887866040516110c8929190611af6565b60405180910390a450505050505050565b6104166111bd565b6040516001600160a01b03808516602483015283166044820152606481018290526107eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526113d3565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107fc8363a9059cbb60e01b8484604051602401611115929190611af6565b60c95460ff16156112c857604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161121f9190611b60565b6000604051808303818686fa925050503d806000811461125b576040519150601f19603f3d011682016040523d82523d6000602084013e611260565b606091505b509150915081801561128557506000818060200190518101906112839190611b7c565b115b6112c55760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610482565b50505b60c954610100900460ff161561041657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161132f9190611b60565b6000604051808303818686fa925050503d806000811461136b576040519150601f19603f3d011682016040523d82523d6000602084013e611370565b606091505b50915091508180156113965750808060200190518101906113919190611b7c565b600114155b6104005760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610482565b6000611428826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114a89092919063ffffffff16565b90508051600014806114495750808060200190518101906114499190611b95565b6107fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610482565b60606114b784846000856114bf565b949350505050565b6060824710156115205760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610482565b600080866001600160a01b0316858760405161153c9190611b60565b60006040518083038185875af1925050503d8060008114611579576040519150601f19603f3d011682016040523d82523d6000602084013e61157e565b606091505b509150915061158f8783838761159a565b979650505050505050565b60608315611609578251600003611602576001600160a01b0385163b6116025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610482565b50816114b7565b6114b7838381511561161e5781518083602001fd5b8060405162461bcd60e51b81526004016104829190611bb2565b6001600160a01b038116811461049457600080fd5b6000806040838503121561166057600080fd5b823561166b81611638565b946020939093013593505050565b60006020828403121561168b57600080fd5b813561169681611638565b9392505050565b801515811461049457600080fd5b6000602082840312156116bd57600080fd5b81356116968161169d565b600080600080600080600060e0888a0312156116e357600080fd5b87356116ee81611638565b965060208801356116fe81611638565b9550604088013561170e81611638565b9450606088013561171e81611638565b9350608088013561172e8161169d565b925060a088013561173e8161169d565b915060c088013561174e81611638565b8091505092959891949750929550565b6000806000806060858703121561177457600080fd5b84359350602085013561178681611638565b9250604085013567ffffffffffffffff808211156117a357600080fd5b818701915087601f8301126117b757600080fd5b8135818111156117c657600080fd5b8860208285010111156117d857600080fd5b95989497505060200194505050565b6000806000606084860312156117fc57600080fd5b833561180781611638565b9250602084013561181781611638565b929592945050506040919091013590565b6000806000806080858703121561183e57600080fd5b843561184981611638565b9350602085013561185981611638565b9250604085013561186981611638565b9150606085013561187981611638565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561190657600080fd5b8386111561191357600080fd5b5050820193919092039150565b8035602083101561193957600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611970578181015183820152602001611958565b50506000910152565b60006020828403121561198b57600080fd5b815167ffffffffffffffff808211156119a357600080fd5b818401915084601f8301126119b757600080fd5b8151818111156119c9576119c961193f565b604051601f8201601f19908116603f011681019083821181831017156119f1576119f161193f565b81604052828152876020848701011115611a0a57600080fd5b61158f836020830160208801611955565b600060208284031215611a2d57600080fd5b815160ff8116811461169657600080fd5b60008151808452611a56816020860160208601611955565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a060408201819052600090611a9490830186611a3e565b8281036060840152611aa68186611a3e565b91505060ff831660808301529695505050505050565b6001600160a01b03831681526040602082018190526000906114b790830184611a3e565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b2557600080fd5b8435611b3081611638565b93506020850135611b4081611638565b92506040850135611b5081611638565b9396929550929360600135925050565b60008251611b72818460208701611955565b9190910192915050565b600060208284031215611b8e57600080fd5b5051919050565b600060208284031215611ba757600080fd5b81516116968161169d565b6020815260006116966020830184611a3e56fea2646970667358221220176d1307d83cd6036f83b91e4ae24d7832bdefc3a6d526f5cfd719424ef4671864736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var ChildERC721Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721","sourceName":"contracts/child/ChildERC721.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"invalidateNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612488806100206000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a22cb4651161007c578063a22cb465146102de578063b2dc5dc3146102f1578063b88d4fde14610304578063c87b56dd14610317578063e61987051461032a578063e985e9c51461033c57600080fd5b806370a08231146102775780637c88e3d91461028a578063906571471461029d57806395d89b41146102b05780639b77ef11146102b85780639dc29fac146102cb57600080fd5b80631f2d0065116101155780631f2d0065146101e257806323b872dd146101f45780632d0335ab1461020757806340c10f191461023e57806342842e0e146102515780636352211e1461026457600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba5780630c53c51c146101cf575b600080fd5b610165610160366004611a73565b61034f565b60405190151581526020015b60405180910390f35b6101826103a1565b6040516101719190611ae0565b6101a261019d366004611af3565b610433565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611b28565b61045a565b005b6101826101dd366004611b9a565b610586565b610103546001600160a01b03166101a2565b6101cd610202366004611c19565b610864565b610230610215366004611c55565b6001600160a01b031660009081526038602052604090205490565b604051908152602001610171565b61016561024c366004611b28565b61089c565b6101cd61025f366004611c19565b6108dd565b6101a2610272366004611af3565b6108f8565b610230610285366004611c55565b61092d565b610165610298366004611cb4565b6109b3565b6101cd6102ab366004611d1f565b610a9b565b610182610d0b565b6101cd6102c6366004611af3565b610d1a565b6101656102d9366004611b28565b610d41565b6101cd6102ec366004611d9f565b610db1565b6101656102ff366004611ddb565b610dc7565b6101cd610312366004611e43565b610e75565b610182610325366004611af3565b610eb4565b610102546001600160a01b03166101a2565b61016561034a366004611f1e565b610f28565b60006001600160e01b031982166380ac58cd60e01b148061038057506001600160e01b03198216635b5e139f60e01b145b8061039b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060d080546103b090611f51565b80601f01602080910402602001604051908101604052809291908181526020018280546103dc90611f51565b80156104295780601f106103fe57610100808354040283529160200191610429565b820191906000526020600020905b81548152906001019060200180831161040c57829003601f168201915b5050505050905090565b600061043e82610f56565b50600090815260d460205260409020546001600160a01b031690565b6000610465826108f8565b9050806001600160a01b0316836001600160a01b0316036104d75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b806001600160a01b03166104e9610f7e565b6001600160a01b0316148061050557506105058161034a610f7e565b6105775760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ce565b6105818383610f8d565b505050565b606060006105c987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ffb92505050565b90506001600160e01b031960003581169082160361064f5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084016104ce565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506106c08982888888611016565b6107165760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016104ce565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161076b93929190611f8b565b60408051601f198184030181529082905261078591611fb1565b6000604051808303816000865af19150503d80600081146107c2576040519150601f19603f3d011682016040523d82523d6000602084013e6107c7565b606091505b5091509150816108195760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016104ce565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161084e9493929190611fcd565b60405180910390a19a9950505050505050505050565b61087561086f610f7e565b826110f2565b6108915760405162461bcd60e51b81526004016104ce90612019565b610581838383611150565b610102546000906001600160a01b031633146108ca5760405162461bcd60e51b81526004016104ce90612066565b6108d483836112a2565b50600192915050565b61058183838360405180602001604052806000815250610e75565b600081815260d260205260408120546001600160a01b03168061039b5760405162461bcd60e51b81526004016104ce906120aa565b60006001600160a01b0382166109975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ce565b506001600160a01b0316600090815260d3602052604090205490565b610102546000906001600160a01b031633146109e15760405162461bcd60e51b81526004016104ce90612066565b83828114610a315760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a204172726179206c656e206d69736d617463680060448201526064016104ce565b60005b81811015610a8c57610a84878783818110610a5157610a516120dc565b9050602002016020810190610a669190611c55565b868684818110610a7857610a786120dc565b905060200201356112a2565b600101610a34565b5060019150505b949350505050565b606b54610100900460ff1615808015610abb5750606b54600160ff909116105b80610ad55750303b158015610ad55750606b5460ff166001145b610b385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104ce565b606b805460ff191660011790558015610b5b57606b805461ff0019166101001790555b6001600160a01b03861615801590610b7257508315155b8015610b7d57508115155b610bc95760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a2042616420696e697469616c697a6174696f6e0060448201526064016104ce565b61010380546001600160a01b0388166001600160a01b031991821617909155610102805490911633179055604080516020601f8701819004810282018101909252858152610c6591879087908190840183828082843760009201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284376000920191909152506112bc92505050565b610cbd85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b602082015291506112ed9050565b8015610d0357606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606060d180546103b090611f51565b3360009081526038602052604081208054839290610d399084906120f2565b909155505050565b610102546000906001600160a01b03163314610d6f5760405162461bcd60e51b81526004016104ce90612066565b610d78826108f8565b6001600160a01b0316836001600160a01b031614610da85760405162461bcd60e51b81526004016104ce90612113565b6108d482611359565b610dc3610dbc610f7e565b83836113dc565b5050565b610102546000906001600160a01b03163314610df55760405162461bcd60e51b81526004016104ce90612066565b8160005b81811015610e69576000858583818110610e1557610e156120dc565b905060200201359050610e27816108f8565b6001600160a01b0316876001600160a01b031614610e575760405162461bcd60e51b81526004016104ce90612113565b610e6081611359565b50600101610df9565b50600195945050505050565b610e86610e80610f7e565b836110f2565b610ea25760405162461bcd60e51b81526004016104ce90612019565b610eae848484846114a6565b50505050565b6060610ebf82610f56565b6000610ed660408051602081019091526000815290565b90506000815111610ef65760405180602001604052806000815250610f21565b80610f00846114d9565b604051602001610f11929190612148565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260d56020908152604080832093909416825291909152205460ff1690565b610f5f8161156b565b610f7b5760405162461bcd60e51b81526004016104ce906120aa565b50565b6000610f88611588565b905090565b600081815260d46020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fc2826108f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815160000361100e57506000919050565b506020015190565b600080600161102c611027886115e4565b611661565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa15801561107a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110d15760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016104ce565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000806110fe836108f8565b9050806001600160a01b0316846001600160a01b0316148061112557506111258185610f28565b80610a935750836001600160a01b031661113e84610433565b6001600160a01b031614949350505050565b826001600160a01b0316611163826108f8565b6001600160a01b0316146111895760405162461bcd60e51b81526004016104ce90612177565b6001600160a01b0382166111eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ce565b826001600160a01b03166111fe826108f8565b6001600160a01b0316146112245760405162461bcd60e51b81526004016104ce90612177565b600081815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260d3855283862080546000190190559087168086528386208054600101905586865260d2909452828520805490921684179091559051849360008051602061243383398151915291a4505050565b610dc382826040518060200160405280600081525061168e565b606b54610100900460ff166112e35760405162461bcd60e51b81526004016104ce906121bc565b610dc382826116c1565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61133b818484611701565b600055600280546001600160a01b0319163017905560055550505050565b6000611364826108f8565b905061136f826108f8565b600083815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b03851680855260d38452828520805460001901905587855260d290935281842080549091169055519293508492600080516020612433833981519152908390a45050565b816001600160a01b0316836001600160a01b0316036114395760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104ce565b6001600160a01b03838116600081815260d56020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114b1848484611150565b6114bd8484848461174a565b610eae5760405162461bcd60e51b81526004016104ce90612207565b606060006114e68361184f565b60010190506000816001600160401b0381111561150557611505611e2d565b6040519080825280601f01601f19166020018201604052801561152f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461153957509392505050565b600090815260d260205260409020546001600160a01b0316151590565b60003033036115de57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506115e19050565b50335b90565b60006040518060800160405280604381526020016123f06043913980516020918201208351848301516040808701518051908601209051611644950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039b61166e611927565b8360405161190160f01b8152600281019290925260228201526042902090565b6116988383611962565b6116a5600084848461174a565b6105815760405162461bcd60e51b81526004016104ce90612207565b606b54610100900460ff166116e85760405162461bcd60e51b81526004016104ce906121bc565b60d06116f4838261229f565b5060d1610581828261229f565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b60006001600160a01b0384163b1561184757836001600160a01b031663150b7a02611773610f7e565b8786866040518563ffffffff1660e01b8152600401611795949392919061235e565b6020604051808303816000875af19250505080156117d0575060408051601f3d908101601f191682019092526117cd9181019061239b565b60015b61182d573d8080156117fe576040519150601f19603f3d011682016040523d82523d6000602084013e611803565b606091505b5080516000036118255760405162461bcd60e51b81526004016104ce90612207565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a93565b506001610a93565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061188e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118ba576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106118d857662386f26fc10000830492506010015b6305f5e10083106118f0576305f5e100830492506008015b612710831061190457612710830492506004015b60648310611916576064830492506002015b600a831061039b5760010192915050565b6002546000906001600160a01b031630148015611945575060015446145b15611951575060005490565b610f88600554600354600454611701565b6001600160a01b0382166119b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ce565b6119c18161156b565b156119de5760405162461bcd60e51b81526004016104ce906123b8565b6119e78161156b565b15611a045760405162461bcd60e51b81526004016104ce906123b8565b6001600160a01b038216600081815260d3602090815260408083208054600101905584835260d290915280822080546001600160a01b031916841790555183929190600080516020612433833981519152908290a45050565b6001600160e01b031981168114610f7b57600080fd5b600060208284031215611a8557600080fd5b8135610f2181611a5d565b60005b83811015611aab578181015183820152602001611a93565b50506000910152565b60008151808452611acc816020860160208601611a90565b601f01601f19169290920160200192915050565b602081526000610f216020830184611ab4565b600060208284031215611b0557600080fd5b5035919050565b80356001600160a01b0381168114611b2357600080fd5b919050565b60008060408385031215611b3b57600080fd5b611b4483611b0c565b946020939093013593505050565b60008083601f840112611b6457600080fd5b5081356001600160401b03811115611b7b57600080fd5b602083019150836020828501011115611b9357600080fd5b9250929050565b60008060008060008060a08789031215611bb357600080fd5b611bbc87611b0c565b955060208701356001600160401b03811115611bd757600080fd5b611be389828a01611b52565b9096509450506040870135925060608701359150608087013560ff81168114611c0b57600080fd5b809150509295509295509295565b600080600060608486031215611c2e57600080fd5b611c3784611b0c565b9250611c4560208501611b0c565b9150604084013590509250925092565b600060208284031215611c6757600080fd5b610f2182611b0c565b60008083601f840112611c8257600080fd5b5081356001600160401b03811115611c9957600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b60008060008060408587031215611cca57600080fd5b84356001600160401b0380821115611ce157600080fd5b611ced88838901611c70565b90965094506020870135915080821115611d0657600080fd5b50611d1387828801611c70565b95989497509550505050565b600080600080600060608688031215611d3757600080fd5b611d4086611b0c565b945060208601356001600160401b0380821115611d5c57600080fd5b611d6889838a01611b52565b90965094506040880135915080821115611d8157600080fd5b50611d8e88828901611b52565b969995985093965092949392505050565b60008060408385031215611db257600080fd5b611dbb83611b0c565b915060208301358015158114611dd057600080fd5b809150509250929050565b600080600060408486031215611df057600080fd5b611df984611b0c565b925060208401356001600160401b03811115611e1457600080fd5b611e2086828701611c70565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611e5957600080fd5b611e6285611b0c565b9350611e7060208601611b0c565b92506040850135915060608501356001600160401b0380821115611e9357600080fd5b818701915087601f830112611ea757600080fd5b813581811115611eb957611eb9611e2d565b604051601f8201601f19908116603f01168101908382118183101715611ee157611ee1611e2d565b816040528281528a6020848701011115611efa57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611f3157600080fd5b611f3a83611b0c565b9150611f4860208401611b0c565b90509250929050565b600181811c90821680611f6557607f821691505b602082108103611f8557634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251611fc3818460208701611a90565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526024908201527f4368696c644552433732313a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561039b57634e487b7160e01b600052601160045260246000fd5b6020808252818101527f4368696c644552433732313a204f6e6c79206f776e65722063616e206275726e604082015260600190565b6000835161215a818460208801611a90565b83519083019061216e818360208801611a90565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b601f82111561058157600081815260208120601f850160051c810160208610156122805750805b601f850160051c820191505b81811015610d035782815560010161228c565b81516001600160401b038111156122b8576122b8611e2d565b6122cc816122c68454611f51565b84612259565b602080601f83116001811461230157600084156122e95750858301515b600019600386901b1c1916600185901b178555610d03565b600085815260208120601f198616915b8281101561233057888601518255948401946001909101908401612311565b508582101561234e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239190830184611ab4565b9695505050505050565b6000602082840312156123ad57600080fd5b8151610f2181611a5d565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bd40f4c587cb7d8ae1bc3b96cf69daefceacb0a939f4075b779cabc6e8e56d3964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a22cb4651161007c578063a22cb465146102de578063b2dc5dc3146102f1578063b88d4fde14610304578063c87b56dd14610317578063e61987051461032a578063e985e9c51461033c57600080fd5b806370a08231146102775780637c88e3d91461028a578063906571471461029d57806395d89b41146102b05780639b77ef11146102b85780639dc29fac146102cb57600080fd5b80631f2d0065116101155780631f2d0065146101e257806323b872dd146101f45780632d0335ab1461020757806340c10f191461023e57806342842e0e146102515780636352211e1461026457600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba5780630c53c51c146101cf575b600080fd5b610165610160366004611a73565b61034f565b60405190151581526020015b60405180910390f35b6101826103a1565b6040516101719190611ae0565b6101a261019d366004611af3565b610433565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611b28565b61045a565b005b6101826101dd366004611b9a565b610586565b610103546001600160a01b03166101a2565b6101cd610202366004611c19565b610864565b610230610215366004611c55565b6001600160a01b031660009081526038602052604090205490565b604051908152602001610171565b61016561024c366004611b28565b61089c565b6101cd61025f366004611c19565b6108dd565b6101a2610272366004611af3565b6108f8565b610230610285366004611c55565b61092d565b610165610298366004611cb4565b6109b3565b6101cd6102ab366004611d1f565b610a9b565b610182610d0b565b6101cd6102c6366004611af3565b610d1a565b6101656102d9366004611b28565b610d41565b6101cd6102ec366004611d9f565b610db1565b6101656102ff366004611ddb565b610dc7565b6101cd610312366004611e43565b610e75565b610182610325366004611af3565b610eb4565b610102546001600160a01b03166101a2565b61016561034a366004611f1e565b610f28565b60006001600160e01b031982166380ac58cd60e01b148061038057506001600160e01b03198216635b5e139f60e01b145b8061039b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060d080546103b090611f51565b80601f01602080910402602001604051908101604052809291908181526020018280546103dc90611f51565b80156104295780601f106103fe57610100808354040283529160200191610429565b820191906000526020600020905b81548152906001019060200180831161040c57829003601f168201915b5050505050905090565b600061043e82610f56565b50600090815260d460205260409020546001600160a01b031690565b6000610465826108f8565b9050806001600160a01b0316836001600160a01b0316036104d75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b806001600160a01b03166104e9610f7e565b6001600160a01b0316148061050557506105058161034a610f7e565b6105775760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ce565b6105818383610f8d565b505050565b606060006105c987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ffb92505050565b90506001600160e01b031960003581169082160361064f5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084016104ce565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506106c08982888888611016565b6107165760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016104ce565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161076b93929190611f8b565b60408051601f198184030181529082905261078591611fb1565b6000604051808303816000865af19150503d80600081146107c2576040519150601f19603f3d011682016040523d82523d6000602084013e6107c7565b606091505b5091509150816108195760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016104ce565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161084e9493929190611fcd565b60405180910390a19a9950505050505050505050565b61087561086f610f7e565b826110f2565b6108915760405162461bcd60e51b81526004016104ce90612019565b610581838383611150565b610102546000906001600160a01b031633146108ca5760405162461bcd60e51b81526004016104ce90612066565b6108d483836112a2565b50600192915050565b61058183838360405180602001604052806000815250610e75565b600081815260d260205260408120546001600160a01b03168061039b5760405162461bcd60e51b81526004016104ce906120aa565b60006001600160a01b0382166109975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ce565b506001600160a01b0316600090815260d3602052604090205490565b610102546000906001600160a01b031633146109e15760405162461bcd60e51b81526004016104ce90612066565b83828114610a315760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a204172726179206c656e206d69736d617463680060448201526064016104ce565b60005b81811015610a8c57610a84878783818110610a5157610a516120dc565b9050602002016020810190610a669190611c55565b868684818110610a7857610a786120dc565b905060200201356112a2565b600101610a34565b5060019150505b949350505050565b606b54610100900460ff1615808015610abb5750606b54600160ff909116105b80610ad55750303b158015610ad55750606b5460ff166001145b610b385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104ce565b606b805460ff191660011790558015610b5b57606b805461ff0019166101001790555b6001600160a01b03861615801590610b7257508315155b8015610b7d57508115155b610bc95760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a2042616420696e697469616c697a6174696f6e0060448201526064016104ce565b61010380546001600160a01b0388166001600160a01b031991821617909155610102805490911633179055604080516020601f8701819004810282018101909252858152610c6591879087908190840183828082843760009201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284376000920191909152506112bc92505050565b610cbd85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b602082015291506112ed9050565b8015610d0357606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606060d180546103b090611f51565b3360009081526038602052604081208054839290610d399084906120f2565b909155505050565b610102546000906001600160a01b03163314610d6f5760405162461bcd60e51b81526004016104ce90612066565b610d78826108f8565b6001600160a01b0316836001600160a01b031614610da85760405162461bcd60e51b81526004016104ce90612113565b6108d482611359565b610dc3610dbc610f7e565b83836113dc565b5050565b610102546000906001600160a01b03163314610df55760405162461bcd60e51b81526004016104ce90612066565b8160005b81811015610e69576000858583818110610e1557610e156120dc565b905060200201359050610e27816108f8565b6001600160a01b0316876001600160a01b031614610e575760405162461bcd60e51b81526004016104ce90612113565b610e6081611359565b50600101610df9565b50600195945050505050565b610e86610e80610f7e565b836110f2565b610ea25760405162461bcd60e51b81526004016104ce90612019565b610eae848484846114a6565b50505050565b6060610ebf82610f56565b6000610ed660408051602081019091526000815290565b90506000815111610ef65760405180602001604052806000815250610f21565b80610f00846114d9565b604051602001610f11929190612148565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260d56020908152604080832093909416825291909152205460ff1690565b610f5f8161156b565b610f7b5760405162461bcd60e51b81526004016104ce906120aa565b50565b6000610f88611588565b905090565b600081815260d46020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fc2826108f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815160000361100e57506000919050565b506020015190565b600080600161102c611027886115e4565b611661565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa15801561107a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110d15760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016104ce565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000806110fe836108f8565b9050806001600160a01b0316846001600160a01b0316148061112557506111258185610f28565b80610a935750836001600160a01b031661113e84610433565b6001600160a01b031614949350505050565b826001600160a01b0316611163826108f8565b6001600160a01b0316146111895760405162461bcd60e51b81526004016104ce90612177565b6001600160a01b0382166111eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ce565b826001600160a01b03166111fe826108f8565b6001600160a01b0316146112245760405162461bcd60e51b81526004016104ce90612177565b600081815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260d3855283862080546000190190559087168086528386208054600101905586865260d2909452828520805490921684179091559051849360008051602061243383398151915291a4505050565b610dc382826040518060200160405280600081525061168e565b606b54610100900460ff166112e35760405162461bcd60e51b81526004016104ce906121bc565b610dc382826116c1565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61133b818484611701565b600055600280546001600160a01b0319163017905560055550505050565b6000611364826108f8565b905061136f826108f8565b600083815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b03851680855260d38452828520805460001901905587855260d290935281842080549091169055519293508492600080516020612433833981519152908390a45050565b816001600160a01b0316836001600160a01b0316036114395760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104ce565b6001600160a01b03838116600081815260d56020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114b1848484611150565b6114bd8484848461174a565b610eae5760405162461bcd60e51b81526004016104ce90612207565b606060006114e68361184f565b60010190506000816001600160401b0381111561150557611505611e2d565b6040519080825280601f01601f19166020018201604052801561152f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461153957509392505050565b600090815260d260205260409020546001600160a01b0316151590565b60003033036115de57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506115e19050565b50335b90565b60006040518060800160405280604381526020016123f06043913980516020918201208351848301516040808701518051908601209051611644950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039b61166e611927565b8360405161190160f01b8152600281019290925260228201526042902090565b6116988383611962565b6116a5600084848461174a565b6105815760405162461bcd60e51b81526004016104ce90612207565b606b54610100900460ff166116e85760405162461bcd60e51b81526004016104ce906121bc565b60d06116f4838261229f565b5060d1610581828261229f565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b60006001600160a01b0384163b1561184757836001600160a01b031663150b7a02611773610f7e565b8786866040518563ffffffff1660e01b8152600401611795949392919061235e565b6020604051808303816000875af19250505080156117d0575060408051601f3d908101601f191682019092526117cd9181019061239b565b60015b61182d573d8080156117fe576040519150601f19603f3d011682016040523d82523d6000602084013e611803565b606091505b5080516000036118255760405162461bcd60e51b81526004016104ce90612207565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a93565b506001610a93565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061188e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118ba576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106118d857662386f26fc10000830492506010015b6305f5e10083106118f0576305f5e100830492506008015b612710831061190457612710830492506004015b60648310611916576064830492506002015b600a831061039b5760010192915050565b6002546000906001600160a01b031630148015611945575060015446145b15611951575060005490565b610f88600554600354600454611701565b6001600160a01b0382166119b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ce565b6119c18161156b565b156119de5760405162461bcd60e51b81526004016104ce906123b8565b6119e78161156b565b15611a045760405162461bcd60e51b81526004016104ce906123b8565b6001600160a01b038216600081815260d3602090815260408083208054600101905584835260d290915280822080546001600160a01b031916841790555183929190600080516020612433833981519152908290a45050565b6001600160e01b031981168114610f7b57600080fd5b600060208284031215611a8557600080fd5b8135610f2181611a5d565b60005b83811015611aab578181015183820152602001611a93565b50506000910152565b60008151808452611acc816020860160208601611a90565b601f01601f19169290920160200192915050565b602081526000610f216020830184611ab4565b600060208284031215611b0557600080fd5b5035919050565b80356001600160a01b0381168114611b2357600080fd5b919050565b60008060408385031215611b3b57600080fd5b611b4483611b0c565b946020939093013593505050565b60008083601f840112611b6457600080fd5b5081356001600160401b03811115611b7b57600080fd5b602083019150836020828501011115611b9357600080fd5b9250929050565b60008060008060008060a08789031215611bb357600080fd5b611bbc87611b0c565b955060208701356001600160401b03811115611bd757600080fd5b611be389828a01611b52565b9096509450506040870135925060608701359150608087013560ff81168114611c0b57600080fd5b809150509295509295509295565b600080600060608486031215611c2e57600080fd5b611c3784611b0c565b9250611c4560208501611b0c565b9150604084013590509250925092565b600060208284031215611c6757600080fd5b610f2182611b0c565b60008083601f840112611c8257600080fd5b5081356001600160401b03811115611c9957600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b60008060008060408587031215611cca57600080fd5b84356001600160401b0380821115611ce157600080fd5b611ced88838901611c70565b90965094506020870135915080821115611d0657600080fd5b50611d1387828801611c70565b95989497509550505050565b600080600080600060608688031215611d3757600080fd5b611d4086611b0c565b945060208601356001600160401b0380821115611d5c57600080fd5b611d6889838a01611b52565b90965094506040880135915080821115611d8157600080fd5b50611d8e88828901611b52565b969995985093965092949392505050565b60008060408385031215611db257600080fd5b611dbb83611b0c565b915060208301358015158114611dd057600080fd5b809150509250929050565b600080600060408486031215611df057600080fd5b611df984611b0c565b925060208401356001600160401b03811115611e1457600080fd5b611e2086828701611c70565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611e5957600080fd5b611e6285611b0c565b9350611e7060208601611b0c565b92506040850135915060608501356001600160401b0380821115611e9357600080fd5b818701915087601f830112611ea757600080fd5b813581811115611eb957611eb9611e2d565b604051601f8201601f19908116603f01168101908382118183101715611ee157611ee1611e2d565b816040528281528a6020848701011115611efa57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611f3157600080fd5b611f3a83611b0c565b9150611f4860208401611b0c565b90509250929050565b600181811c90821680611f6557607f821691505b602082108103611f8557634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251611fc3818460208701611a90565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526024908201527f4368696c644552433732313a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561039b57634e487b7160e01b600052601160045260246000fd5b6020808252818101527f4368696c644552433732313a204f6e6c79206f776e65722063616e206275726e604082015260600190565b6000835161215a818460208801611a90565b83519083019061216e818360208801611a90565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b601f82111561058157600081815260208120601f850160051c810160208610156122805750805b601f850160051c820191505b81811015610d035782815560010161228c565b81516001600160401b038111156122b8576122b8611e2d565b6122cc816122c68454611f51565b84612259565b602080601f83116001811461230157600084156122e95750858301515b600019600386901b1c1916600185901b178555610d03565b600085815260208120601f198616915b8281101561233057888601518255948401946001909101908401612311565b508582101561234e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239190830184611ab4565b9695505050505050565b6000602082840312156123ad57600080fd5b8151610f2181611a5d565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bd40f4c587cb7d8ae1bc3b96cf69daefceacb0a939f4075b779cabc6e8e56d3964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC721PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721Predicate","sourceName":"contracts/child/ChildERC721Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611fc4806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b61020661020136600461166f565b610382565b005b6101706102163660046116f1565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611715565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611756565b6103a6565b6102066103303660046117de565b6105c9565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d36600461180a565b6105d8565b61038f8585858585610734565b5050505050565b6103a1838383610a98565b505050565b6034546001600160a01b031633146104175760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104865760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b606482015260840161040e565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104b5602060008486611866565b6104be91611890565b036104dd576104d86104d38260208186611866565b610da1565b6105c3565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861050c602060008486611866565b61051591611890565b03610524576104d88282611017565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610553602060008486611866565b61055c91611890565b0361056b576104d8828261127d565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b606482015260840161040e565b50505050565b6105d4823383610a98565b5050565b336002600160a01b031461061c5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161040e565b600054610100900460ff161580801561063c5750600054600160ff909116105b806106565750303b158015610656575060005460ff166001145b6106b95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161040e565b6000805460ff1916600117905580156106dc576000805461ff0019166101001790555b6106e8858585856113eb565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b8461073e816114e0565b61075a5760405162461bcd60e51b815260040161040e906118ae565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be91906118f0565b6001600160a01b038181166000908152603760205260409020549192508881169116146107fd5760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b03811661081357610813611951565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f91906118f0565b6001600160a01b03161461089557610895611951565b8483146108f05760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b606482015260840161040e565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc39061092090339088908890600401611999565b6020604051808303816000875af115801561093f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096391906119c7565b61097f5760405162461bcd60e51b815260040161040e906119e9565b6033546035546040516001600160a01b03928316926316f198319216906109d6907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611a73565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a02929190611b0d565b600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610a879493929190611b39565b60405180910390a450505050505050565b82610aa2816114e0565b610abe5760405162461bcd60e51b815260040161040e906118ae565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2291906118f0565b6001600160a01b03818116600090815260376020526040902054919250868116911614610b615760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b038116610b7757610b77611951565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be391906118f0565b6001600160a01b031614610bf957610bf9611951565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610c279033908790600401611b6b565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a91906119c7565b610c865760405162461bcd60e51b815260040161040e906119e9565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610d119391169160c401611b0d565b600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051610d92929190611b6b565b60405180910390a45050505050565b6000808080610db285870187611b84565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610df55760405162461bcd60e51b815260040161040e9061190d565b610dfe816114e0565b610e0a57610e0a611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6e91906118f0565b9050856001600160a01b0316816001600160a01b031614610e9157610e91611951565b6001600160a01b038116610ea757610ea7611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906118f0565b6001600160a01b031614610f2957610f29611951565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f579087908790600401611b6b565b6020604051808303816000875af1158015610f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9a91906119c7565b610fb65760405162461bcd60e51b815260040161040e90611bd5565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611005929190611b6b565b60405180910390a45050505050505050565b600080808061102885870187611cea565b6001600160a01b0380851660009081526037602052604090205494995092975090955093501690508061106d5760405162461bcd60e51b815260040161040e9061190d565b611076816114e0565b61108257611082611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e691906118f0565b9050856001600160a01b0316816001600160a01b03161461110957611109611951565b6001600160a01b03811661111f5761111f611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b91906118f0565b6001600160a01b0316146111a1576111a1611951565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906111cf9087908790600401611ddc565b6020604051808303816000875af11580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121291906119c7565b61122e5760405162461bcd60e51b815260040161040e90611bd5565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611005929190611ddc565b6000808061128d84860186611ecf565b91955093509150506001600160a01b0383166112ab576112ab611951565b6001600160a01b0383811660009081526037602052604090205416156112d3576112d3611951565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611323916001600160a01b039091169060340160405160208183030381529060405280519060200120611575565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b81529192509063906571479061137990879087908790600401611f4e565b600060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061140b57506001600160a01b03831615155b801561141f57506001600160a01b03821615155b801561143357506001600160a01b03811615155b6114905760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b606482015260840161040e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b6000036114fc57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611563575060408051601f3d908101601f19168201909252611560918101906119c7565b60015b61156f57506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661156f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161040e565b6001600160a01b038116811461162157600080fd5b50565b60008083601f84011261163657600080fd5b5081356001600160401b0381111561164d57600080fd5b6020830191508360208260051b850101111561166857600080fd5b9250929050565b60008060008060006060868803121561168757600080fd5b85356116928161160c565b945060208601356001600160401b03808211156116ae57600080fd5b6116ba89838a01611624565b909650945060408801359150808211156116d357600080fd5b506116e088828901611624565b969995985093965092949392505050565b60006020828403121561170357600080fd5b813561170e8161160c565b9392505050565b60008060006060848603121561172a57600080fd5b83356117358161160c565b925060208401356117458161160c565b929592945050506040919091013590565b6000806000806060858703121561176c57600080fd5b84359350602085013561177e8161160c565b925060408501356001600160401b038082111561179a57600080fd5b818701915087601f8301126117ae57600080fd5b8135818111156117bd57600080fd5b8860208285010111156117cf57600080fd5b95989497505060200194505050565b600080604083850312156117f157600080fd5b82356117fc8161160c565b946020939093013593505050565b6000806000806080858703121561182057600080fd5b843561182b8161160c565b9350602085013561183b8161160c565b9250604085013561184b8161160c565b9150606085013561185b8161160c565b939692955090935050565b6000808585111561187657600080fd5b8386111561188357600080fd5b5050820193919092039150565b8035602083101561156f57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561190257600080fd5b815161170e8161160c565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561198057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03841681526040602082018190526000906119be9083018486611967565b95945050505050565b6000602082840312156119d957600080fd5b8151801515811461170e57600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611a68578135611a4d8161160c565b6001600160a01b031687529582019590820190600101611a3a565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611aa69083018688611a2a565b8281036080840152611ab9818587611967565b9a9950505050505050505050565b6000815180845260005b81811015611aed57602081850181015186830182015201611ad1565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611b3190830184611ac7565b949350505050565b604081526000611b4d604083018688611a2a565b8281036020840152611b60818587611967565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b9a57600080fd5b8435611ba58161160c565b93506020850135611bb58161160c565b92506040850135611bc58161160c565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c5457611c54611c16565b604052919050565b60006001600160401b03821115611c7557611c75611c16565b5060051b60200190565b600082601f830112611c9057600080fd5b81356020611ca5611ca083611c5c565b611c2c565b82815260059290921b84018101918181019086841115611cc457600080fd5b8286015b84811015611cdf5780358352918301918301611cc8565b509695505050505050565b600080600080600060a08688031215611d0257600080fd5b85359450602080870135611d158161160c565b94506040870135611d258161160c565b935060608701356001600160401b0380821115611d4157600080fd5b818901915089601f830112611d5557600080fd5b8135611d63611ca082611c5c565b81815260059190911b8301840190848101908c831115611d8257600080fd5b938501935b82851015611da9578435611d9a8161160c565b82529385019390850190611d87565b965050506080890135925080831115611dc157600080fd5b5050611dcf88828901611c7f565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b82811015611e1e5781516001600160a01b031684529284019290840190600101611df9565b5050508381038285015284518082528583019183019060005b81811015611e5357835183529284019291840191600101611e37565b5090979650505050505050565b600082601f830112611e7157600080fd5b81356001600160401b03811115611e8a57611e8a611c16565b611e9d601f8201601f1916602001611c2c565b818152846020838601011115611eb257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611ee557600080fd5b843593506020850135611ef78161160c565b925060408501356001600160401b0380821115611f1357600080fd5b611f1f88838901611e60565b93506060870135915080821115611f3557600080fd5b50611f4287828801611e60565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090611f7290830185611ac7565b8281036040840152611f848185611ac7565b969550505050505056fea264697066735822122081e46b99b49bcb8dea5f01175766e4aca327da04a0662d01672b6f776a5e701164736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b61020661020136600461166f565b610382565b005b6101706102163660046116f1565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611715565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611756565b6103a6565b6102066103303660046117de565b6105c9565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d36600461180a565b6105d8565b61038f8585858585610734565b5050505050565b6103a1838383610a98565b505050565b6034546001600160a01b031633146104175760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104865760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b606482015260840161040e565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104b5602060008486611866565b6104be91611890565b036104dd576104d86104d38260208186611866565b610da1565b6105c3565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861050c602060008486611866565b61051591611890565b03610524576104d88282611017565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610553602060008486611866565b61055c91611890565b0361056b576104d8828261127d565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b606482015260840161040e565b50505050565b6105d4823383610a98565b5050565b336002600160a01b031461061c5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161040e565b600054610100900460ff161580801561063c5750600054600160ff909116105b806106565750303b158015610656575060005460ff166001145b6106b95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161040e565b6000805460ff1916600117905580156106dc576000805461ff0019166101001790555b6106e8858585856113eb565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b8461073e816114e0565b61075a5760405162461bcd60e51b815260040161040e906118ae565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be91906118f0565b6001600160a01b038181166000908152603760205260409020549192508881169116146107fd5760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b03811661081357610813611951565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f91906118f0565b6001600160a01b03161461089557610895611951565b8483146108f05760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b606482015260840161040e565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc39061092090339088908890600401611999565b6020604051808303816000875af115801561093f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096391906119c7565b61097f5760405162461bcd60e51b815260040161040e906119e9565b6033546035546040516001600160a01b03928316926316f198319216906109d6907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611a73565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a02929190611b0d565b600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610a879493929190611b39565b60405180910390a450505050505050565b82610aa2816114e0565b610abe5760405162461bcd60e51b815260040161040e906118ae565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2291906118f0565b6001600160a01b03818116600090815260376020526040902054919250868116911614610b615760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b038116610b7757610b77611951565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be391906118f0565b6001600160a01b031614610bf957610bf9611951565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610c279033908790600401611b6b565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a91906119c7565b610c865760405162461bcd60e51b815260040161040e906119e9565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610d119391169160c401611b0d565b600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051610d92929190611b6b565b60405180910390a45050505050565b6000808080610db285870187611b84565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610df55760405162461bcd60e51b815260040161040e9061190d565b610dfe816114e0565b610e0a57610e0a611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6e91906118f0565b9050856001600160a01b0316816001600160a01b031614610e9157610e91611951565b6001600160a01b038116610ea757610ea7611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906118f0565b6001600160a01b031614610f2957610f29611951565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f579087908790600401611b6b565b6020604051808303816000875af1158015610f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9a91906119c7565b610fb65760405162461bcd60e51b815260040161040e90611bd5565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611005929190611b6b565b60405180910390a45050505050505050565b600080808061102885870187611cea565b6001600160a01b0380851660009081526037602052604090205494995092975090955093501690508061106d5760405162461bcd60e51b815260040161040e9061190d565b611076816114e0565b61108257611082611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e691906118f0565b9050856001600160a01b0316816001600160a01b03161461110957611109611951565b6001600160a01b03811661111f5761111f611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b91906118f0565b6001600160a01b0316146111a1576111a1611951565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906111cf9087908790600401611ddc565b6020604051808303816000875af11580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121291906119c7565b61122e5760405162461bcd60e51b815260040161040e90611bd5565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611005929190611ddc565b6000808061128d84860186611ecf565b91955093509150506001600160a01b0383166112ab576112ab611951565b6001600160a01b0383811660009081526037602052604090205416156112d3576112d3611951565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611323916001600160a01b039091169060340160405160208183030381529060405280519060200120611575565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b81529192509063906571479061137990879087908790600401611f4e565b600060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061140b57506001600160a01b03831615155b801561141f57506001600160a01b03821615155b801561143357506001600160a01b03811615155b6114905760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b606482015260840161040e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b6000036114fc57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611563575060408051601f3d908101601f19168201909252611560918101906119c7565b60015b61156f57506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661156f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161040e565b6001600160a01b038116811461162157600080fd5b50565b60008083601f84011261163657600080fd5b5081356001600160401b0381111561164d57600080fd5b6020830191508360208260051b850101111561166857600080fd5b9250929050565b60008060008060006060868803121561168757600080fd5b85356116928161160c565b945060208601356001600160401b03808211156116ae57600080fd5b6116ba89838a01611624565b909650945060408801359150808211156116d357600080fd5b506116e088828901611624565b969995985093965092949392505050565b60006020828403121561170357600080fd5b813561170e8161160c565b9392505050565b60008060006060848603121561172a57600080fd5b83356117358161160c565b925060208401356117458161160c565b929592945050506040919091013590565b6000806000806060858703121561176c57600080fd5b84359350602085013561177e8161160c565b925060408501356001600160401b038082111561179a57600080fd5b818701915087601f8301126117ae57600080fd5b8135818111156117bd57600080fd5b8860208285010111156117cf57600080fd5b95989497505060200194505050565b600080604083850312156117f157600080fd5b82356117fc8161160c565b946020939093013593505050565b6000806000806080858703121561182057600080fd5b843561182b8161160c565b9350602085013561183b8161160c565b9250604085013561184b8161160c565b9150606085013561185b8161160c565b939692955090935050565b6000808585111561187657600080fd5b8386111561188357600080fd5b5050820193919092039150565b8035602083101561156f57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561190257600080fd5b815161170e8161160c565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561198057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03841681526040602082018190526000906119be9083018486611967565b95945050505050565b6000602082840312156119d957600080fd5b8151801515811461170e57600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611a68578135611a4d8161160c565b6001600160a01b031687529582019590820190600101611a3a565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611aa69083018688611a2a565b8281036080840152611ab9818587611967565b9a9950505050505050505050565b6000815180845260005b81811015611aed57602081850181015186830182015201611ad1565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611b3190830184611ac7565b949350505050565b604081526000611b4d604083018688611a2a565b8281036020840152611b60818587611967565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b9a57600080fd5b8435611ba58161160c565b93506020850135611bb58161160c565b92506040850135611bc58161160c565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c5457611c54611c16565b604052919050565b60006001600160401b03821115611c7557611c75611c16565b5060051b60200190565b600082601f830112611c9057600080fd5b81356020611ca5611ca083611c5c565b611c2c565b82815260059290921b84018101918181019086841115611cc457600080fd5b8286015b84811015611cdf5780358352918301918301611cc8565b509695505050505050565b600080600080600060a08688031215611d0257600080fd5b85359450602080870135611d158161160c565b94506040870135611d258161160c565b935060608701356001600160401b0380821115611d4157600080fd5b818901915089601f830112611d5557600080fd5b8135611d63611ca082611c5c565b81815260059190911b8301840190848101908c831115611d8257600080fd5b938501935b82851015611da9578435611d9a8161160c565b82529385019390850190611d87565b965050506080890135925080831115611dc157600080fd5b5050611dcf88828901611c7f565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b82811015611e1e5781516001600160a01b031684529284019290840190600101611df9565b5050508381038285015284518082528583019183019060005b81811015611e5357835183529284019291840191600101611e37565b5090979650505050505050565b600082601f830112611e7157600080fd5b81356001600160401b03811115611e8a57611e8a611c16565b611e9d601f8201601f1916602001611c2c565b818152846020838601011115611eb257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611ee557600080fd5b843593506020850135611ef78161160c565b925060408501356001600160401b0380821115611f1357600080fd5b611f1f88838901611e60565b93506060870135915080821115611f3557600080fd5b50611f4287828801611e60565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090611f7290830185611ac7565b8281036040840152611f848185611ac7565b969550505050505056fea264697066735822122081e46b99b49bcb8dea5f01175766e4aca327da04a0662d01672b6f776a5e701164736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC721PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721PredicateAccessList","sourceName":"contracts/child/ChildERC721PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612758806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e610259366004611c96565b610459565b005b61025e610475565b61025e610489565b6101c861027e366004611d18565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e610306366004611d4a565b610508565b61025e610319366004611d67565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e610353366004611d4a565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b4366004611da8565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e1366004611e3e565b6106d7565b61025e6103f4366004611d18565b6108f5565b61025e610407366004611ec6565b610966565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004611ef2565b61097d565b610461610a75565b61046e8585858585610a7d565b5050505050565b61047d610de2565b6104876000610e3c565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581610e3c565b50565b610510610de2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610a75565b61056a838383610e55565b505050565b610577610de2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b6106628888888861115f565b60c9805461ffff191685151561ff001916176101008515150217905561068782610e3c565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107435760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b60fe546001600160a01b038481169116146107b25760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216107e1602060008486611fc0565b6107ea91611fea565b03610809576108046107ff8260208186611fc0565b611254565b6108ef565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610838602060008486611fc0565b61084191611fea565b036108505761080482826114cb565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61087f602060008486611fc0565b61088891611fea565b03610897576108048282611732565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b6108fd610de2565b606580546001600160a01b0383166001600160a01b0319909116811790915561092e6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61096e610a75565b610979823383610e55565b5050565b336002600160a01b03146109a45760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156109c45750600054600160ff909116105b806109de5750303b1580156109de575060005460ff166001145b6109fa5760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610a1d576000805461ff0019166101001790555b610a298585858561115f565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6104876118a2565b84610a8781611ab8565b610aa35760405162461bcd60e51b81526004016104f390612008565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b07919061204a565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610b475760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610b5d57610b5d6120ab565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc9919061204a565b6001600160a01b031614610bdf57610bdf6120ab565b848314610c3a5760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c6a903390889088906004016120f3565b6020604051808303816000875af1158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190612121565b610cc95760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe546040516001600160a01b03928316926316f19831921690610d20907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d906020016121c8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d4c92919061226c565b600060405180830381600087803b158015610d6657600080fd5b505af1158015610d7a573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610dd19493929190612298565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611b4d565b82610e5f81611ab8565b610e7b5760405162461bcd60e51b81526004016104f390612008565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf919061204a565b6001600160a01b0381811660009081526101006020526040902054919250868116911614610f1f5760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610f3557610f356120ab565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa1919061204a565b6001600160a01b031614610fb757610fb76120ab565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610fe590339087906004016122ca565b6020604051808303816000875af1158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612121565b6110445760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110cf9391169160c40161226c565b600060405180830381600087803b1580156110e957600080fd5b505af11580156110fd573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b01333876040516111509291906122ca565b60405180910390a45050505050565b6001600160a01b0384161580159061117f57506001600160a01b03831615155b801561119357506001600160a01b03821615155b80156111a757506001600160a01b03811615155b6112045760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080611265858701876122e3565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806112a95760405162461bcd60e51b81526004016104f390612067565b6112b281611ab8565b6112be576112be6120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611322919061204a565b9050856001600160a01b0316816001600160a01b031614611345576113456120ab565b6001600160a01b03811661135b5761135b6120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c7919061204a565b6001600160a01b0316146113dd576113dd6120ab565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061140b90879087906004016122ca565b6020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190612121565b61146a5760405162461bcd60e51b81526004016104f390612334565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b161188876040516114b99291906122ca565b60405180910390a45050505050505050565b60008080806114dc85870187612449565b6001600160a01b03808516600090815261010060205260409020549499509297509095509350169050806115225760405162461bcd60e51b81526004016104f390612067565b61152b81611ab8565b611537576115376120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b919061204a565b9050856001600160a01b0316816001600160a01b0316146115be576115be6120ab565b6001600160a01b0381166115d4576115d46120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611640919061204a565b6001600160a01b031614611656576116566120ab565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d990611684908790879060040161253b565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190612121565b6116e35760405162461bcd60e51b81526004016104f390612334565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516114b992919061253b565b600080806117428486018661262e565b91955093509150506001600160a01b038316611760576117606120ab565b6001600160a01b03838116600090815261010060205260409020541615611789576117896120ab565b60ff546040516bffffffffffffffffffffffff19606086901b1660208201526000916117d9916001600160a01b039091169060340160405160208183030381529060405280519060200120611b9f565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611830908790879087906004016126ad565b600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff16156119ad57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161190491906126ed565b6000604051808303818686fa925050503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b509150915081801561196a57506000818060200190518101906119689190612709565b115b6119aa5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a1491906126ed565b6000604051808303818686fa925050503d8060008114611a50576040519150601f19603f3d011682016040523d82523d6000602084013e611a55565b606091505b5091509150818015611a7b575080806020019051810190611a769190612709565b600114155b6109795760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611ad457506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611b3b575060408051601f3d908101601f19168201909252611b3891810190612121565b60015b611b4757506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611b475760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b6001600160a01b038116811461050557600080fd5b60008083601f840112611c5d57600080fd5b5081356001600160401b03811115611c7457600080fd5b6020830191508360208260051b8501011115611c8f57600080fd5b9250929050565b600080600080600060608688031215611cae57600080fd5b8535611cb981611c36565b945060208601356001600160401b0380821115611cd557600080fd5b611ce189838a01611c4b565b90965094506040880135915080821115611cfa57600080fd5b50611d0788828901611c4b565b969995985093965092949392505050565b600060208284031215611d2a57600080fd5b8135611d3581611c36565b9392505050565b801515811461050557600080fd5b600060208284031215611d5c57600080fd5b8135611d3581611d3c565b600080600060608486031215611d7c57600080fd5b8335611d8781611c36565b92506020840135611d9781611c36565b929592945050506040919091013590565b600080600080600080600060e0888a031215611dc357600080fd5b8735611dce81611c36565b96506020880135611dde81611c36565b95506040880135611dee81611c36565b94506060880135611dfe81611c36565b93506080880135611e0e81611d3c565b925060a0880135611e1e81611d3c565b915060c0880135611e2e81611c36565b8091505092959891949750929550565b60008060008060608587031215611e5457600080fd5b843593506020850135611e6681611c36565b925060408501356001600160401b0380821115611e8257600080fd5b818701915087601f830112611e9657600080fd5b813581811115611ea557600080fd5b886020828501011115611eb757600080fd5b95989497505060200194505050565b60008060408385031215611ed957600080fd5b8235611ee481611c36565b946020939093013593505050565b60008060008060808587031215611f0857600080fd5b8435611f1381611c36565b93506020850135611f2381611c36565b92506040850135611f3381611c36565b91506060850135611f4381611c36565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611fd057600080fd5b83861115611fdd57600080fd5b5050820193919092039150565b80356020831015611b4757600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561205c57600080fd5b8151611d3581611c36565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156120da57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061211890830184866120c1565b95945050505050565b60006020828403121561213357600080fd5b8151611d3581611d3c565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b858110156121bd5781356121a281611c36565b6001600160a01b03168752958201959082019060010161218f565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906121fb908301868861217f565b828103608084015261220e8185876120c1565b9a9950505050505050505050565b60005b8381101561223757818101518382015260200161221f565b50506000910152565b6000815180845261225881602086016020860161221c565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061229090830184612240565b949350505050565b6040815260006122ac60408301868861217f565b82810360208401526122bf8185876120c1565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156122f957600080fd5b843561230481611c36565b9350602085013561231481611c36565b9250604085013561232481611c36565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156123b3576123b3612375565b604052919050565b60006001600160401b038211156123d4576123d4612375565b5060051b60200190565b600082601f8301126123ef57600080fd5b813560206124046123ff836123bb565b61238b565b82815260059290921b8401810191818101908684111561242357600080fd5b8286015b8481101561243e5780358352918301918301612427565b509695505050505050565b600080600080600060a0868803121561246157600080fd5b8535945060208087013561247481611c36565b9450604087013561248481611c36565b935060608701356001600160401b03808211156124a057600080fd5b818901915089601f8301126124b457600080fd5b81356124c26123ff826123bb565b81815260059190911b8301840190848101908c8311156124e157600080fd5b938501935b828510156125085784356124f981611c36565b825293850193908501906124e6565b96505050608089013592508083111561252057600080fd5b505061252e888289016123de565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b8281101561257d5781516001600160a01b031684529284019290840190600101612558565b5050508381038285015284518082528583019183019060005b818110156125b257835183529284019291840191600101612596565b5090979650505050505050565b600082601f8301126125d057600080fd5b81356001600160401b038111156125e9576125e9612375565b6125fc601f8201601f191660200161238b565b81815284602083860101111561261157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561264457600080fd5b84359350602085013561265681611c36565b925060408501356001600160401b038082111561267257600080fd5b61267e888389016125bf565b9350606087013591508082111561269457600080fd5b506126a1878288016125bf565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906126d190830185612240565b82810360408401526126e38185612240565b9695505050505050565b600082516126ff81846020870161221c565b9190910192915050565b60006020828403121561271b57600080fd5b505191905056fea2646970667358221220d293b100fc5adddbb8fd0cb4e134ee7114418d77a3e89fc4f80cf959061a6cfc64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e610259366004611c96565b610459565b005b61025e610475565b61025e610489565b6101c861027e366004611d18565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e610306366004611d4a565b610508565b61025e610319366004611d67565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e610353366004611d4a565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b4366004611da8565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e1366004611e3e565b6106d7565b61025e6103f4366004611d18565b6108f5565b61025e610407366004611ec6565b610966565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004611ef2565b61097d565b610461610a75565b61046e8585858585610a7d565b5050505050565b61047d610de2565b6104876000610e3c565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581610e3c565b50565b610510610de2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610a75565b61056a838383610e55565b505050565b610577610de2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b6106628888888861115f565b60c9805461ffff191685151561ff001916176101008515150217905561068782610e3c565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107435760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b60fe546001600160a01b038481169116146107b25760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216107e1602060008486611fc0565b6107ea91611fea565b03610809576108046107ff8260208186611fc0565b611254565b6108ef565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610838602060008486611fc0565b61084191611fea565b036108505761080482826114cb565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61087f602060008486611fc0565b61088891611fea565b03610897576108048282611732565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b6108fd610de2565b606580546001600160a01b0383166001600160a01b0319909116811790915561092e6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61096e610a75565b610979823383610e55565b5050565b336002600160a01b03146109a45760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156109c45750600054600160ff909116105b806109de5750303b1580156109de575060005460ff166001145b6109fa5760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610a1d576000805461ff0019166101001790555b610a298585858561115f565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6104876118a2565b84610a8781611ab8565b610aa35760405162461bcd60e51b81526004016104f390612008565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b07919061204a565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610b475760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610b5d57610b5d6120ab565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc9919061204a565b6001600160a01b031614610bdf57610bdf6120ab565b848314610c3a5760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c6a903390889088906004016120f3565b6020604051808303816000875af1158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190612121565b610cc95760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe546040516001600160a01b03928316926316f19831921690610d20907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d906020016121c8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d4c92919061226c565b600060405180830381600087803b158015610d6657600080fd5b505af1158015610d7a573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610dd19493929190612298565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611b4d565b82610e5f81611ab8565b610e7b5760405162461bcd60e51b81526004016104f390612008565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf919061204a565b6001600160a01b0381811660009081526101006020526040902054919250868116911614610f1f5760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610f3557610f356120ab565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa1919061204a565b6001600160a01b031614610fb757610fb76120ab565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610fe590339087906004016122ca565b6020604051808303816000875af1158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612121565b6110445760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110cf9391169160c40161226c565b600060405180830381600087803b1580156110e957600080fd5b505af11580156110fd573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b01333876040516111509291906122ca565b60405180910390a45050505050565b6001600160a01b0384161580159061117f57506001600160a01b03831615155b801561119357506001600160a01b03821615155b80156111a757506001600160a01b03811615155b6112045760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080611265858701876122e3565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806112a95760405162461bcd60e51b81526004016104f390612067565b6112b281611ab8565b6112be576112be6120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611322919061204a565b9050856001600160a01b0316816001600160a01b031614611345576113456120ab565b6001600160a01b03811661135b5761135b6120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c7919061204a565b6001600160a01b0316146113dd576113dd6120ab565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061140b90879087906004016122ca565b6020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190612121565b61146a5760405162461bcd60e51b81526004016104f390612334565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b161188876040516114b99291906122ca565b60405180910390a45050505050505050565b60008080806114dc85870187612449565b6001600160a01b03808516600090815261010060205260409020549499509297509095509350169050806115225760405162461bcd60e51b81526004016104f390612067565b61152b81611ab8565b611537576115376120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b919061204a565b9050856001600160a01b0316816001600160a01b0316146115be576115be6120ab565b6001600160a01b0381166115d4576115d46120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611640919061204a565b6001600160a01b031614611656576116566120ab565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d990611684908790879060040161253b565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190612121565b6116e35760405162461bcd60e51b81526004016104f390612334565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516114b992919061253b565b600080806117428486018661262e565b91955093509150506001600160a01b038316611760576117606120ab565b6001600160a01b03838116600090815261010060205260409020541615611789576117896120ab565b60ff546040516bffffffffffffffffffffffff19606086901b1660208201526000916117d9916001600160a01b039091169060340160405160208183030381529060405280519060200120611b9f565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611830908790879087906004016126ad565b600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff16156119ad57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161190491906126ed565b6000604051808303818686fa925050503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b509150915081801561196a57506000818060200190518101906119689190612709565b115b6119aa5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a1491906126ed565b6000604051808303818686fa925050503d8060008114611a50576040519150601f19603f3d011682016040523d82523d6000602084013e611a55565b606091505b5091509150818015611a7b575080806020019051810190611a769190612709565b600114155b6109795760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611ad457506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611b3b575060408051601f3d908101601f19168201909252611b3891810190612121565b60015b611b4757506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611b475760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b6001600160a01b038116811461050557600080fd5b60008083601f840112611c5d57600080fd5b5081356001600160401b03811115611c7457600080fd5b6020830191508360208260051b8501011115611c8f57600080fd5b9250929050565b600080600080600060608688031215611cae57600080fd5b8535611cb981611c36565b945060208601356001600160401b0380821115611cd557600080fd5b611ce189838a01611c4b565b90965094506040880135915080821115611cfa57600080fd5b50611d0788828901611c4b565b969995985093965092949392505050565b600060208284031215611d2a57600080fd5b8135611d3581611c36565b9392505050565b801515811461050557600080fd5b600060208284031215611d5c57600080fd5b8135611d3581611d3c565b600080600060608486031215611d7c57600080fd5b8335611d8781611c36565b92506020840135611d9781611c36565b929592945050506040919091013590565b600080600080600080600060e0888a031215611dc357600080fd5b8735611dce81611c36565b96506020880135611dde81611c36565b95506040880135611dee81611c36565b94506060880135611dfe81611c36565b93506080880135611e0e81611d3c565b925060a0880135611e1e81611d3c565b915060c0880135611e2e81611c36565b8091505092959891949750929550565b60008060008060608587031215611e5457600080fd5b843593506020850135611e6681611c36565b925060408501356001600160401b0380821115611e8257600080fd5b818701915087601f830112611e9657600080fd5b813581811115611ea557600080fd5b886020828501011115611eb757600080fd5b95989497505060200194505050565b60008060408385031215611ed957600080fd5b8235611ee481611c36565b946020939093013593505050565b60008060008060808587031215611f0857600080fd5b8435611f1381611c36565b93506020850135611f2381611c36565b92506040850135611f3381611c36565b91506060850135611f4381611c36565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611fd057600080fd5b83861115611fdd57600080fd5b5050820193919092039150565b80356020831015611b4757600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561205c57600080fd5b8151611d3581611c36565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156120da57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061211890830184866120c1565b95945050505050565b60006020828403121561213357600080fd5b8151611d3581611d3c565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b858110156121bd5781356121a281611c36565b6001600160a01b03168752958201959082019060010161218f565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906121fb908301868861217f565b828103608084015261220e8185876120c1565b9a9950505050505050505050565b60005b8381101561223757818101518382015260200161221f565b50506000910152565b6000815180845261225881602086016020860161221c565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061229090830184612240565b949350505050565b6040815260006122ac60408301868861217f565b82810360208401526122bf8185876120c1565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156122f957600080fd5b843561230481611c36565b9350602085013561231481611c36565b9250604085013561232481611c36565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156123b3576123b3612375565b604052919050565b60006001600160401b038211156123d4576123d4612375565b5060051b60200190565b600082601f8301126123ef57600080fd5b813560206124046123ff836123bb565b61238b565b82815260059290921b8401810191818101908684111561242357600080fd5b8286015b8481101561243e5780358352918301918301612427565b509695505050505050565b600080600080600060a0868803121561246157600080fd5b8535945060208087013561247481611c36565b9450604087013561248481611c36565b935060608701356001600160401b03808211156124a057600080fd5b818901915089601f8301126124b457600080fd5b81356124c26123ff826123bb565b81815260059190911b8301840190848101908c8311156124e157600080fd5b938501935b828510156125085784356124f981611c36565b825293850193908501906124e6565b96505050608089013592508083111561252057600080fd5b505061252e888289016123de565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b8281101561257d5781516001600160a01b031684529284019290840190600101612558565b5050508381038285015284518082528583019183019060005b818110156125b257835183529284019291840191600101612596565b5090979650505050505050565b600082601f8301126125d057600080fd5b81356001600160401b038111156125e9576125e9612375565b6125fc601f8201601f191660200161238b565b81815284602083860101111561261157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561264457600080fd5b84359350602085013561265681611c36565b925060408501356001600160401b038082111561267257600080fd5b61267e888389016125bf565b9350606087013591508082111561269457600080fd5b506126a1878288016125bf565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906126d190830185612240565b82810360408401526126e38185612240565b9695505050505050565b600082516126ff81846020870161221c565b9190910192915050565b60006020828403121561271b57600080fd5b505191905056fea2646970667358221220d293b100fc5adddbb8fd0cb4e134ee7114418d77a3e89fc4f80cf959061a6cfc64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC721PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721Predicate","sourceName":"contracts/child/ChildERC721Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061234b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b6102066102013660046119e3565b610382565b005b610170610216366004611a65565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611a89565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611aca565b6103a6565b610206610330366004611b52565b6108d0565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d366004611b7e565b6108df565b61038f8585858585610a3b565b5050505050565b6103a1838383610d9f565b505050565b6103dd604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b8152506110a8565b6034546001600160a01b0316331461044e5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6104856040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b8152506110a8565b6035546001600160a01b038481169116146104f45760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b6064820152608401610445565b61052b604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b8152506110a8565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161055a602060008486611bda565b61056391611c04565b0361065e5761059f6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b8152506110a8565b6105d6604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b8152506110a8565b6105eb6105e68260208186611bda565b6110ee565b6106226040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b8152506110a8565b610659604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b8152506110a8565b6108ca565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861068d602060008486611bda565b61069691611c04565b03610783576106d260405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b8152506110a8565b610709604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b8152506110a8565b6107138282611364565b61074b6040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b8152506110a8565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b8152506110a8565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107b2602060008486611bda565b6107bb91611c04565b0361083a576107f86040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b8152506110a8565b61080282826115ca565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b8152506110a8565b6108726040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b8152506110a8565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b6064820152608401610445565b50505050565b6108db823383610d9f565b5050565b336002600160a01b03146109235760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610445565b600054610100900460ff16158080156109435750600054600160ff909116105b8061095d5750303b15801561095d575060005460ff166001145b6109c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b6000805460ff1916600117905580156109e3576000805461ff0019166101001790555b6109ef85858585611738565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b84610a458161182d565b610a615760405162461bcd60e51b815260040161044590611c22565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190611c64565b6001600160a01b03818116600090815260376020526040902054919250888116911614610b045760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610b1a57610b1a611cc5565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b869190611c64565b6001600160a01b031614610b9c57610b9c611cc5565b848314610bf75760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b6064820152608401610445565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c2790339088908890600401611d0d565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611d3b565b610c865760405162461bcd60e51b815260040161044590611d5d565b6033546035546040516001600160a01b03928316926316f19831921690610cdd907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611de7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d09929190611e81565b600060405180830381600087803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610d8e9493929190611ead565b60405180910390a450505050505050565b82610da98161182d565b610dc55760405162461bcd60e51b815260040161044590611c22565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611c64565b6001600160a01b03818116600090815260376020526040902054919250868116911614610e685760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610e7e57610e7e611cc5565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190611c64565b6001600160a01b031614610f0057610f00611cc5565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610f2e9033908790600401611edf565b6020604051808303816000875af1158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190611d3b565b610f8d5760405162461bcd60e51b815260040161044590611d5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110189391169160c401611e81565b600060405180830381600087803b15801561103257600080fd5b505af1158015611046573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051611099929190611edf565b60405180910390a45050505050565b6110eb816040516024016110bc9190611ef8565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118c2565b50565b60008080806110ff85870187611f0b565b6001600160a01b03808516600090815260376020526040902054949850929650909450925016806111425760405162461bcd60e51b815260040161044590611c81565b61114b8161182d565b61115757611157611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bb9190611c64565b9050856001600160a01b0316816001600160a01b0316146111de576111de611cc5565b6001600160a01b0381166111f4576111f4611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112609190611c64565b6001600160a01b03161461127657611276611cc5565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112a49087908790600401611edf565b6020604051808303816000875af11580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e79190611d3b565b6113035760405162461bcd60e51b815260040161044590611f5c565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611352929190611edf565b60405180910390a45050505050505050565b600080808061137585870187612071565b6001600160a01b038085166000908152603760205260409020549499509297509095509350169050806113ba5760405162461bcd60e51b815260040161044590611c81565b6113c38161182d565b6113cf576113cf611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190611c64565b9050856001600160a01b0316816001600160a01b03161461145657611456611cc5565b6001600160a01b03811661146c5761146c611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190611c64565b6001600160a01b0316146114ee576114ee611cc5565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d99061151c9087908790600401612163565b6020604051808303816000875af115801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190611d3b565b61157b5760405162461bcd60e51b815260040161044590611f5c565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611352929190612163565b600080806115da84860186612256565b91955093509150506001600160a01b0383166115f8576115f8611cc5565b6001600160a01b03838116600090815260376020526040902054161561162057611620611cc5565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611670916001600160a01b0390911690603401604051602081830303815290604052805190602001206118cb565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b8152919250906390657147906116c6908790879087906004016122d5565b600060405180830381600087803b1580156116e057600080fd5b505af11580156116f4573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061175857506001600160a01b03831615155b801561176c57506001600160a01b03821615155b801561178057506001600160a01b03811615155b6117dd5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b6064820152608401610445565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361184957506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118b0575060408051601f3d908101601f191682019092526118ad91810190611d3b565b60015b6118bc57506000919050565b92915050565b6110eb81611962565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118bc5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610445565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146110eb57600080fd5b60008083601f8401126119aa57600080fd5b5081356001600160401b038111156119c157600080fd5b6020830191508360208260051b85010111156119dc57600080fd5b9250929050565b6000806000806000606086880312156119fb57600080fd5b8535611a0681611983565b945060208601356001600160401b0380821115611a2257600080fd5b611a2e89838a01611998565b90965094506040880135915080821115611a4757600080fd5b50611a5488828901611998565b969995985093965092949392505050565b600060208284031215611a7757600080fd5b8135611a8281611983565b9392505050565b600080600060608486031215611a9e57600080fd5b8335611aa981611983565b92506020840135611ab981611983565b929592945050506040919091013590565b60008060008060608587031215611ae057600080fd5b843593506020850135611af281611983565b925060408501356001600160401b0380821115611b0e57600080fd5b818701915087601f830112611b2257600080fd5b813581811115611b3157600080fd5b886020828501011115611b4357600080fd5b95989497505060200194505050565b60008060408385031215611b6557600080fd5b8235611b7081611983565b946020939093013593505050565b60008060008060808587031215611b9457600080fd5b8435611b9f81611983565b93506020850135611baf81611983565b92506040850135611bbf81611983565b91506060850135611bcf81611983565b939692955090935050565b60008085851115611bea57600080fd5b83861115611bf757600080fd5b5050820193919092039150565b803560208310156118bc57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b600060208284031215611c7657600080fd5b8151611a8281611983565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611cf457600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0384168152604060208201819052600090611d329083018486611cdb565b95945050505050565b600060208284031215611d4d57600080fd5b81518015158114611a8257600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611ddc578135611dc181611983565b6001600160a01b031687529582019590820190600101611dae565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611e1a9083018688611d9e565b8281036080840152611e2d818587611cdb565b9a9950505050505050505050565b6000815180845260005b81811015611e6157602081850181015186830182015201611e45565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611ea590830184611e3b565b949350505050565b604081526000611ec1604083018688611d9e565b8281036020840152611ed4818587611cdb565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b602081526000611a826020830184611e3b565b60008060008060808587031215611f2157600080fd5b8435611f2c81611983565b93506020850135611f3c81611983565b92506040850135611f4c81611983565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fdb57611fdb611f9d565b604052919050565b60006001600160401b03821115611ffc57611ffc611f9d565b5060051b60200190565b600082601f83011261201757600080fd5b8135602061202c61202783611fe3565b611fb3565b82815260059290921b8401810191818101908684111561204b57600080fd5b8286015b84811015612066578035835291830191830161204f565b509695505050505050565b600080600080600060a0868803121561208957600080fd5b8535945060208087013561209c81611983565b945060408701356120ac81611983565b935060608701356001600160401b03808211156120c857600080fd5b818901915089601f8301126120dc57600080fd5b81356120ea61202782611fe3565b81815260059190911b8301840190848101908c83111561210957600080fd5b938501935b8285101561213057843561212181611983565b8252938501939085019061210e565b96505050608089013592508083111561214857600080fd5b505061215688828901612006565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156121a55781516001600160a01b031684529284019290840190600101612180565b5050508381038285015284518082528583019183019060005b818110156121da578351835292840192918401916001016121be565b5090979650505050505050565b600082601f8301126121f857600080fd5b81356001600160401b0381111561221157612211611f9d565b612224601f8201601f1916602001611fb3565b81815284602083860101111561223957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561226c57600080fd5b84359350602085013561227e81611983565b925060408501356001600160401b038082111561229a57600080fd5b6122a6888389016121e7565b935060608701359150808211156122bc57600080fd5b506122c9878288016121e7565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906122f990830185611e3b565b828103604084015261230b8185611e3b565b969550505050505056fea2646970667358221220741155e0346f92320f8a88455bb9a1d38fea5128fee6f0019f35598b488bdb2264736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b6102066102013660046119e3565b610382565b005b610170610216366004611a65565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611a89565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611aca565b6103a6565b610206610330366004611b52565b6108d0565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d366004611b7e565b6108df565b61038f8585858585610a3b565b5050505050565b6103a1838383610d9f565b505050565b6103dd604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b8152506110a8565b6034546001600160a01b0316331461044e5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6104856040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b8152506110a8565b6035546001600160a01b038481169116146104f45760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b6064820152608401610445565b61052b604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b8152506110a8565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161055a602060008486611bda565b61056391611c04565b0361065e5761059f6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b8152506110a8565b6105d6604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b8152506110a8565b6105eb6105e68260208186611bda565b6110ee565b6106226040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b8152506110a8565b610659604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b8152506110a8565b6108ca565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861068d602060008486611bda565b61069691611c04565b03610783576106d260405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b8152506110a8565b610709604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b8152506110a8565b6107138282611364565b61074b6040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b8152506110a8565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b8152506110a8565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107b2602060008486611bda565b6107bb91611c04565b0361083a576107f86040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b8152506110a8565b61080282826115ca565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b8152506110a8565b6108726040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b8152506110a8565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b6064820152608401610445565b50505050565b6108db823383610d9f565b5050565b336002600160a01b03146109235760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610445565b600054610100900460ff16158080156109435750600054600160ff909116105b8061095d5750303b15801561095d575060005460ff166001145b6109c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b6000805460ff1916600117905580156109e3576000805461ff0019166101001790555b6109ef85858585611738565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b84610a458161182d565b610a615760405162461bcd60e51b815260040161044590611c22565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190611c64565b6001600160a01b03818116600090815260376020526040902054919250888116911614610b045760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610b1a57610b1a611cc5565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b869190611c64565b6001600160a01b031614610b9c57610b9c611cc5565b848314610bf75760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b6064820152608401610445565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c2790339088908890600401611d0d565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611d3b565b610c865760405162461bcd60e51b815260040161044590611d5d565b6033546035546040516001600160a01b03928316926316f19831921690610cdd907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611de7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d09929190611e81565b600060405180830381600087803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610d8e9493929190611ead565b60405180910390a450505050505050565b82610da98161182d565b610dc55760405162461bcd60e51b815260040161044590611c22565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611c64565b6001600160a01b03818116600090815260376020526040902054919250868116911614610e685760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610e7e57610e7e611cc5565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190611c64565b6001600160a01b031614610f0057610f00611cc5565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610f2e9033908790600401611edf565b6020604051808303816000875af1158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190611d3b565b610f8d5760405162461bcd60e51b815260040161044590611d5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110189391169160c401611e81565b600060405180830381600087803b15801561103257600080fd5b505af1158015611046573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051611099929190611edf565b60405180910390a45050505050565b6110eb816040516024016110bc9190611ef8565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118c2565b50565b60008080806110ff85870187611f0b565b6001600160a01b03808516600090815260376020526040902054949850929650909450925016806111425760405162461bcd60e51b815260040161044590611c81565b61114b8161182d565b61115757611157611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bb9190611c64565b9050856001600160a01b0316816001600160a01b0316146111de576111de611cc5565b6001600160a01b0381166111f4576111f4611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112609190611c64565b6001600160a01b03161461127657611276611cc5565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112a49087908790600401611edf565b6020604051808303816000875af11580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e79190611d3b565b6113035760405162461bcd60e51b815260040161044590611f5c565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611352929190611edf565b60405180910390a45050505050505050565b600080808061137585870187612071565b6001600160a01b038085166000908152603760205260409020549499509297509095509350169050806113ba5760405162461bcd60e51b815260040161044590611c81565b6113c38161182d565b6113cf576113cf611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190611c64565b9050856001600160a01b0316816001600160a01b03161461145657611456611cc5565b6001600160a01b03811661146c5761146c611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190611c64565b6001600160a01b0316146114ee576114ee611cc5565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d99061151c9087908790600401612163565b6020604051808303816000875af115801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190611d3b565b61157b5760405162461bcd60e51b815260040161044590611f5c565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611352929190612163565b600080806115da84860186612256565b91955093509150506001600160a01b0383166115f8576115f8611cc5565b6001600160a01b03838116600090815260376020526040902054161561162057611620611cc5565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611670916001600160a01b0390911690603401604051602081830303815290604052805190602001206118cb565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b8152919250906390657147906116c6908790879087906004016122d5565b600060405180830381600087803b1580156116e057600080fd5b505af11580156116f4573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061175857506001600160a01b03831615155b801561176c57506001600160a01b03821615155b801561178057506001600160a01b03811615155b6117dd5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b6064820152608401610445565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361184957506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118b0575060408051601f3d908101601f191682019092526118ad91810190611d3b565b60015b6118bc57506000919050565b92915050565b6110eb81611962565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118bc5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610445565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146110eb57600080fd5b60008083601f8401126119aa57600080fd5b5081356001600160401b038111156119c157600080fd5b6020830191508360208260051b85010111156119dc57600080fd5b9250929050565b6000806000806000606086880312156119fb57600080fd5b8535611a0681611983565b945060208601356001600160401b0380821115611a2257600080fd5b611a2e89838a01611998565b90965094506040880135915080821115611a4757600080fd5b50611a5488828901611998565b969995985093965092949392505050565b600060208284031215611a7757600080fd5b8135611a8281611983565b9392505050565b600080600060608486031215611a9e57600080fd5b8335611aa981611983565b92506020840135611ab981611983565b929592945050506040919091013590565b60008060008060608587031215611ae057600080fd5b843593506020850135611af281611983565b925060408501356001600160401b0380821115611b0e57600080fd5b818701915087601f830112611b2257600080fd5b813581811115611b3157600080fd5b886020828501011115611b4357600080fd5b95989497505060200194505050565b60008060408385031215611b6557600080fd5b8235611b7081611983565b946020939093013593505050565b60008060008060808587031215611b9457600080fd5b8435611b9f81611983565b93506020850135611baf81611983565b92506040850135611bbf81611983565b91506060850135611bcf81611983565b939692955090935050565b60008085851115611bea57600080fd5b83861115611bf757600080fd5b5050820193919092039150565b803560208310156118bc57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b600060208284031215611c7657600080fd5b8151611a8281611983565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611cf457600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0384168152604060208201819052600090611d329083018486611cdb565b95945050505050565b600060208284031215611d4d57600080fd5b81518015158114611a8257600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611ddc578135611dc181611983565b6001600160a01b031687529582019590820190600101611dae565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611e1a9083018688611d9e565b8281036080840152611e2d818587611cdb565b9a9950505050505050505050565b6000815180845260005b81811015611e6157602081850181015186830182015201611e45565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611ea590830184611e3b565b949350505050565b604081526000611ec1604083018688611d9e565b8281036020840152611ed4818587611cdb565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b602081526000611a826020830184611e3b565b60008060008060808587031215611f2157600080fd5b8435611f2c81611983565b93506020850135611f3c81611983565b92506040850135611f4c81611983565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fdb57611fdb611f9d565b604052919050565b60006001600160401b03821115611ffc57611ffc611f9d565b5060051b60200190565b600082601f83011261201757600080fd5b8135602061202c61202783611fe3565b611fb3565b82815260059290921b8401810191818101908684111561204b57600080fd5b8286015b84811015612066578035835291830191830161204f565b509695505050505050565b600080600080600060a0868803121561208957600080fd5b8535945060208087013561209c81611983565b945060408701356120ac81611983565b935060608701356001600160401b03808211156120c857600080fd5b818901915089601f8301126120dc57600080fd5b81356120ea61202782611fe3565b81815260059190911b8301840190848101908c83111561210957600080fd5b938501935b8285101561213057843561212181611983565b8252938501939085019061210e565b96505050608089013592508083111561214857600080fd5b505061215688828901612006565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156121a55781516001600160a01b031684529284019290840190600101612180565b5050508381038285015284518082528583019183019060005b818110156121da578351835292840192918401916001016121be565b5090979650505050505050565b600082601f8301126121f857600080fd5b81356001600160401b0381111561221157612211611f9d565b612224601f8201601f1916602001611fb3565b81815284602083860101111561223957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561226c57600080fd5b84359350602085013561227e81611983565b925060408501356001600160401b038082111561229a57600080fd5b6122a6888389016121e7565b935060608701359150808211156122bc57600080fd5b506122c9878288016121e7565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906122f990830185611e3b565b828103604084015261230b8185611e3b565b969550505050505056fea2646970667358221220741155e0346f92320f8a88455bb9a1d38fea5128fee6f0019f35598b488bdb2264736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC721PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721PredicateAccessList","sourceName":"contracts/child/ChildERC721PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612adf806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e61025936600461200a565b610459565b005b61025e610475565b61025e610489565b6101c861027e36600461208c565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e6103063660046120be565b610508565b61025e6103193660046120db565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e6103533660046120be565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b436600461211c565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e13660046121b2565b6106d7565b61025e6103f436600461208c565b610bfc565b61025e61040736600461223a565b610c6d565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004612266565b610c84565b610461610d7c565b61046e8585858585610d84565b5050505050565b61047d6110e9565b6104876000611143565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581611143565b50565b6105106110e9565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610d7c565b61056a83838361115c565b505050565b6105776110e9565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b61066288888888611466565b60c9805461ffff191685151561ff001916176101008515150217905561068782611143565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61070e604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b81525061155b565b60fd546001600160a01b0316331461077a5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b6107b16040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b81525061155b565b60fe546001600160a01b038481169116146108205760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b610857604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b81525061155b565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610886602060008486612334565b61088f9161235e565b0361098a576108cb6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b81525061155b565b610902604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b81525061155b565b6109176109128260208186612334565b61159e565b61094e6040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b81525061155b565b610985604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b81525061155b565b610bf6565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109b9602060008486612334565b6109c29161235e565b03610aaf576109fe60405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b81525061155b565b610a35604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b81525061155b565b610a3f8282611815565b610a776040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b81525061155b565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b81525061155b565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610ade602060008486612334565b610ae79161235e565b03610b6657610b246040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b81525061155b565b610b2e8282611a7c565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b81525061155b565b610b9e6040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b81525061155b565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b610c046110e9565b606580546001600160a01b0383166001600160a01b03199091168117909155610c356033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610c75610d7c565b610c8082338361115c565b5050565b336002600160a01b0314610cab5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff1615808015610ccb5750600054600160ff909116105b80610ce55750303b158015610ce5575060005460ff166001145b610d015760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610d24576000805461ff0019166101001790555b610d3085858585611466565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b610487611bec565b84610d8e81611e02565b610daa5760405162461bcd60e51b81526004016104f39061237c565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906123be565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610e4e5760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b038116610e6457610e6461241f565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed091906123be565b6001600160a01b031614610ee657610ee661241f565b848314610f415760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610f7190339088908890600401612467565b6020604051808303816000875af1158015610f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb49190612495565b610fd05760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe546040516001600160a01b03928316926316f19831921690611027907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d9060200161253c565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110539291906125e0565b600060405180830381600087803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f522898989896040516110d8949392919061260c565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611e97565b8261116681611e02565b6111825760405162461bcd60e51b81526004016104f39061237c565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906123be565b6001600160a01b03818116600090815261010060205260409020549192508681169116146112265760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b03811661123c5761123c61241f565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906123be565b6001600160a01b0316146112be576112be61241f565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac906112ec903390879060040161263e565b6020604051808303816000875af115801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132f9190612495565b61134b5760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936113d69391169160c4016125e0565b600060405180830381600087803b1580156113f057600080fd5b505af1158015611404573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b013338760405161145792919061263e565b60405180910390a45050505050565b6001600160a01b0384161580159061148657506001600160a01b03831615155b801561149a57506001600160a01b03821615155b80156114ae57506001600160a01b03811615155b61150b5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6105058160405160240161156f9190612657565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611ee9565b60008080806115af8587018761266a565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806115f35760405162461bcd60e51b81526004016104f3906123db565b6115fc81611e02565b6116085761160861241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906123be565b9050856001600160a01b0316816001600160a01b03161461168f5761168f61241f565b6001600160a01b0381166116a5576116a561241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171191906123be565b6001600160a01b0316146117275761172761241f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611755908790879060040161263e565b6020604051808303816000875af1158015611774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117989190612495565b6117b45760405162461bcd60e51b81526004016104f3906126bb565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b1611888760405161180392919061263e565b60405180910390a45050505050505050565b6000808080611826858701876127d0565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061186c5760405162461bcd60e51b81526004016104f3906123db565b61187581611e02565b6118815761188161241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906123be565b9050856001600160a01b0316816001600160a01b0316146119085761190861241f565b6001600160a01b03811661191e5761191e61241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a91906123be565b6001600160a01b0316146119a0576119a061241f565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906119ce90879087906004016128c2565b6020604051808303816000875af11580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a119190612495565b611a2d5760405162461bcd60e51b81526004016104f3906126bb565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516118039291906128c2565b60008080611a8c848601866129b5565b91955093509150506001600160a01b038316611aaa57611aaa61241f565b6001600160a01b03838116600090815261010060205260409020541615611ad357611ad361241f565b60ff546040516bffffffffffffffffffffffff19606086901b166020820152600091611b23916001600160a01b039091169060340160405160208183030381529060405280519060200120611ef2565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611b7a90879087908790600401612a34565b600060405180830381600087803b158015611b9457600080fd5b505af1158015611ba8573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff1615611cf757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611c4e9190612a74565b6000604051808303818686fa925050503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091509150818015611cb45750600081806020019051810190611cb29190612a90565b115b611cf45760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611d5e9190612a74565b6000604051808303818686fa925050503d8060008114611d9a576040519150601f19603f3d011682016040523d82523d6000602084013e611d9f565b606091505b5091509150818015611dc5575080806020019051810190611dc09190612a90565b600114155b610c805760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611e1e57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611e85575060408051601f3d908101601f19168201909252611e8291810190612495565b60015b611e9157506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61050581611f89565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611e915760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461050557600080fd5b60008083601f840112611fd157600080fd5b5081356001600160401b03811115611fe857600080fd5b6020830191508360208260051b850101111561200357600080fd5b9250929050565b60008060008060006060868803121561202257600080fd5b853561202d81611faa565b945060208601356001600160401b038082111561204957600080fd5b61205589838a01611fbf565b9096509450604088013591508082111561206e57600080fd5b5061207b88828901611fbf565b969995985093965092949392505050565b60006020828403121561209e57600080fd5b81356120a981611faa565b9392505050565b801515811461050557600080fd5b6000602082840312156120d057600080fd5b81356120a9816120b0565b6000806000606084860312156120f057600080fd5b83356120fb81611faa565b9250602084013561210b81611faa565b929592945050506040919091013590565b600080600080600080600060e0888a03121561213757600080fd5b873561214281611faa565b9650602088013561215281611faa565b9550604088013561216281611faa565b9450606088013561217281611faa565b93506080880135612182816120b0565b925060a0880135612192816120b0565b915060c08801356121a281611faa565b8091505092959891949750929550565b600080600080606085870312156121c857600080fd5b8435935060208501356121da81611faa565b925060408501356001600160401b03808211156121f657600080fd5b818701915087601f83011261220a57600080fd5b81358181111561221957600080fd5b88602082850101111561222b57600080fd5b95989497505060200194505050565b6000806040838503121561224d57600080fd5b823561225881611faa565b946020939093013593505050565b6000806000806080858703121561227c57600080fd5b843561228781611faa565b9350602085013561229781611faa565b925060408501356122a781611faa565b915060608501356122b781611faa565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561234457600080fd5b8386111561235157600080fd5b5050820193919092039150565b80356020831015611e9157600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b6000602082840312156123d057600080fd5b81516120a981611faa565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561244e57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061248c9083018486612435565b95945050505050565b6000602082840312156124a757600080fd5b81516120a9816120b0565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b8581101561253157813561251681611faa565b6001600160a01b031687529582019590820190600101612503565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061256f90830186886124f3565b8281036080840152612582818587612435565b9a9950505050505050505050565b60005b838110156125ab578181015183820152602001612593565b50506000910152565b600081518084526125cc816020860160208601612590565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612604908301846125b4565b949350505050565b6040815260006126206040830186886124f3565b8281036020840152612633818587612435565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006120a960208301846125b4565b6000806000806080858703121561268057600080fd5b843561268b81611faa565b9350602085013561269b81611faa565b925060408501356126ab81611faa565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561273a5761273a6126fc565b604052919050565b60006001600160401b0382111561275b5761275b6126fc565b5060051b60200190565b600082601f83011261277657600080fd5b8135602061278b61278683612742565b612712565b82815260059290921b840181019181810190868411156127aa57600080fd5b8286015b848110156127c557803583529183019183016127ae565b509695505050505050565b600080600080600060a086880312156127e857600080fd5b853594506020808701356127fb81611faa565b9450604087013561280b81611faa565b935060608701356001600160401b038082111561282757600080fd5b818901915089601f83011261283b57600080fd5b813561284961278682612742565b81815260059190911b8301840190848101908c83111561286857600080fd5b938501935b8285101561288f57843561288081611faa565b8252938501939085019061286d565b9650505060808901359250808311156128a757600080fd5b50506128b588828901612765565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156129045781516001600160a01b0316845292840192908401906001016128df565b5050508381038285015284518082528583019183019060005b818110156129395783518352928401929184019160010161291d565b5090979650505050505050565b600082601f83011261295757600080fd5b81356001600160401b03811115612970576129706126fc565b612983601f8201601f1916602001612712565b81815284602083860101111561299857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156129cb57600080fd5b8435935060208501356129dd81611faa565b925060408501356001600160401b03808211156129f957600080fd5b612a0588838901612946565b93506060870135915080821115612a1b57600080fd5b50612a2887828801612946565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090612a58908301856125b4565b8281036040840152612a6a81856125b4565b9695505050505050565b60008251612a86818460208701612590565b9190910192915050565b600060208284031215612aa257600080fd5b505191905056fea264697066735822122044644a695e67b11faad02d8e6c3e64baa59733d7beceae5d135f4b7db90089db64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e61025936600461200a565b610459565b005b61025e610475565b61025e610489565b6101c861027e36600461208c565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e6103063660046120be565b610508565b61025e6103193660046120db565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e6103533660046120be565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b436600461211c565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e13660046121b2565b6106d7565b61025e6103f436600461208c565b610bfc565b61025e61040736600461223a565b610c6d565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004612266565b610c84565b610461610d7c565b61046e8585858585610d84565b5050505050565b61047d6110e9565b6104876000611143565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581611143565b50565b6105106110e9565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610d7c565b61056a83838361115c565b505050565b6105776110e9565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b61066288888888611466565b60c9805461ffff191685151561ff001916176101008515150217905561068782611143565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61070e604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b81525061155b565b60fd546001600160a01b0316331461077a5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b6107b16040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b81525061155b565b60fe546001600160a01b038481169116146108205760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b610857604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b81525061155b565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610886602060008486612334565b61088f9161235e565b0361098a576108cb6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b81525061155b565b610902604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b81525061155b565b6109176109128260208186612334565b61159e565b61094e6040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b81525061155b565b610985604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b81525061155b565b610bf6565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109b9602060008486612334565b6109c29161235e565b03610aaf576109fe60405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b81525061155b565b610a35604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b81525061155b565b610a3f8282611815565b610a776040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b81525061155b565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b81525061155b565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610ade602060008486612334565b610ae79161235e565b03610b6657610b246040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b81525061155b565b610b2e8282611a7c565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b81525061155b565b610b9e6040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b81525061155b565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b610c046110e9565b606580546001600160a01b0383166001600160a01b03199091168117909155610c356033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610c75610d7c565b610c8082338361115c565b5050565b336002600160a01b0314610cab5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff1615808015610ccb5750600054600160ff909116105b80610ce55750303b158015610ce5575060005460ff166001145b610d015760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610d24576000805461ff0019166101001790555b610d3085858585611466565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b610487611bec565b84610d8e81611e02565b610daa5760405162461bcd60e51b81526004016104f39061237c565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906123be565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610e4e5760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b038116610e6457610e6461241f565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed091906123be565b6001600160a01b031614610ee657610ee661241f565b848314610f415760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610f7190339088908890600401612467565b6020604051808303816000875af1158015610f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb49190612495565b610fd05760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe546040516001600160a01b03928316926316f19831921690611027907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d9060200161253c565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110539291906125e0565b600060405180830381600087803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f522898989896040516110d8949392919061260c565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611e97565b8261116681611e02565b6111825760405162461bcd60e51b81526004016104f39061237c565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906123be565b6001600160a01b03818116600090815261010060205260409020549192508681169116146112265760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b03811661123c5761123c61241f565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906123be565b6001600160a01b0316146112be576112be61241f565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac906112ec903390879060040161263e565b6020604051808303816000875af115801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132f9190612495565b61134b5760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936113d69391169160c4016125e0565b600060405180830381600087803b1580156113f057600080fd5b505af1158015611404573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b013338760405161145792919061263e565b60405180910390a45050505050565b6001600160a01b0384161580159061148657506001600160a01b03831615155b801561149a57506001600160a01b03821615155b80156114ae57506001600160a01b03811615155b61150b5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6105058160405160240161156f9190612657565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611ee9565b60008080806115af8587018761266a565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806115f35760405162461bcd60e51b81526004016104f3906123db565b6115fc81611e02565b6116085761160861241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906123be565b9050856001600160a01b0316816001600160a01b03161461168f5761168f61241f565b6001600160a01b0381166116a5576116a561241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171191906123be565b6001600160a01b0316146117275761172761241f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611755908790879060040161263e565b6020604051808303816000875af1158015611774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117989190612495565b6117b45760405162461bcd60e51b81526004016104f3906126bb565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b1611888760405161180392919061263e565b60405180910390a45050505050505050565b6000808080611826858701876127d0565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061186c5760405162461bcd60e51b81526004016104f3906123db565b61187581611e02565b6118815761188161241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906123be565b9050856001600160a01b0316816001600160a01b0316146119085761190861241f565b6001600160a01b03811661191e5761191e61241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a91906123be565b6001600160a01b0316146119a0576119a061241f565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906119ce90879087906004016128c2565b6020604051808303816000875af11580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a119190612495565b611a2d5760405162461bcd60e51b81526004016104f3906126bb565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516118039291906128c2565b60008080611a8c848601866129b5565b91955093509150506001600160a01b038316611aaa57611aaa61241f565b6001600160a01b03838116600090815261010060205260409020541615611ad357611ad361241f565b60ff546040516bffffffffffffffffffffffff19606086901b166020820152600091611b23916001600160a01b039091169060340160405160208183030381529060405280519060200120611ef2565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611b7a90879087908790600401612a34565b600060405180830381600087803b158015611b9457600080fd5b505af1158015611ba8573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff1615611cf757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611c4e9190612a74565b6000604051808303818686fa925050503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091509150818015611cb45750600081806020019051810190611cb29190612a90565b115b611cf45760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611d5e9190612a74565b6000604051808303818686fa925050503d8060008114611d9a576040519150601f19603f3d011682016040523d82523d6000602084013e611d9f565b606091505b5091509150818015611dc5575080806020019051810190611dc09190612a90565b600114155b610c805760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611e1e57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611e85575060408051601f3d908101601f19168201909252611e8291810190612495565b60015b611e9157506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61050581611f89565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611e915760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461050557600080fd5b60008083601f840112611fd157600080fd5b5081356001600160401b03811115611fe857600080fd5b6020830191508360208260051b850101111561200357600080fd5b9250929050565b60008060008060006060868803121561202257600080fd5b853561202d81611faa565b945060208601356001600160401b038082111561204957600080fd5b61205589838a01611fbf565b9096509450604088013591508082111561206e57600080fd5b5061207b88828901611fbf565b969995985093965092949392505050565b60006020828403121561209e57600080fd5b81356120a981611faa565b9392505050565b801515811461050557600080fd5b6000602082840312156120d057600080fd5b81356120a9816120b0565b6000806000606084860312156120f057600080fd5b83356120fb81611faa565b9250602084013561210b81611faa565b929592945050506040919091013590565b600080600080600080600060e0888a03121561213757600080fd5b873561214281611faa565b9650602088013561215281611faa565b9550604088013561216281611faa565b9450606088013561217281611faa565b93506080880135612182816120b0565b925060a0880135612192816120b0565b915060c08801356121a281611faa565b8091505092959891949750929550565b600080600080606085870312156121c857600080fd5b8435935060208501356121da81611faa565b925060408501356001600160401b03808211156121f657600080fd5b818701915087601f83011261220a57600080fd5b81358181111561221957600080fd5b88602082850101111561222b57600080fd5b95989497505060200194505050565b6000806040838503121561224d57600080fd5b823561225881611faa565b946020939093013593505050565b6000806000806080858703121561227c57600080fd5b843561228781611faa565b9350602085013561229781611faa565b925060408501356122a781611faa565b915060608501356122b781611faa565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561234457600080fd5b8386111561235157600080fd5b5050820193919092039150565b80356020831015611e9157600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b6000602082840312156123d057600080fd5b81516120a981611faa565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561244e57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061248c9083018486612435565b95945050505050565b6000602082840312156124a757600080fd5b81516120a9816120b0565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b8581101561253157813561251681611faa565b6001600160a01b031687529582019590820190600101612503565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061256f90830186886124f3565b8281036080840152612582818587612435565b9a9950505050505050505050565b60005b838110156125ab578181015183820152602001612593565b50506000910152565b600081518084526125cc816020860160208601612590565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612604908301846125b4565b949350505050565b6040815260006126206040830186886124f3565b8281036020840152612633818587612435565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006120a960208301846125b4565b6000806000806080858703121561268057600080fd5b843561268b81611faa565b9350602085013561269b81611faa565b925060408501356126ab81611faa565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561273a5761273a6126fc565b604052919050565b60006001600160401b0382111561275b5761275b6126fc565b5060051b60200190565b600082601f83011261277657600080fd5b8135602061278b61278683612742565b612712565b82815260059290921b840181019181810190868411156127aa57600080fd5b8286015b848110156127c557803583529183019183016127ae565b509695505050505050565b600080600080600060a086880312156127e857600080fd5b853594506020808701356127fb81611faa565b9450604087013561280b81611faa565b935060608701356001600160401b038082111561282757600080fd5b818901915089601f83011261283b57600080fd5b813561284961278682612742565b81815260059190911b8301840190848101908c83111561286857600080fd5b938501935b8285101561288f57843561288081611faa565b8252938501939085019061286d565b9650505060808901359250808311156128a757600080fd5b50506128b588828901612765565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156129045781516001600160a01b0316845292840192908401906001016128df565b5050508381038285015284518082528583019183019060005b818110156129395783518352928401929184019160010161291d565b5090979650505050505050565b600082601f83011261295757600080fd5b81356001600160401b03811115612970576129706126fc565b612983601f8201601f1916602001612712565b81815284602083860101111561299857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156129cb57600080fd5b8435935060208501356129dd81611faa565b925060408501356001600160401b03808211156129f957600080fd5b612a0588838901612946565b93506060870135915080821115612a1b57600080fd5b50612a2887828801612946565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090612a58908301856125b4565b8281036040840152612a6a81856125b4565b9695505050505050565b60008251612a86818460208701612590565b9190910192915050565b600060208284031215612aa257600080fd5b505191905056fea264697066735822122044644a695e67b11faad02d8e6c3e64baa59733d7beceae5d135f4b7db90089db64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC721PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC721Predicate","sourceName":"contracts/child/RootMintableERC721Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611a8f806100206000396000f3fe608060405234801561001057600080fd5b506004361061016e5760003560e01c806397e5230d116100ce578063e0563ab111610087578063e0563ab114610353578063eeb499451461035c578063f213159c1461036f578063f4a120f714610382578063f645125514610395578063f8c8765e146103bc578063ff6f870c146103cf57600080fd5b806397e5230d1461029a578063b1768065146102a4578063b68ad1e4146102cb578063c5ac2b1c146102de578063d41f177114610305578063d7c9e3ec1461032c57600080fd5b806347e7ef241161012b57806347e7ef241461020d5780634fdca69d1461022257806351351d531461023557806355b01e4d146102435780635ea5df79146102515780637efab4f514610268578063947287cf1461029157600080fd5b806305dc2e8f1461017357806307b3e252146101a3578063150b7a02146101b15780631bc114ba146101e8578063284017f5146101fb5780633b878c2214610204575b600080fd5b603454610186906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101866004600360981b0181565b6101cf6101bf366004611231565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161019a565b603354610186906001600160a01b031681565b61018661202081565b61018661101081565b61022061021b3660046112df565b6103e2565b005b603554610186906001600160a01b031681565b6101866002600160a01b0381565b6101866004600160991b0181565b61025a61138881565b60405190815260200161019a565b61018661027636600461130b565b6037602052600090815260409020546001600160a01b031681565b61025a61520881565b61025a620249f081565b61025a7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610186906001600160a01b031681565b61025a7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025a7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61025a7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018661203081565b61022061036a36600461132f565b6103f1565b61022061037d3660046113b7565b6105d1565b61018661039036600461130b565b6105e1565b61025a7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102206103ca3660046113f8565b61093a565b6102206103dd36600461149f565b610a97565b6103ed823383610af5565b5050565b6034546001600160a01b031633146104695760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104e05760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610460565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961050f602060008486611521565b6105189161154b565b036105375761053261052d8260208186611521565b610c74565b6105cb565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed2610566602060008486611521565b61056f9161154b565b0361057e576105328282610d72565b60405162461bcd60e51b815260206004820152602e6024820152600080516020611a3a83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610460565b50505050565b6105dc838383610af5565b505050565b60006001600160a01b03821661063a5760405162461bcd60e51b815260206004820152602a6024820152600080516020611a3a83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610460565b6001600160a01b0382811660009081526037602052604090205416156106b65760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610460565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261076492911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa1580156107fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610824919081019061158e565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610862573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261088a919081019061158e565b60405160200161089d9493929190611630565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108c9929190611677565b600060405180830381600087803b1580156108e357600080fd5b505af11580156108f7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b031461097e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610460565b600054610100900460ff161580801561099e5750600054600160ff909116105b806109b85750303b1580156109b8575060005460ff166001145b610a1b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610460565b6000805460ff191660011790558015610a3e576000805461ff0019166101001790555b610a4a85858585610eb3565b8015610a90576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610ae85760405162461bcd60e51b815260206004820152602b6024820152600080516020611a3a83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610460565b610a908585858585610faf565b6000610b0084611165565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610b33903390309087906004016116a3565b600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b5050603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610bf1939092169160c401611677565b600060405180830381600087803b158015610c0b57600080fd5b505af1158015610c1f573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a46105cb565b6000808080610c85858701876116c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610cb857610cb8611718565b604051632142170760e11b81526001600160a01b038616906342842e0e90610ce8903090879087906004016116a3565b600060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b6000808080610d83858701876117b7565b6001600160a01b03808516600090815260376020526040902054949950929750909550935016905080610db857610db8611718565b60005b8251811015610e6357856001600160a01b03166342842e0e30868481518110610de657610de66118a9565b6020026020010151868581518110610e0057610e006118a9565b60200260200101516040518463ffffffff1660e01b8152600401610e26939291906116a3565b600060405180830381600087803b158015610e4057600080fd5b505af1158015610e54573d6000803e3d6000fd5b50505050806001019050610dbb565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b8686604051610d619291906118bf565b6001600160a01b03841615801590610ed357506001600160a01b03831615155b8015610ee757506001600160a01b03821615155b8015610efb57506001600160a01b03811615155b610f5f5760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610460565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000610fba86611165565b905060005b8281101561104c57866001600160a01b03166342842e0e3330878786818110610fea57610fea6118a9565b905060200201356040518463ffffffff1660e01b815260040161100f939291906116a3565b600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b50505050806001019050610fbf565b506033546035546040516001600160a01b03928316926316f198319216906110a4907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c906020016119be565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110d0929190611677565b600060405180830381600087803b1580156110ea57600080fd5b505af11580156110fe573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c5888888886040516111559493929190611a12565b60405180910390a4505050505050565b6001600160a01b0380821660009081526037602052604090205416806111915761118e826105e1565b90505b6001600160a01b0381166111a7576111a7611718565b919050565b6001600160a01b03811681146111c157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611202576112026111c4565b604052919050565b60006001600160401b03821115611223576112236111c4565b50601f01601f191660200190565b6000806000806080858703121561124757600080fd5b8435611252816111ac565b93506020850135611262816111ac565b92506040850135915060608501356001600160401b0381111561128457600080fd5b8501601f8101871361129557600080fd5b80356112a86112a38261120a565b6111da565b8181528860208385010111156112bd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156112f257600080fd5b82356112fd816111ac565b946020939093013593505050565b60006020828403121561131d57600080fd5b8135611328816111ac565b9392505050565b6000806000806060858703121561134557600080fd5b843593506020850135611357816111ac565b925060408501356001600160401b038082111561137357600080fd5b818701915087601f83011261138757600080fd5b81358181111561139657600080fd5b8860208285010111156113a857600080fd5b95989497505060200194505050565b6000806000606084860312156113cc57600080fd5b83356113d7816111ac565b925060208401356113e7816111ac565b929592945050506040919091013590565b6000806000806080858703121561140e57600080fd5b8435611419816111ac565b93506020850135611429816111ac565b92506040850135611439816111ac565b91506060850135611449816111ac565b939692955090935050565b60008083601f84011261146657600080fd5b5081356001600160401b0381111561147d57600080fd5b6020830191508360208260051b850101111561149857600080fd5b9250929050565b6000806000806000606086880312156114b757600080fd5b85356114c2816111ac565b945060208601356001600160401b03808211156114de57600080fd5b6114ea89838a01611454565b9096509450604088013591508082111561150357600080fd5b5061151088828901611454565b969995985093965092949392505050565b6000808585111561153157600080fd5b8386111561153e57600080fd5b5050820193919092039150565b8035602083101561156457600019602084900360031b1b165b92915050565b60005b8381101561158557818101518382015260200161156d565b50506000910152565b6000602082840312156115a057600080fd5b81516001600160401b038111156115b657600080fd5b8201601f810184136115c757600080fd5b80516115d56112a38261120a565b8181528560208385010111156115ea57600080fd5b6115fb82602083016020860161156a565b95945050505050565b6000815180845261161c81602086016020860161156a565b601f01601f19169290920160200192915050565b8481526001600160a01b038416602082015260806040820181905260009061165a90830185611604565b828103606084015261166c8185611604565b979650505050505050565b6001600160a01b038316815260406020820181905260009061169b90830184611604565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600080600080608085870312156116dd57600080fd5b84356116e8816111ac565b935060208501356116f8816111ac565b92506040850135611708816111ac565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611747576117476111c4565b5060051b60200190565b600082601f83011261176257600080fd5b813560206117726112a38361172e565b82815260059290921b8401810191818101908684111561179157600080fd5b8286015b848110156117ac5780358352918301918301611795565b509695505050505050565b600080600080600060a086880312156117cf57600080fd5b853594506020808701356117e2816111ac565b945060408701356117f2816111ac565b935060608701356001600160401b038082111561180e57600080fd5b818901915089601f83011261182257600080fd5b81356118306112a38261172e565b81815260059190911b8301840190848101908c83111561184f57600080fd5b938501935b82851015611876578435611867816111ac565b82529385019390850190611854565b96505050608089013592508083111561188e57600080fd5b505061189c88828901611751565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b828110156119015781516001600160a01b0316845292840192908401906001016118dc565b5050508381038285015284518082528583019183019060005b818110156119365783518352928401929184019160010161191a565b5090979650505050505050565b8183526000602080850194508260005b85811015611981578135611966816111ac565b6001600160a01b031687529582019590820190600101611953565b509495945050505050565b81835260006001600160fb1b038311156119a557600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906119f19083018688611943565b8281036080840152611a0481858761198c565b9a9950505050505050505050565b604081526000611a26604083018688611943565b828103602084015261166c81858761198c56fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a2646970667358221220d56687504a65fbdf30d6fa40bc1481712f630a02ef2aa4dc136cf9be78742d2364736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061016e5760003560e01c806397e5230d116100ce578063e0563ab111610087578063e0563ab114610353578063eeb499451461035c578063f213159c1461036f578063f4a120f714610382578063f645125514610395578063f8c8765e146103bc578063ff6f870c146103cf57600080fd5b806397e5230d1461029a578063b1768065146102a4578063b68ad1e4146102cb578063c5ac2b1c146102de578063d41f177114610305578063d7c9e3ec1461032c57600080fd5b806347e7ef241161012b57806347e7ef241461020d5780634fdca69d1461022257806351351d531461023557806355b01e4d146102435780635ea5df79146102515780637efab4f514610268578063947287cf1461029157600080fd5b806305dc2e8f1461017357806307b3e252146101a3578063150b7a02146101b15780631bc114ba146101e8578063284017f5146101fb5780633b878c2214610204575b600080fd5b603454610186906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101866004600360981b0181565b6101cf6101bf366004611231565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161019a565b603354610186906001600160a01b031681565b61018661202081565b61018661101081565b61022061021b3660046112df565b6103e2565b005b603554610186906001600160a01b031681565b6101866002600160a01b0381565b6101866004600160991b0181565b61025a61138881565b60405190815260200161019a565b61018661027636600461130b565b6037602052600090815260409020546001600160a01b031681565b61025a61520881565b61025a620249f081565b61025a7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610186906001600160a01b031681565b61025a7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025a7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61025a7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018661203081565b61022061036a36600461132f565b6103f1565b61022061037d3660046113b7565b6105d1565b61018661039036600461130b565b6105e1565b61025a7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102206103ca3660046113f8565b61093a565b6102206103dd36600461149f565b610a97565b6103ed823383610af5565b5050565b6034546001600160a01b031633146104695760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104e05760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610460565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961050f602060008486611521565b6105189161154b565b036105375761053261052d8260208186611521565b610c74565b6105cb565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed2610566602060008486611521565b61056f9161154b565b0361057e576105328282610d72565b60405162461bcd60e51b815260206004820152602e6024820152600080516020611a3a83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610460565b50505050565b6105dc838383610af5565b505050565b60006001600160a01b03821661063a5760405162461bcd60e51b815260206004820152602a6024820152600080516020611a3a83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610460565b6001600160a01b0382811660009081526037602052604090205416156106b65760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610460565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261076492911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa1580156107fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610824919081019061158e565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610862573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261088a919081019061158e565b60405160200161089d9493929190611630565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108c9929190611677565b600060405180830381600087803b1580156108e357600080fd5b505af11580156108f7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b031461097e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610460565b600054610100900460ff161580801561099e5750600054600160ff909116105b806109b85750303b1580156109b8575060005460ff166001145b610a1b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610460565b6000805460ff191660011790558015610a3e576000805461ff0019166101001790555b610a4a85858585610eb3565b8015610a90576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610ae85760405162461bcd60e51b815260206004820152602b6024820152600080516020611a3a83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610460565b610a908585858585610faf565b6000610b0084611165565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610b33903390309087906004016116a3565b600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b5050603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610bf1939092169160c401611677565b600060405180830381600087803b158015610c0b57600080fd5b505af1158015610c1f573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a46105cb565b6000808080610c85858701876116c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610cb857610cb8611718565b604051632142170760e11b81526001600160a01b038616906342842e0e90610ce8903090879087906004016116a3565b600060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b6000808080610d83858701876117b7565b6001600160a01b03808516600090815260376020526040902054949950929750909550935016905080610db857610db8611718565b60005b8251811015610e6357856001600160a01b03166342842e0e30868481518110610de657610de66118a9565b6020026020010151868581518110610e0057610e006118a9565b60200260200101516040518463ffffffff1660e01b8152600401610e26939291906116a3565b600060405180830381600087803b158015610e4057600080fd5b505af1158015610e54573d6000803e3d6000fd5b50505050806001019050610dbb565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b8686604051610d619291906118bf565b6001600160a01b03841615801590610ed357506001600160a01b03831615155b8015610ee757506001600160a01b03821615155b8015610efb57506001600160a01b03811615155b610f5f5760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610460565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000610fba86611165565b905060005b8281101561104c57866001600160a01b03166342842e0e3330878786818110610fea57610fea6118a9565b905060200201356040518463ffffffff1660e01b815260040161100f939291906116a3565b600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b50505050806001019050610fbf565b506033546035546040516001600160a01b03928316926316f198319216906110a4907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c906020016119be565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110d0929190611677565b600060405180830381600087803b1580156110ea57600080fd5b505af11580156110fe573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c5888888886040516111559493929190611a12565b60405180910390a4505050505050565b6001600160a01b0380821660009081526037602052604090205416806111915761118e826105e1565b90505b6001600160a01b0381166111a7576111a7611718565b919050565b6001600160a01b03811681146111c157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611202576112026111c4565b604052919050565b60006001600160401b03821115611223576112236111c4565b50601f01601f191660200190565b6000806000806080858703121561124757600080fd5b8435611252816111ac565b93506020850135611262816111ac565b92506040850135915060608501356001600160401b0381111561128457600080fd5b8501601f8101871361129557600080fd5b80356112a86112a38261120a565b6111da565b8181528860208385010111156112bd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156112f257600080fd5b82356112fd816111ac565b946020939093013593505050565b60006020828403121561131d57600080fd5b8135611328816111ac565b9392505050565b6000806000806060858703121561134557600080fd5b843593506020850135611357816111ac565b925060408501356001600160401b038082111561137357600080fd5b818701915087601f83011261138757600080fd5b81358181111561139657600080fd5b8860208285010111156113a857600080fd5b95989497505060200194505050565b6000806000606084860312156113cc57600080fd5b83356113d7816111ac565b925060208401356113e7816111ac565b929592945050506040919091013590565b6000806000806080858703121561140e57600080fd5b8435611419816111ac565b93506020850135611429816111ac565b92506040850135611439816111ac565b91506060850135611449816111ac565b939692955090935050565b60008083601f84011261146657600080fd5b5081356001600160401b0381111561147d57600080fd5b6020830191508360208260051b850101111561149857600080fd5b9250929050565b6000806000806000606086880312156114b757600080fd5b85356114c2816111ac565b945060208601356001600160401b03808211156114de57600080fd5b6114ea89838a01611454565b9096509450604088013591508082111561150357600080fd5b5061151088828901611454565b969995985093965092949392505050565b6000808585111561153157600080fd5b8386111561153e57600080fd5b5050820193919092039150565b8035602083101561156457600019602084900360031b1b165b92915050565b60005b8381101561158557818101518382015260200161156d565b50506000910152565b6000602082840312156115a057600080fd5b81516001600160401b038111156115b657600080fd5b8201601f810184136115c757600080fd5b80516115d56112a38261120a565b8181528560208385010111156115ea57600080fd5b6115fb82602083016020860161156a565b95945050505050565b6000815180845261161c81602086016020860161156a565b601f01601f19169290920160200192915050565b8481526001600160a01b038416602082015260806040820181905260009061165a90830185611604565b828103606084015261166c8185611604565b979650505050505050565b6001600160a01b038316815260406020820181905260009061169b90830184611604565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600080600080608085870312156116dd57600080fd5b84356116e8816111ac565b935060208501356116f8816111ac565b92506040850135611708816111ac565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611747576117476111c4565b5060051b60200190565b600082601f83011261176257600080fd5b813560206117726112a38361172e565b82815260059290921b8401810191818101908684111561179157600080fd5b8286015b848110156117ac5780358352918301918301611795565b509695505050505050565b600080600080600060a086880312156117cf57600080fd5b853594506020808701356117e2816111ac565b945060408701356117f2816111ac565b935060608701356001600160401b038082111561180e57600080fd5b818901915089601f83011261182257600080fd5b81356118306112a38261172e565b81815260059190911b8301840190848101908c83111561184f57600080fd5b938501935b82851015611876578435611867816111ac565b82529385019390850190611854565b96505050608089013592508083111561188e57600080fd5b505061189c88828901611751565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b828110156119015781516001600160a01b0316845292840192908401906001016118dc565b5050508381038285015284518082528583019183019060005b818110156119365783518352928401929184019160010161191a565b5090979650505050505050565b8183526000602080850194508260005b85811015611981578135611966816111ac565b6001600160a01b031687529582019590820190600101611953565b509495945050505050565b81835260006001600160fb1b038311156119a557600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906119f19083018688611943565b8281036080840152611a0481858761198c565b9a9950505050505050505050565b604081526000611a26604083018688611943565b828103602084015261166c81858761198c56fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a2646970667358221220d56687504a65fbdf30d6fa40bc1481712f630a02ef2aa4dc136cf9be78742d2364736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC721PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC721PredicateAccessList","sourceName":"contracts/child/RootMintableERC721PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612231806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e65760003560e01c8063b17680651161010a578063e0563ab1116100ad578063f2fde38b1161007c578063f2fde38b14610466578063f4a120f714610479578063f64512551461048c578063f8c8765e146104b3578063ff6f870c146104c657600080fd5b8063e0563ab114610426578063e30c39781461042f578063eeb4994514610440578063f213159c1461045357600080fd5b8063b17680651461033e578063b68ad1e414610365578063c1225a2014610378578063c5ac2b1c1461038b578063c5e4683a146103b2578063d41f1771146103c5578063d7c9e3ec146103ec578063d8dd17731461041357600080fd5b806351351d531161018d57806379ba50971161015c57806379ba5097146102e85780637efab4f5146102f05780638da5cb5b1461031a578063947287cf1461032b57806397e5230d1461033457600080fd5b806351351d53146102ad57806355b01e4d146102bb5780635ea5df79146102c9578063715018a6146102e057600080fd5b806305dc2e8f146101eb57806307b3e2521461021b578063150b7a02146102295780631bc114ba14610260578063284017f5146102735780633b878c221461027c57806347e7ef24146102855780634fdca69d1461029a575b600080fd5b60fd546101fe906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101fe6004600360981b0181565b61024761023736600461186f565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610212565b60fc546101fe906001600160a01b031681565b6101fe61202081565b6101fe61101081565b61029861029336600461191d565b6104d9565b005b60fe546101fe906001600160a01b031681565b6101fe6002600160a01b0381565b6101fe6004600160991b0181565b6102d261138881565b604051908152602001610212565b6102986104e8565b6102986104fc565b6101fe6102fe366004611949565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101fe565b6102d261520881565b6102d2620249f081565b6102d27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101fe906001600160a01b031681565b61029861038636600461197d565b61057b565b6102d27faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102986103c036600461197d565b6105ca565b6102d27f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102d27f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b610298610421366004611998565b610611565b6101fe61203081565b6065546001600160a01b03166101fe565b61029861044e366004611a2a565b610732565b610298610461366004611ab2565b61090d565b610298610474366004611949565b61091d565b6101fe610487366004611949565b61098e565b6102d27f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102986104c1366004611af3565b610ce9565b6102986104d4366004611b9a565b610de2565b6104e4823383610e40565b5050565b6104f0610fc7565b6104fa6000611021565b565b60655433906001600160a01b0316811461056f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61057881611021565b50565b610583610fc7565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6105d2610fc7565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146106385760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff16158080156106585750600054600160ff909116105b806106725750303b158015610672575060005460ff166001145b61068e5760405162461bcd60e51b815260040161056690611c40565b6000805460ff1916600117905580156106b1576000805461ff0019166101001790555b6106bd8888888861103a565b60c9805461ffff191685151561ff00191617610100851515021790556106e282611021565b8015610728576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b6064820152608401610566565b60fe546001600160a01b0384811691161461081c5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610566565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961084b602060008486611c8e565b61085491611cb8565b036108735761086e6108698260208186611c8e565b611136565b610907565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26108a2602060008486611c8e565b6108ab91611cb8565b036108ba5761086e8282611235565b60405162461bcd60e51b815260206004820152602e60248201526000805160206121dc83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610566565b50505050565b610918838383610e40565b505050565b610925610fc7565b606580546001600160a01b0383166001600160a01b031990911681179091556109566033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166109e75760405162461bcd60e51b815260206004820152602a60248201526000805160206121dc83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610566565b6001600160a01b03828116600090815261010060205260409020541615610a645760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610566565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610b1292911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610bab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bd39190810190611cfb565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c399190810190611cfb565b604051602001610c4c9493929190611d9d565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610c78929190611de4565b600060405180830381600087803b158015610c9257600080fd5b505af1158015610ca6573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610d105760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff1615808015610d305750600054600160ff909116105b80610d4a5750303b158015610d4a575060005460ff166001145b610d665760405162461bcd60e51b815260040161056690611c40565b6000805460ff191660011790558015610d89576000805461ff0019166101001790555b610d958585858561103a565b8015610ddb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610e335760405162461bcd60e51b815260206004820152602b60248201526000805160206121dc83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610566565b610ddb8585858585611377565b610e48611535565b6000610e538461153d565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610e8690339030908790600401611e10565b600060405180830381600087803b158015610ea057600080fd5b505af1158015610eb4573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610f44939092169160c401611de4565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a4610907565b6033546001600160a01b031633146104fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610566565b606580546001600160a01b031916905561057881611585565b6001600160a01b0384161580159061105a57506001600160a01b03831615155b801561106e57506001600160a01b03821615155b801561108257506001600160a01b03811615155b6110e65760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610566565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061114785870187611e34565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061117b5761117b611e85565b604051632142170760e11b81526001600160a01b038616906342842e0e906111ab90309087908790600401611e10565b600060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b600080808061124685870187611f24565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061127c5761127c611e85565b60005b825181101561132757856001600160a01b03166342842e0e308684815181106112aa576112aa612016565b60200260200101518685815181106112c4576112c4612016565b60200260200101516040518463ffffffff1660e01b81526004016112ea93929190611e10565b600060405180830381600087803b15801561130457600080fd5b505af1158015611318573d6000803e3d6000fd5b5050505080600101905061127f565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b868660405161122492919061202c565b61137f611535565b600061138a8661153d565b905060005b8281101561141c57866001600160a01b03166342842e0e33308787868181106113ba576113ba612016565b905060200201356040518463ffffffff1660e01b81526004016113df93929190611e10565b600060405180830381600087803b1580156113f957600080fd5b505af115801561140d573d6000803e3d6000fd5b5050505080600101905061138f565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611474907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c9060200161212b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016114a0929190611de4565b600060405180830381600087803b1580156114ba57600080fd5b505af11580156114ce573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c588888888604051611525949392919061217f565b60405180910390a4505050505050565b6104fa6115d7565b6001600160a01b0380821660009081526101006020526040902054168061156a576115678261098e565b90505b6001600160a01b03811661158057611580611e85565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116e257604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161163991906121a6565b6000604051808303818686fa925050503d8060008114611675576040519150601f19603f3d011682016040523d82523d6000602084013e61167a565b606091505b509150915081801561169f575060008180602001905181019061169d91906121c2565b115b6116df5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610566565b50505b60c954610100900460ff16156104fa57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161174991906121a6565b6000604051808303818686fa925050503d8060008114611785576040519150601f19603f3d011682016040523d82523d6000602084013e61178a565b606091505b50915091508180156117b05750808060200190518101906117ab91906121c2565b600114155b6104e45760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610566565b6001600160a01b038116811461057857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561184057611840611802565b604052919050565b60006001600160401b0382111561186157611861611802565b50601f01601f191660200190565b6000806000806080858703121561188557600080fd5b8435611890816117ed565b935060208501356118a0816117ed565b92506040850135915060608501356001600160401b038111156118c257600080fd5b8501601f810187136118d357600080fd5b80356118e66118e182611848565b611818565b8181528860208385010111156118fb57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561193057600080fd5b823561193b816117ed565b946020939093013593505050565b60006020828403121561195b57600080fd5b8135611966816117ed565b9392505050565b8035801515811461158057600080fd5b60006020828403121561198f57600080fd5b6119668261196d565b600080600080600080600060e0888a0312156119b357600080fd5b87356119be816117ed565b965060208801356119ce816117ed565b955060408801356119de816117ed565b945060608801356119ee816117ed565b93506119fc6080890161196d565b9250611a0a60a0890161196d565b915060c0880135611a1a816117ed565b8091505092959891949750929550565b60008060008060608587031215611a4057600080fd5b843593506020850135611a52816117ed565b925060408501356001600160401b0380821115611a6e57600080fd5b818701915087601f830112611a8257600080fd5b813581811115611a9157600080fd5b886020828501011115611aa357600080fd5b95989497505060200194505050565b600080600060608486031215611ac757600080fd5b8335611ad2816117ed565b92506020840135611ae2816117ed565b929592945050506040919091013590565b60008060008060808587031215611b0957600080fd5b8435611b14816117ed565b93506020850135611b24816117ed565b92506040850135611b34816117ed565b91506060850135611b44816117ed565b939692955090935050565b60008083601f840112611b6157600080fd5b5081356001600160401b03811115611b7857600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b9250929050565b600080600080600060608688031215611bb257600080fd5b8535611bbd816117ed565b945060208601356001600160401b0380821115611bd957600080fd5b611be589838a01611b4f565b90965094506040880135915080821115611bfe57600080fd5b50611c0b88828901611b4f565b969995985093965092949392505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611c9e57600080fd5b83861115611cab57600080fd5b5050820193919092039150565b80356020831015611cd157600019602084900360031b1b165b92915050565b60005b83811015611cf2578181015183820152602001611cda565b50506000910152565b600060208284031215611d0d57600080fd5b81516001600160401b03811115611d2357600080fd5b8201601f81018413611d3457600080fd5b8051611d426118e182611848565b818152856020838501011115611d5757600080fd5b611d68826020830160208601611cd7565b95945050505050565b60008151808452611d89816020860160208601611cd7565b601f01601f19169290920160200192915050565b8481526001600160a01b0384166020820152608060408201819052600090611dc790830185611d71565b8281036060840152611dd98185611d71565b979650505050505050565b6001600160a01b0383168152604060208201819052600090611e0890830184611d71565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060008060808587031215611e4a57600080fd5b8435611e55816117ed565b93506020850135611e65816117ed565b92506040850135611e75816117ed565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611eb457611eb4611802565b5060051b60200190565b600082601f830112611ecf57600080fd5b81356020611edf6118e183611e9b565b82815260059290921b84018101918181019086841115611efe57600080fd5b8286015b84811015611f195780358352918301918301611f02565b509695505050505050565b600080600080600060a08688031215611f3c57600080fd5b85359450602080870135611f4f816117ed565b94506040870135611f5f816117ed565b935060608701356001600160401b0380821115611f7b57600080fd5b818901915089601f830112611f8f57600080fd5b8135611f9d6118e182611e9b565b81815260059190911b8301840190848101908c831115611fbc57600080fd5b938501935b82851015611fe3578435611fd4816117ed565b82529385019390850190611fc1565b965050506080890135925080831115611ffb57600080fd5b505061200988828901611ebe565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b8281101561206e5781516001600160a01b031684529284019290840190600101612049565b5050508381038285015284518082528583019183019060005b818110156120a357835183529284019291840191600101612087565b5090979650505050505050565b8183526000602080850194508260005b858110156120ee5781356120d3816117ed565b6001600160a01b0316875295820195908201906001016120c0565b509495945050505050565b81835260006001600160fb1b0383111561211257600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061215e90830186886120b0565b82810360808401526121718185876120f9565b9a9950505050505050505050565b6040815260006121936040830186886120b0565b8281036020840152611dd98185876120f9565b600082516121b8818460208701611cd7565b9190910192915050565b6000602082840312156121d457600080fd5b505191905056fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a26469706673582212204063e808f9818c931a3cdbf2406d8b4f218ddd313bef99b78b2b8455373be0c864736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101e65760003560e01c8063b17680651161010a578063e0563ab1116100ad578063f2fde38b1161007c578063f2fde38b14610466578063f4a120f714610479578063f64512551461048c578063f8c8765e146104b3578063ff6f870c146104c657600080fd5b8063e0563ab114610426578063e30c39781461042f578063eeb4994514610440578063f213159c1461045357600080fd5b8063b17680651461033e578063b68ad1e414610365578063c1225a2014610378578063c5ac2b1c1461038b578063c5e4683a146103b2578063d41f1771146103c5578063d7c9e3ec146103ec578063d8dd17731461041357600080fd5b806351351d531161018d57806379ba50971161015c57806379ba5097146102e85780637efab4f5146102f05780638da5cb5b1461031a578063947287cf1461032b57806397e5230d1461033457600080fd5b806351351d53146102ad57806355b01e4d146102bb5780635ea5df79146102c9578063715018a6146102e057600080fd5b806305dc2e8f146101eb57806307b3e2521461021b578063150b7a02146102295780631bc114ba14610260578063284017f5146102735780633b878c221461027c57806347e7ef24146102855780634fdca69d1461029a575b600080fd5b60fd546101fe906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101fe6004600360981b0181565b61024761023736600461186f565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610212565b60fc546101fe906001600160a01b031681565b6101fe61202081565b6101fe61101081565b61029861029336600461191d565b6104d9565b005b60fe546101fe906001600160a01b031681565b6101fe6002600160a01b0381565b6101fe6004600160991b0181565b6102d261138881565b604051908152602001610212565b6102986104e8565b6102986104fc565b6101fe6102fe366004611949565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101fe565b6102d261520881565b6102d2620249f081565b6102d27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101fe906001600160a01b031681565b61029861038636600461197d565b61057b565b6102d27faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102986103c036600461197d565b6105ca565b6102d27f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102d27f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b610298610421366004611998565b610611565b6101fe61203081565b6065546001600160a01b03166101fe565b61029861044e366004611a2a565b610732565b610298610461366004611ab2565b61090d565b610298610474366004611949565b61091d565b6101fe610487366004611949565b61098e565b6102d27f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102986104c1366004611af3565b610ce9565b6102986104d4366004611b9a565b610de2565b6104e4823383610e40565b5050565b6104f0610fc7565b6104fa6000611021565b565b60655433906001600160a01b0316811461056f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61057881611021565b50565b610583610fc7565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6105d2610fc7565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146106385760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff16158080156106585750600054600160ff909116105b806106725750303b158015610672575060005460ff166001145b61068e5760405162461bcd60e51b815260040161056690611c40565b6000805460ff1916600117905580156106b1576000805461ff0019166101001790555b6106bd8888888861103a565b60c9805461ffff191685151561ff00191617610100851515021790556106e282611021565b8015610728576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b6064820152608401610566565b60fe546001600160a01b0384811691161461081c5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610566565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961084b602060008486611c8e565b61085491611cb8565b036108735761086e6108698260208186611c8e565b611136565b610907565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26108a2602060008486611c8e565b6108ab91611cb8565b036108ba5761086e8282611235565b60405162461bcd60e51b815260206004820152602e60248201526000805160206121dc83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610566565b50505050565b610918838383610e40565b505050565b610925610fc7565b606580546001600160a01b0383166001600160a01b031990911681179091556109566033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166109e75760405162461bcd60e51b815260206004820152602a60248201526000805160206121dc83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610566565b6001600160a01b03828116600090815261010060205260409020541615610a645760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610566565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610b1292911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610bab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bd39190810190611cfb565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c399190810190611cfb565b604051602001610c4c9493929190611d9d565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610c78929190611de4565b600060405180830381600087803b158015610c9257600080fd5b505af1158015610ca6573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610d105760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff1615808015610d305750600054600160ff909116105b80610d4a5750303b158015610d4a575060005460ff166001145b610d665760405162461bcd60e51b815260040161056690611c40565b6000805460ff191660011790558015610d89576000805461ff0019166101001790555b610d958585858561103a565b8015610ddb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610e335760405162461bcd60e51b815260206004820152602b60248201526000805160206121dc83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610566565b610ddb8585858585611377565b610e48611535565b6000610e538461153d565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610e8690339030908790600401611e10565b600060405180830381600087803b158015610ea057600080fd5b505af1158015610eb4573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610f44939092169160c401611de4565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a4610907565b6033546001600160a01b031633146104fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610566565b606580546001600160a01b031916905561057881611585565b6001600160a01b0384161580159061105a57506001600160a01b03831615155b801561106e57506001600160a01b03821615155b801561108257506001600160a01b03811615155b6110e65760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610566565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061114785870187611e34565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061117b5761117b611e85565b604051632142170760e11b81526001600160a01b038616906342842e0e906111ab90309087908790600401611e10565b600060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b600080808061124685870187611f24565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061127c5761127c611e85565b60005b825181101561132757856001600160a01b03166342842e0e308684815181106112aa576112aa612016565b60200260200101518685815181106112c4576112c4612016565b60200260200101516040518463ffffffff1660e01b81526004016112ea93929190611e10565b600060405180830381600087803b15801561130457600080fd5b505af1158015611318573d6000803e3d6000fd5b5050505080600101905061127f565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b868660405161122492919061202c565b61137f611535565b600061138a8661153d565b905060005b8281101561141c57866001600160a01b03166342842e0e33308787868181106113ba576113ba612016565b905060200201356040518463ffffffff1660e01b81526004016113df93929190611e10565b600060405180830381600087803b1580156113f957600080fd5b505af115801561140d573d6000803e3d6000fd5b5050505080600101905061138f565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611474907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c9060200161212b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016114a0929190611de4565b600060405180830381600087803b1580156114ba57600080fd5b505af11580156114ce573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c588888888604051611525949392919061217f565b60405180910390a4505050505050565b6104fa6115d7565b6001600160a01b0380821660009081526101006020526040902054168061156a576115678261098e565b90505b6001600160a01b03811661158057611580611e85565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116e257604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161163991906121a6565b6000604051808303818686fa925050503d8060008114611675576040519150601f19603f3d011682016040523d82523d6000602084013e61167a565b606091505b509150915081801561169f575060008180602001905181019061169d91906121c2565b115b6116df5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610566565b50505b60c954610100900460ff16156104fa57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161174991906121a6565b6000604051808303818686fa925050503d8060008114611785576040519150601f19603f3d011682016040523d82523d6000602084013e61178a565b606091505b50915091508180156117b05750808060200190518101906117ab91906121c2565b600114155b6104e45760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610566565b6001600160a01b038116811461057857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561184057611840611802565b604052919050565b60006001600160401b0382111561186157611861611802565b50601f01601f191660200190565b6000806000806080858703121561188557600080fd5b8435611890816117ed565b935060208501356118a0816117ed565b92506040850135915060608501356001600160401b038111156118c257600080fd5b8501601f810187136118d357600080fd5b80356118e66118e182611848565b611818565b8181528860208385010111156118fb57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561193057600080fd5b823561193b816117ed565b946020939093013593505050565b60006020828403121561195b57600080fd5b8135611966816117ed565b9392505050565b8035801515811461158057600080fd5b60006020828403121561198f57600080fd5b6119668261196d565b600080600080600080600060e0888a0312156119b357600080fd5b87356119be816117ed565b965060208801356119ce816117ed565b955060408801356119de816117ed565b945060608801356119ee816117ed565b93506119fc6080890161196d565b9250611a0a60a0890161196d565b915060c0880135611a1a816117ed565b8091505092959891949750929550565b60008060008060608587031215611a4057600080fd5b843593506020850135611a52816117ed565b925060408501356001600160401b0380821115611a6e57600080fd5b818701915087601f830112611a8257600080fd5b813581811115611a9157600080fd5b886020828501011115611aa357600080fd5b95989497505060200194505050565b600080600060608486031215611ac757600080fd5b8335611ad2816117ed565b92506020840135611ae2816117ed565b929592945050506040919091013590565b60008060008060808587031215611b0957600080fd5b8435611b14816117ed565b93506020850135611b24816117ed565b92506040850135611b34816117ed565b91506060850135611b44816117ed565b939692955090935050565b60008083601f840112611b6157600080fd5b5081356001600160401b03811115611b7857600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b9250929050565b600080600080600060608688031215611bb257600080fd5b8535611bbd816117ed565b945060208601356001600160401b0380821115611bd957600080fd5b611be589838a01611b4f565b90965094506040880135915080821115611bfe57600080fd5b50611c0b88828901611b4f565b969995985093965092949392505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611c9e57600080fd5b83861115611cab57600080fd5b5050820193919092039150565b80356020831015611cd157600019602084900360031b1b165b92915050565b60005b83811015611cf2578181015183820152602001611cda565b50506000910152565b600060208284031215611d0d57600080fd5b81516001600160401b03811115611d2357600080fd5b8201601f81018413611d3457600080fd5b8051611d426118e182611848565b818152856020838501011115611d5757600080fd5b611d68826020830160208601611cd7565b95945050505050565b60008151808452611d89816020860160208601611cd7565b601f01601f19169290920160200192915050565b8481526001600160a01b0384166020820152608060408201819052600090611dc790830185611d71565b8281036060840152611dd98185611d71565b979650505050505050565b6001600160a01b0383168152604060208201819052600090611e0890830184611d71565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060008060808587031215611e4a57600080fd5b8435611e55816117ed565b93506020850135611e65816117ed565b92506040850135611e75816117ed565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611eb457611eb4611802565b5060051b60200190565b600082601f830112611ecf57600080fd5b81356020611edf6118e183611e9b565b82815260059290921b84018101918181019086841115611efe57600080fd5b8286015b84811015611f195780358352918301918301611f02565b509695505050505050565b600080600080600060a08688031215611f3c57600080fd5b85359450602080870135611f4f816117ed565b94506040870135611f5f816117ed565b935060608701356001600160401b0380821115611f7b57600080fd5b818901915089601f830112611f8f57600080fd5b8135611f9d6118e182611e9b565b81815260059190911b8301840190848101908c831115611fbc57600080fd5b938501935b82851015611fe3578435611fd4816117ed565b82529385019390850190611fc1565b965050506080890135925080831115611ffb57600080fd5b505061200988828901611ebe565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b8281101561206e5781516001600160a01b031684529284019290840190600101612049565b5050508381038285015284518082528583019183019060005b818110156120a357835183529284019291840191600101612087565b5090979650505050505050565b8183526000602080850194508260005b858110156120ee5781356120d3816117ed565b6001600160a01b0316875295820195908201906001016120c0565b509495945050505050565b81835260006001600160fb1b0383111561211257600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061215e90830186886120b0565b82810360808401526121718185876120f9565b9a9950505050505050505050565b6040815260006121936040830186886120b0565b8281036020840152611dd98185876120f9565b600082516121b8818460208701611cd7565b9190910192915050565b6000602082840312156121d457600080fd5b505191905056fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a26469706673582212204063e808f9818c931a3cdbf2406d8b4f218ddd313bef99b78b2b8455373be0c864736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var ChildERC1155Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155","sourceName":"contracts/child/ChildERC1155.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"uri_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"invalidateNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612b8b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101155760003560e01c806357128683116100a2578063e619870511610071578063e619870514610279578063e985e9c51461028b578063f242432a146102c7578063f399e22e146102da578063f5298aca146102ed57600080fd5b8063571286831461022d5780636b20c454146102405780639b77ef1114610253578063a22cb4651461026657600080fd5b8063156e29f6116100e9578063156e29f6146101965780631f2d0065146101a95780632d0335ab146101cf5780632eb2c2d6146101f85780634e1273f41461020d57600080fd5b8062fdd58e1461011a57806301ffc9a7146101405780630c53c51c146101635780630e89341c14610183575b600080fd5b61012d610128366004611cd5565b610300565b6040519081526020015b60405180910390f35b61015361014e366004611d15565b61039b565b6040519015158152602001610137565b610176610171366004611d7a565b6103eb565b6040516101379190611e49565b610176610191366004611e5c565b6106c9565b6101536101a4366004611e75565b61075d565b610103546001600160a01b03165b6040516001600160a01b039091168152602001610137565b61012d6101dd366004611ea8565b6001600160a01b031660009081526038602052604090205490565b61020b61020636600461200c565b6107b0565b005b61022061021b3660046120b5565b61080e565b60405161013791906121ba565b61015361023b366004612211565b610937565b61015361024e3660046122aa565b610a53565b61020b610261366004611e5c565b610afb565b61020b61027436600461232a565b610b22565b610102546001600160a01b03166101b7565b610153610299366004612366565b6001600160a01b03918216600090815260d16020908152604080832093909416825291909152205460ff1690565b61020b6102d5366004612399565b610b38565b61020b6102e83660046123fd565b610b8f565b6101536102fb366004611e75565b610da5565b60006001600160a01b0383166103705760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600081815260d0602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806103cc57506001600160e01b031982166303a24d0760e21b145b8061039557506301ffc9a760e01b6001600160e01b0319831614610395565b6060600061042e87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dde92505050565b90506001600160e01b03196000358116908216036104b45760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f640000006064820152608401610367565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506105258982888888610df9565b61057b5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610367565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d6040516020016105d09392919061244f565b60408051601f19818403018152908290526105ea91612475565b6000604051808303816000865af19150503d8060008114610627576040519150601f19603f3d011682016040523d82523d6000602084013e61062c565b606091505b50915091508161067e5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610367565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c6040516106b39493929190612491565b60405180910390a19a9950505050505050505050565b606060d280546106d8906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610704906124dd565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b50505050509050919050565b610102546000906001600160a01b0316331461078b5760405162461bcd60e51b815260040161036790612517565b6107a684848460405180602001604052806000815250610ed5565b5060019392505050565b6107b8610fe4565b6001600160a01b0316856001600160a01b031614806107de57506107de85610299610fe4565b6107fa5760405162461bcd60e51b81526004016103679061255c565b6108078585858585610ff3565b5050505050565b606081518351146108735760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610367565b600083516001600160401b0381111561088e5761088e611ec3565b6040519080825280602002602001820160405280156108b7578160200160208202803683370190505b50905060005b845181101561092f576109028582815181106108db576108db6125aa565b60200260200101518583815181106108f5576108f56125aa565b6020026020010151610300565b828281518110610914576109146125aa565b6020908102919091010152610928816125d6565b90506108bd565b509392505050565b610102546000906001600160a01b031633146109655760405162461bcd60e51b815260040161036790612517565b85848114801561097457508083145b6109c05760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a206172726179206c656e206d69736d617463686044820152606401610367565b60005b81811015610a4457610a3c8989838181106109e0576109e06125aa565b90506020020160208101906109f59190611ea8565b888884818110610a0757610a076125aa565b90506020020135878785818110610a2057610a206125aa565b9050602002013560405180602001604052806000815250610ed5565b6001016109c3565b50600198975050505050505050565b610102546000906001600160a01b03163314610a815760405162461bcd60e51b815260040161036790612517565b610aef8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061119d92505050565b50600195945050505050565b3360009081526038602052604081208054839290610b1a9084906125ef565b909155505050565b610b34610b2d610fe4565b8383611334565b5050565b610b40610fe4565b6001600160a01b0316856001600160a01b03161480610b665750610b6685610299610fe4565b610b825760405162461bcd60e51b81526004016103679061255c565b6108078585858585611414565b606b54610100900460ff1615808015610baf5750606b54600160ff909116105b80610bc95750303b158015610bc95750606b5460ff166001145b610c2c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610367565b606b805460ff191660011790558015610c4f57606b805461ff0019166101001790555b6001600160a01b038416610ca55760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a204241445f494e495449414c495a4154494f4e6044820152606401610367565b61010380546001600160a01b0386166001600160a01b031991821617909155610102805490911633179055604080516020601f8501819004810282018101909252838152610d0d91859085908190840183828082843760009201919091525061153b92505050565b610d59610d22856001600160a01b031661156e565b604051602001610d329190612602565b60408051601f1981840301815282820190915260018252603160f81b602083015290611584565b8015610d9f57606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610102546000906001600160a01b03163314610dd35760405162461bcd60e51b815260040161036790612517565b6107a68484846115f0565b60008151600003610df157506000919050565b506020015190565b6000806001610e0f610e0a886116f0565b61176d565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610e5d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610367565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6001600160a01b038416610f355760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610367565b6000610f3f610fe4565b90506000610f4c8561179a565b90506000610f598561179a565b9050600086815260d0602090815260408083206001600160a01b038b16845290915281208054879290610f8d9084906125ef565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020612af3833981519152910160405180910390a4610fdb836000898989896117e5565b50505050505050565b6000610fee611940565b905090565b81518351146110145760405162461bcd60e51b815260040161036790612637565b6001600160a01b03841661103a5760405162461bcd60e51b81526004016103679061267f565b6000611044610fe4565b905060005b845181101561112f576000858281518110611066576110666125aa565b602002602001015190506000858381518110611084576110846125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038e1683529093529190912054909150818110156110d55760405162461bcd60e51b8152600401610367906126c4565b600083815260d0602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111149084906125ef565b9250508190555050505080611128906125d6565b9050611049565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161117f92919061270e565b60405180910390a461119581878787878761199c565b505050505050565b6001600160a01b0383166111c35760405162461bcd60e51b81526004016103679061273c565b80518251146111e45760405162461bcd60e51b815260040161036790612637565b60006111ee610fe4565b604080516020810190915260009052905060005b83518110156112c757600084828151811061121f5761121f6125aa565b60200260200101519050600084838151811061123d5761123d6125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038c16835290935291909120549091508181101561128e5760405162461bcd60e51b81526004016103679061277f565b600092835260d0602090815260408085206001600160a01b038b16865290915290922091039055806112bf816125d6565b915050611202565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161131892919061270e565b60405180910390a4604080516020810190915260009052610d9f565b816001600160a01b0316836001600160a01b0316036113a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610367565b6001600160a01b03838116600081815260d16020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661143a5760405162461bcd60e51b81526004016103679061267f565b6000611444610fe4565b905060006114518561179a565b9050600061145e8561179a565b9050600086815260d0602090815260408083206001600160a01b038c168452909152902054858110156114a35760405162461bcd60e51b8152600401610367906126c4565b600087815260d0602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906114e29084906125ef565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020612af3833981519152910160405180910390a4611530848a8a8a8a8a6117e5565b505050505050505050565b606b54610100900460ff166115625760405162461bcd60e51b8152600401610367906127c3565b61156b81611a57565b50565b60606103956001600160a01b0383166014611a87565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6115d2818484611c29565b600055600280546001600160a01b0319163017905560055550505050565b6001600160a01b0383166116165760405162461bcd60e51b81526004016103679061273c565b6000611620610fe4565b9050600061162d8461179a565b9050600061163a8461179a565b604080516020808201835260009182905288825260d081528282206001600160a01b038b16835290522054909150848110156116885760405162461bcd60e51b81526004016103679061277f565b600086815260d0602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020612af3833981519152910160405180910390a4604080516020810190915260009052610fdb565b6000604051806080016040528060438152602001612b136043913980516020918201208351848301516040808701518051908601209051611750950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039561177a611c72565b8360405161190160f01b8152600281019290925260228201526042902090565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106117d4576117d46125aa565b602090810291909101015292915050565b6001600160a01b0384163b156111955760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611829908990899088908890889060040161280e565b6020604051808303816000875af1925050508015611864575060408051601f3d908101601f1916820190925261186191810190612853565b60015b61191057611870612870565b806308c379a0036118a9575061188461288b565b8061188f57506118ab565b8060405162461bcd60e51b81526004016103679190611e49565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610367565b6001600160e01b0319811663f23a6e6160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b600030330361199657600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506119999050565b50335b90565b6001600160a01b0384163b156111955760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906119e0908990899088908890889060040161295c565b6020604051808303816000875af1925050508015611a1b575060408051601f3d908101601f19168201909252611a1891810190612853565b60015b611a2757611870612870565b6001600160e01b0319811663bc197c8160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b606b54610100900460ff16611a7e5760405162461bcd60e51b8152600401610367906127c3565b61156b81611cad565b60606000611a968360026129ba565b611aa19060026125ef565b6001600160401b03811115611ab857611ab8611ec3565b6040519080825280601f01601f191660200182016040528015611ae2576020820181803683370190505b509050600360fc1b81600081518110611afd57611afd6125aa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b2c57611b2c6125aa565b60200101906001600160f81b031916908160001a9053506000611b508460026129ba565b611b5b9060016125ef565b90505b6001811115611bd3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611b8f57611b8f6125aa565b1a60f81b828281518110611ba557611ba56125aa565b60200101906001600160f81b031916908160001a90535060049490941c93611bcc816129d1565b9050611b5e565b508315611c225760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610367565b9392505050565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611c90575060015446145b15611c9c575060005490565b610fee600554600354600454611c29565b60d2610b348282612a33565b80356001600160a01b0381168114611cd057600080fd5b919050565b60008060408385031215611ce857600080fd5b611cf183611cb9565b946020939093013593505050565b6001600160e01b03198116811461156b57600080fd5b600060208284031215611d2757600080fd5b8135611c2281611cff565b60008083601f840112611d4457600080fd5b5081356001600160401b03811115611d5b57600080fd5b602083019150836020828501011115611d7357600080fd5b9250929050565b60008060008060008060a08789031215611d9357600080fd5b611d9c87611cb9565b955060208701356001600160401b03811115611db757600080fd5b611dc389828a01611d32565b9096509450506040870135925060608701359150608087013560ff81168114611deb57600080fd5b809150509295509295509295565b60005b83811015611e14578181015183820152602001611dfc565b50506000910152565b60008151808452611e35816020860160208601611df9565b601f01601f19169290920160200192915050565b602081526000611c226020830184611e1d565b600060208284031215611e6e57600080fd5b5035919050565b600080600060608486031215611e8a57600080fd5b611e9384611cb9565b95602085013595506040909401359392505050565b600060208284031215611eba57600080fd5b611c2282611cb9565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611efe57611efe611ec3565b6040525050565b60006001600160401b03821115611f1e57611f1e611ec3565b5060051b60200190565b600082601f830112611f3957600080fd5b81356020611f4682611f05565b604051611f538282611ed9565b83815260059390931b8501820192828101915086841115611f7357600080fd5b8286015b84811015611f8e5780358352918301918301611f77565b509695505050505050565b600082601f830112611faa57600080fd5b81356001600160401b03811115611fc357611fc3611ec3565b604051611fda601f8301601f191660200182611ed9565b818152846020838601011115611fef57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561202457600080fd5b61202d86611cb9565b945061203b60208701611cb9565b935060408601356001600160401b038082111561205757600080fd5b61206389838a01611f28565b9450606088013591508082111561207957600080fd5b61208589838a01611f28565b9350608088013591508082111561209b57600080fd5b506120a888828901611f99565b9150509295509295909350565b600080604083850312156120c857600080fd5b82356001600160401b03808211156120df57600080fd5b818501915085601f8301126120f357600080fd5b8135602061210082611f05565b60405161210d8282611ed9565b83815260059390931b850182019282810191508984111561212d57600080fd5b948201945b838610156121525761214386611cb9565b82529482019490820190612132565b9650508601359250508082111561216857600080fd5b5061217585828601611f28565b9150509250929050565b600081518084526020808501945080840160005b838110156121af57815187529582019590820190600101612193565b509495945050505050565b602081526000611c22602083018461217f565b60008083601f8401126121df57600080fd5b5081356001600160401b038111156121f657600080fd5b6020830191508360208260051b8501011115611d7357600080fd5b6000806000806000806060878903121561222a57600080fd5b86356001600160401b038082111561224157600080fd5b61224d8a838b016121cd565b9098509650602089013591508082111561226657600080fd5b6122728a838b016121cd565b9096509450604089013591508082111561228b57600080fd5b5061229889828a016121cd565b979a9699509497509295939492505050565b6000806000806000606086880312156122c257600080fd5b6122cb86611cb9565b945060208601356001600160401b03808211156122e757600080fd5b6122f389838a016121cd565b9096509450604088013591508082111561230c57600080fd5b50612319888289016121cd565b969995985093965092949392505050565b6000806040838503121561233d57600080fd5b61234683611cb9565b91506020830135801515811461235b57600080fd5b809150509250929050565b6000806040838503121561237957600080fd5b61238283611cb9565b915061239060208401611cb9565b90509250929050565b600080600080600060a086880312156123b157600080fd5b6123ba86611cb9565b94506123c860208701611cb9565b9350604086013592506060860135915060808601356001600160401b038111156123f157600080fd5b6120a888828901611f99565b60008060006040848603121561241257600080fd5b61241b84611cb9565b925060208401356001600160401b0381111561243657600080fd5b61244286828701611d32565b9497909650939450505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251612487818460208701611df9565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b600181811c908216806124f157607f821691505b60208210810361251157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526025908201527f4368696c64455243313135353a204f6e6c79207072656469636174652063616e6040820152640818d85b1b60da1b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016125e8576125e86125c0565b5060010190565b80820180821115610395576103956125c0565b6c4368696c64455243313135352d60981b81526000825161262a81600d850160208701611df9565b91909101600d0192915050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612721604083018561217f565b8281036020840152612733818561217f565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061284890830184611e1d565b979650505050505050565b60006020828403121561286557600080fd5b8151611c2281611cff565b600060033d11156119995760046000803e5060005160e01c90565b600060443d10156128995790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156128c857505050505090565b82850191508151818111156128e05750505050505090565b843d87010160208285010111156128fa5750505050505090565b61290960208286010187611ed9565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906129889083018661217f565b828103606084015261299a818661217f565b905082810360808401526129ae8185611e1d565b98975050505050505050565b8082028115828204841417610395576103956125c0565b6000816129e0576129e06125c0565b506000190190565b601f821115612a2e57600081815260208120601f850160051c81016020861015612a0f5750805b601f850160051c820191505b8181101561119557828155600101612a1b565b505050565b81516001600160401b03811115612a4c57612a4c611ec3565b612a6081612a5a84546124dd565b846129e8565b602080601f831160018114612a955760008415612a7d5750858301515b600019600386901b1c1916600185901b178555611195565b600085815260208120601f198616915b82811015612ac457888601518255948401946001909101908401612aa5565b5085821015612ae25787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f624d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220d48b6656ae2af8f39607add0ff4fc12029027806b1a7c756a64f97827803920c64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101155760003560e01c806357128683116100a2578063e619870511610071578063e619870514610279578063e985e9c51461028b578063f242432a146102c7578063f399e22e146102da578063f5298aca146102ed57600080fd5b8063571286831461022d5780636b20c454146102405780639b77ef1114610253578063a22cb4651461026657600080fd5b8063156e29f6116100e9578063156e29f6146101965780631f2d0065146101a95780632d0335ab146101cf5780632eb2c2d6146101f85780634e1273f41461020d57600080fd5b8062fdd58e1461011a57806301ffc9a7146101405780630c53c51c146101635780630e89341c14610183575b600080fd5b61012d610128366004611cd5565b610300565b6040519081526020015b60405180910390f35b61015361014e366004611d15565b61039b565b6040519015158152602001610137565b610176610171366004611d7a565b6103eb565b6040516101379190611e49565b610176610191366004611e5c565b6106c9565b6101536101a4366004611e75565b61075d565b610103546001600160a01b03165b6040516001600160a01b039091168152602001610137565b61012d6101dd366004611ea8565b6001600160a01b031660009081526038602052604090205490565b61020b61020636600461200c565b6107b0565b005b61022061021b3660046120b5565b61080e565b60405161013791906121ba565b61015361023b366004612211565b610937565b61015361024e3660046122aa565b610a53565b61020b610261366004611e5c565b610afb565b61020b61027436600461232a565b610b22565b610102546001600160a01b03166101b7565b610153610299366004612366565b6001600160a01b03918216600090815260d16020908152604080832093909416825291909152205460ff1690565b61020b6102d5366004612399565b610b38565b61020b6102e83660046123fd565b610b8f565b6101536102fb366004611e75565b610da5565b60006001600160a01b0383166103705760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600081815260d0602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806103cc57506001600160e01b031982166303a24d0760e21b145b8061039557506301ffc9a760e01b6001600160e01b0319831614610395565b6060600061042e87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dde92505050565b90506001600160e01b03196000358116908216036104b45760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f640000006064820152608401610367565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506105258982888888610df9565b61057b5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610367565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d6040516020016105d09392919061244f565b60408051601f19818403018152908290526105ea91612475565b6000604051808303816000865af19150503d8060008114610627576040519150601f19603f3d011682016040523d82523d6000602084013e61062c565b606091505b50915091508161067e5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610367565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c6040516106b39493929190612491565b60405180910390a19a9950505050505050505050565b606060d280546106d8906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610704906124dd565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b50505050509050919050565b610102546000906001600160a01b0316331461078b5760405162461bcd60e51b815260040161036790612517565b6107a684848460405180602001604052806000815250610ed5565b5060019392505050565b6107b8610fe4565b6001600160a01b0316856001600160a01b031614806107de57506107de85610299610fe4565b6107fa5760405162461bcd60e51b81526004016103679061255c565b6108078585858585610ff3565b5050505050565b606081518351146108735760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610367565b600083516001600160401b0381111561088e5761088e611ec3565b6040519080825280602002602001820160405280156108b7578160200160208202803683370190505b50905060005b845181101561092f576109028582815181106108db576108db6125aa565b60200260200101518583815181106108f5576108f56125aa565b6020026020010151610300565b828281518110610914576109146125aa565b6020908102919091010152610928816125d6565b90506108bd565b509392505050565b610102546000906001600160a01b031633146109655760405162461bcd60e51b815260040161036790612517565b85848114801561097457508083145b6109c05760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a206172726179206c656e206d69736d617463686044820152606401610367565b60005b81811015610a4457610a3c8989838181106109e0576109e06125aa565b90506020020160208101906109f59190611ea8565b888884818110610a0757610a076125aa565b90506020020135878785818110610a2057610a206125aa565b9050602002013560405180602001604052806000815250610ed5565b6001016109c3565b50600198975050505050505050565b610102546000906001600160a01b03163314610a815760405162461bcd60e51b815260040161036790612517565b610aef8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061119d92505050565b50600195945050505050565b3360009081526038602052604081208054839290610b1a9084906125ef565b909155505050565b610b34610b2d610fe4565b8383611334565b5050565b610b40610fe4565b6001600160a01b0316856001600160a01b03161480610b665750610b6685610299610fe4565b610b825760405162461bcd60e51b81526004016103679061255c565b6108078585858585611414565b606b54610100900460ff1615808015610baf5750606b54600160ff909116105b80610bc95750303b158015610bc95750606b5460ff166001145b610c2c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610367565b606b805460ff191660011790558015610c4f57606b805461ff0019166101001790555b6001600160a01b038416610ca55760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a204241445f494e495449414c495a4154494f4e6044820152606401610367565b61010380546001600160a01b0386166001600160a01b031991821617909155610102805490911633179055604080516020601f8501819004810282018101909252838152610d0d91859085908190840183828082843760009201919091525061153b92505050565b610d59610d22856001600160a01b031661156e565b604051602001610d329190612602565b60408051601f1981840301815282820190915260018252603160f81b602083015290611584565b8015610d9f57606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610102546000906001600160a01b03163314610dd35760405162461bcd60e51b815260040161036790612517565b6107a68484846115f0565b60008151600003610df157506000919050565b506020015190565b6000806001610e0f610e0a886116f0565b61176d565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610e5d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610367565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6001600160a01b038416610f355760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610367565b6000610f3f610fe4565b90506000610f4c8561179a565b90506000610f598561179a565b9050600086815260d0602090815260408083206001600160a01b038b16845290915281208054879290610f8d9084906125ef565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020612af3833981519152910160405180910390a4610fdb836000898989896117e5565b50505050505050565b6000610fee611940565b905090565b81518351146110145760405162461bcd60e51b815260040161036790612637565b6001600160a01b03841661103a5760405162461bcd60e51b81526004016103679061267f565b6000611044610fe4565b905060005b845181101561112f576000858281518110611066576110666125aa565b602002602001015190506000858381518110611084576110846125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038e1683529093529190912054909150818110156110d55760405162461bcd60e51b8152600401610367906126c4565b600083815260d0602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111149084906125ef565b9250508190555050505080611128906125d6565b9050611049565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161117f92919061270e565b60405180910390a461119581878787878761199c565b505050505050565b6001600160a01b0383166111c35760405162461bcd60e51b81526004016103679061273c565b80518251146111e45760405162461bcd60e51b815260040161036790612637565b60006111ee610fe4565b604080516020810190915260009052905060005b83518110156112c757600084828151811061121f5761121f6125aa565b60200260200101519050600084838151811061123d5761123d6125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038c16835290935291909120549091508181101561128e5760405162461bcd60e51b81526004016103679061277f565b600092835260d0602090815260408085206001600160a01b038b16865290915290922091039055806112bf816125d6565b915050611202565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161131892919061270e565b60405180910390a4604080516020810190915260009052610d9f565b816001600160a01b0316836001600160a01b0316036113a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610367565b6001600160a01b03838116600081815260d16020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661143a5760405162461bcd60e51b81526004016103679061267f565b6000611444610fe4565b905060006114518561179a565b9050600061145e8561179a565b9050600086815260d0602090815260408083206001600160a01b038c168452909152902054858110156114a35760405162461bcd60e51b8152600401610367906126c4565b600087815260d0602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906114e29084906125ef565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020612af3833981519152910160405180910390a4611530848a8a8a8a8a6117e5565b505050505050505050565b606b54610100900460ff166115625760405162461bcd60e51b8152600401610367906127c3565b61156b81611a57565b50565b60606103956001600160a01b0383166014611a87565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6115d2818484611c29565b600055600280546001600160a01b0319163017905560055550505050565b6001600160a01b0383166116165760405162461bcd60e51b81526004016103679061273c565b6000611620610fe4565b9050600061162d8461179a565b9050600061163a8461179a565b604080516020808201835260009182905288825260d081528282206001600160a01b038b16835290522054909150848110156116885760405162461bcd60e51b81526004016103679061277f565b600086815260d0602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020612af3833981519152910160405180910390a4604080516020810190915260009052610fdb565b6000604051806080016040528060438152602001612b136043913980516020918201208351848301516040808701518051908601209051611750950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039561177a611c72565b8360405161190160f01b8152600281019290925260228201526042902090565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106117d4576117d46125aa565b602090810291909101015292915050565b6001600160a01b0384163b156111955760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611829908990899088908890889060040161280e565b6020604051808303816000875af1925050508015611864575060408051601f3d908101601f1916820190925261186191810190612853565b60015b61191057611870612870565b806308c379a0036118a9575061188461288b565b8061188f57506118ab565b8060405162461bcd60e51b81526004016103679190611e49565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610367565b6001600160e01b0319811663f23a6e6160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b600030330361199657600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506119999050565b50335b90565b6001600160a01b0384163b156111955760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906119e0908990899088908890889060040161295c565b6020604051808303816000875af1925050508015611a1b575060408051601f3d908101601f19168201909252611a1891810190612853565b60015b611a2757611870612870565b6001600160e01b0319811663bc197c8160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b606b54610100900460ff16611a7e5760405162461bcd60e51b8152600401610367906127c3565b61156b81611cad565b60606000611a968360026129ba565b611aa19060026125ef565b6001600160401b03811115611ab857611ab8611ec3565b6040519080825280601f01601f191660200182016040528015611ae2576020820181803683370190505b509050600360fc1b81600081518110611afd57611afd6125aa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b2c57611b2c6125aa565b60200101906001600160f81b031916908160001a9053506000611b508460026129ba565b611b5b9060016125ef565b90505b6001811115611bd3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611b8f57611b8f6125aa565b1a60f81b828281518110611ba557611ba56125aa565b60200101906001600160f81b031916908160001a90535060049490941c93611bcc816129d1565b9050611b5e565b508315611c225760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610367565b9392505050565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611c90575060015446145b15611c9c575060005490565b610fee600554600354600454611c29565b60d2610b348282612a33565b80356001600160a01b0381168114611cd057600080fd5b919050565b60008060408385031215611ce857600080fd5b611cf183611cb9565b946020939093013593505050565b6001600160e01b03198116811461156b57600080fd5b600060208284031215611d2757600080fd5b8135611c2281611cff565b60008083601f840112611d4457600080fd5b5081356001600160401b03811115611d5b57600080fd5b602083019150836020828501011115611d7357600080fd5b9250929050565b60008060008060008060a08789031215611d9357600080fd5b611d9c87611cb9565b955060208701356001600160401b03811115611db757600080fd5b611dc389828a01611d32565b9096509450506040870135925060608701359150608087013560ff81168114611deb57600080fd5b809150509295509295509295565b60005b83811015611e14578181015183820152602001611dfc565b50506000910152565b60008151808452611e35816020860160208601611df9565b601f01601f19169290920160200192915050565b602081526000611c226020830184611e1d565b600060208284031215611e6e57600080fd5b5035919050565b600080600060608486031215611e8a57600080fd5b611e9384611cb9565b95602085013595506040909401359392505050565b600060208284031215611eba57600080fd5b611c2282611cb9565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611efe57611efe611ec3565b6040525050565b60006001600160401b03821115611f1e57611f1e611ec3565b5060051b60200190565b600082601f830112611f3957600080fd5b81356020611f4682611f05565b604051611f538282611ed9565b83815260059390931b8501820192828101915086841115611f7357600080fd5b8286015b84811015611f8e5780358352918301918301611f77565b509695505050505050565b600082601f830112611faa57600080fd5b81356001600160401b03811115611fc357611fc3611ec3565b604051611fda601f8301601f191660200182611ed9565b818152846020838601011115611fef57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561202457600080fd5b61202d86611cb9565b945061203b60208701611cb9565b935060408601356001600160401b038082111561205757600080fd5b61206389838a01611f28565b9450606088013591508082111561207957600080fd5b61208589838a01611f28565b9350608088013591508082111561209b57600080fd5b506120a888828901611f99565b9150509295509295909350565b600080604083850312156120c857600080fd5b82356001600160401b03808211156120df57600080fd5b818501915085601f8301126120f357600080fd5b8135602061210082611f05565b60405161210d8282611ed9565b83815260059390931b850182019282810191508984111561212d57600080fd5b948201945b838610156121525761214386611cb9565b82529482019490820190612132565b9650508601359250508082111561216857600080fd5b5061217585828601611f28565b9150509250929050565b600081518084526020808501945080840160005b838110156121af57815187529582019590820190600101612193565b509495945050505050565b602081526000611c22602083018461217f565b60008083601f8401126121df57600080fd5b5081356001600160401b038111156121f657600080fd5b6020830191508360208260051b8501011115611d7357600080fd5b6000806000806000806060878903121561222a57600080fd5b86356001600160401b038082111561224157600080fd5b61224d8a838b016121cd565b9098509650602089013591508082111561226657600080fd5b6122728a838b016121cd565b9096509450604089013591508082111561228b57600080fd5b5061229889828a016121cd565b979a9699509497509295939492505050565b6000806000806000606086880312156122c257600080fd5b6122cb86611cb9565b945060208601356001600160401b03808211156122e757600080fd5b6122f389838a016121cd565b9096509450604088013591508082111561230c57600080fd5b50612319888289016121cd565b969995985093965092949392505050565b6000806040838503121561233d57600080fd5b61234683611cb9565b91506020830135801515811461235b57600080fd5b809150509250929050565b6000806040838503121561237957600080fd5b61238283611cb9565b915061239060208401611cb9565b90509250929050565b600080600080600060a086880312156123b157600080fd5b6123ba86611cb9565b94506123c860208701611cb9565b9350604086013592506060860135915060808601356001600160401b038111156123f157600080fd5b6120a888828901611f99565b60008060006040848603121561241257600080fd5b61241b84611cb9565b925060208401356001600160401b0381111561243657600080fd5b61244286828701611d32565b9497909650939450505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251612487818460208701611df9565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b600181811c908216806124f157607f821691505b60208210810361251157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526025908201527f4368696c64455243313135353a204f6e6c79207072656469636174652063616e6040820152640818d85b1b60da1b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016125e8576125e86125c0565b5060010190565b80820180821115610395576103956125c0565b6c4368696c64455243313135352d60981b81526000825161262a81600d850160208701611df9565b91909101600d0192915050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612721604083018561217f565b8281036020840152612733818561217f565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061284890830184611e1d565b979650505050505050565b60006020828403121561286557600080fd5b8151611c2281611cff565b600060033d11156119995760046000803e5060005160e01c90565b600060443d10156128995790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156128c857505050505090565b82850191508151818111156128e05750505050505090565b843d87010160208285010111156128fa5750505050505090565b61290960208286010187611ed9565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906129889083018661217f565b828103606084015261299a818661217f565b905082810360808401526129ae8185611e1d565b98975050505050505050565b8082028115828204841417610395576103956125c0565b6000816129e0576129e06125c0565b506000190190565b601f821115612a2e57600081815260208120601f850160051c81016020861015612a0f5750805b601f850160051c820191505b8181101561119557828155600101612a1b565b505050565b81516001600160401b03811115612a4c57612a4c611ec3565b612a6081612a5a84546124dd565b846129e8565b602080601f831160018114612a955760008415612a7d5750858301515b600019600386901b1c1916600185901b178555611195565b600085815260208120601f198616915b82811015612ac457888601518255948401946001909101908401612aa5565b5085821015612ae25787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f624d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220d48b6656ae2af8f39607add0ff4fc12029027806b1a7c756a64f97827803920c64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC1155PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155Predicate","sourceName":"contracts/child/ChildERC1155Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612040806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b610170610214366004611648565b6037602052600090815260409020546001600160a01b031681565b61024261023d3660046116b7565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611763565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611798565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b6102426103433660046117de565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611866565b6105dd565b6103918787878787878761073a565b50505050505050565b6103a683338484610ab9565b505050565b6103b784848484610ab9565b50505050565b6034546001600160a01b0316331461042f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461049f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b6064820152608401610426565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104ce6020600084866118c2565b6104d7916118ec565b036104f6576104f16104ec82602081866118c2565b610dce565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186105256020600084866118c2565b61052e916118ec565b0361053d576104f18282611039565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61056c6020600084866118c2565b610575916118ec565b03610584576104f182826112a6565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b6064820152608401610426565b336002600160a01b03146106215760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610426565b600054610100900460ff16158080156106415750600054600160ff909116105b8061065b5750303b15801561065b575060005460ff166001145b6106be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610426565b6000805460ff1916600117905580156106e1576000805461ff0019166101001790555b6106ed8585858561140e565b8015610733576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b8661074481611504565b6107605760405162461bcd60e51b81526004016104269061190a565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c4919061194d565b6001600160a01b038181166000908152603760205260409020549192508a81169116146108035760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610819576108196119af565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610885919061194d565b6001600160a01b03161461089b5761089b6119af565b86851480156108a957508483145b6109035760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b6064820152608401610426565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906109379033908a908a908a908a906004016119f7565b6020604051808303816000875af1158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190611a3b565b6109965760405162461bcd60e51b815260040161042690611a5d565b6033546035546040516001600160a01b03928316926316f198319216906109f1907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611ae8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a1d929190611b99565b600060405180830381600087803b158015610a3757600080fd5b505af1158015610a4b573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610aa696959493929190611bc5565b60405180910390a4505050505050505050565b83610ac381611504565b610adf5760405162461bcd60e51b81526004016104269061190a565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b43919061194d565b6001600160a01b03818116600090815260376020526040902054919250878116911614610b825760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610b9857610b986119af565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c04919061194d565b6001600160a01b031614610c1a57610c1a6119af565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610c4a90339088908890600401611c0e565b6020604051808303816000875af1158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190611a3b565b610ca95760405162461bcd60e51b815260040161042690611a5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f1983193610d3b9391169160e401611b99565b600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051610dbe93929190611c0e565b60405180910390a4505050505050565b600080808080610de086880188611c2f565b6001600160a01b03808616600090815260376020526040902054959a50939850919650945092501680610e255760405162461bcd60e51b81526004016104269061196a565b610e2e81611504565b610e3a57610e3a6119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e919061194d565b9050866001600160a01b0316816001600160a01b031614610ec157610ec16119af565b6001600160a01b038116610ed757610ed76119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f43919061194d565b6001600160a01b031614610f5957610f596119af565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690610f8990889088908890600401611c0e565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc9190611a3b565b610fe85760405162461bcd60e51b815260040161042690611c8a565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610aa693929190611c0e565b60008080808061104b86880188611da0565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806110925760405162461bcd60e51b81526004016104269061196a565b61109b81611504565b6110a7576110a76119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b919061194d565b9050866001600160a01b0316816001600160a01b03161461112e5761112e6119af565b6001600160a01b038116611144576111446119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b0919061194d565b6001600160a01b0316146111c6576111c66119af565b604051635712868360e01b81526001600160a01b038316906357128683906111f690889088908890600401611ee5565b6020604051808303816000875af1158015611215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112399190611a3b565b6112555760405162461bcd60e51b815260040161042690611c8a565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610aa693929190611ee5565b6000806112b583850185611f5a565b9093509150506001600160a01b0382166112d1576112d16119af565b6001600160a01b0382811660009081526037602052604090205416156112f9576112f96119af565b6036546040516bffffffffffffffffffffffff19606085901b166020820152600091611349916001600160a01b039091169060340160405160208183030381529060405280519060200120611599565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061139d9086908690600401611b99565b600060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061142e57506001600160a01b03831615155b801561144257506001600160a01b03821615155b801561145657506001600160a01b03811615155b6114b45760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b6064820152608401610426565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361152057506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611587575060408051601f3d908101601f1916820190925261158491810190611a3b565b60015b61159357506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115935760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610426565b6001600160a01b038116811461164557600080fd5b50565b60006020828403121561165a57600080fd5b813561166581611630565b9392505050565b60008083601f84011261167e57600080fd5b5081356001600160401b0381111561169557600080fd5b6020830191508360208260051b85010111156116b057600080fd5b9250929050565b60008060008060008060006080888a0312156116d257600080fd5b87356116dd81611630565b965060208801356001600160401b03808211156116f957600080fd5b6117058b838c0161166c565b909850965060408a013591508082111561171e57600080fd5b61172a8b838c0161166c565b909650945060608a013591508082111561174357600080fd5b506117508a828b0161166c565b989b979a50959850939692959293505050565b60008060006060848603121561177857600080fd5b833561178381611630565b95602085013595506040909401359392505050565b600080600080608085870312156117ae57600080fd5b84356117b981611630565b935060208501356117c981611630565b93969395505050506040820135916060013590565b600080600080606085870312156117f457600080fd5b84359350602085013561180681611630565b925060408501356001600160401b038082111561182257600080fd5b818701915087601f83011261183657600080fd5b81358181111561184557600080fd5b88602082850101111561185757600080fd5b95989497505060200194505050565b6000806000806080858703121561187c57600080fd5b843561188781611630565b9350602085013561189781611630565b925060408501356118a781611630565b915060608501356118b781611630565b939692955090935050565b600080858511156118d257600080fd5b838611156118df57600080fd5b5050820193919092039150565b8035602083101561159357600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561195f57600080fd5b815161166581611630565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156119de57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611a1c90830186886119c5565b8281036040840152611a2f8185876119c5565b98975050505050505050565b600060208284031215611a4d57600080fd5b8151801515811461166557600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611add578135611ac281611630565b6001600160a01b031687529582019590820190600101611aaf565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611b1b908301888a611a9f565b8281036080840152611b2e8187896119c5565b905082810360a0840152611b438185876119c5565b9c9b505050505050505050505050565b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611bbd90830184611b53565b949350505050565b606081526000611bd960608301888a611a9f565b8281036020840152611bec8187896119c5565b90508281036040840152611c018185876119c5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a08688031215611c4757600080fd5b8535611c5281611630565b94506020860135611c6281611630565b93506040860135611c7281611630565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611d0a57611d0a611ccc565b604052919050565b60006001600160401b03821115611d2b57611d2b611ccc565b5060051b60200190565b600082601f830112611d4657600080fd5b81356020611d5b611d5683611d12565b611ce2565b82815260059290921b84018101918181019086841115611d7a57600080fd5b8286015b84811015611d955780358352918301918301611d7e565b509695505050505050565b60008060008060008060c08789031215611db957600080fd5b86359550602080880135611dcc81611630565b95506040880135611ddc81611630565b945060608801356001600160401b0380821115611df857600080fd5b818a0191508a601f830112611e0c57600080fd5b8135611e1a611d5682611d12565b81815260059190911b8301840190848101908d831115611e3957600080fd5b938501935b82851015611e60578435611e5181611630565b82529385019390850190611e3e565b9750505060808a0135925080831115611e7857600080fd5b611e848b848c01611d35565b945060a08a0135925080831115611e9a57600080fd5b5050611ea889828a01611d35565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611add57815187529582019590820190600101611ec9565b606080825284519082018190526000906020906080840190828801845b82811015611f275781516001600160a01b031684529284019290840190600101611f02565b50505083810382850152611f3b8187611eb5565b9150508281036040840152611f508185611eb5565b9695505050505050565b600080600060608486031215611f6f57600080fd5b83359250602080850135611f8281611630565b925060408501356001600160401b0380821115611f9e57600080fd5b818701915087601f830112611fb257600080fd5b813581811115611fc457611fc4611ccc565b611fd6601f8201601f19168501611ce2565b91508082528884828501011115611fec57600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220144e7d3687aae30c76d4672a727fea0faa7f80324ee0ce29478a172a7808516964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b610170610214366004611648565b6037602052600090815260409020546001600160a01b031681565b61024261023d3660046116b7565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611763565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611798565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b6102426103433660046117de565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611866565b6105dd565b6103918787878787878761073a565b50505050505050565b6103a683338484610ab9565b505050565b6103b784848484610ab9565b50505050565b6034546001600160a01b0316331461042f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461049f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b6064820152608401610426565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104ce6020600084866118c2565b6104d7916118ec565b036104f6576104f16104ec82602081866118c2565b610dce565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186105256020600084866118c2565b61052e916118ec565b0361053d576104f18282611039565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61056c6020600084866118c2565b610575916118ec565b03610584576104f182826112a6565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b6064820152608401610426565b336002600160a01b03146106215760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610426565b600054610100900460ff16158080156106415750600054600160ff909116105b8061065b5750303b15801561065b575060005460ff166001145b6106be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610426565b6000805460ff1916600117905580156106e1576000805461ff0019166101001790555b6106ed8585858561140e565b8015610733576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b8661074481611504565b6107605760405162461bcd60e51b81526004016104269061190a565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c4919061194d565b6001600160a01b038181166000908152603760205260409020549192508a81169116146108035760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610819576108196119af565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610885919061194d565b6001600160a01b03161461089b5761089b6119af565b86851480156108a957508483145b6109035760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b6064820152608401610426565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906109379033908a908a908a908a906004016119f7565b6020604051808303816000875af1158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190611a3b565b6109965760405162461bcd60e51b815260040161042690611a5d565b6033546035546040516001600160a01b03928316926316f198319216906109f1907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611ae8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a1d929190611b99565b600060405180830381600087803b158015610a3757600080fd5b505af1158015610a4b573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610aa696959493929190611bc5565b60405180910390a4505050505050505050565b83610ac381611504565b610adf5760405162461bcd60e51b81526004016104269061190a565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b43919061194d565b6001600160a01b03818116600090815260376020526040902054919250878116911614610b825760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610b9857610b986119af565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c04919061194d565b6001600160a01b031614610c1a57610c1a6119af565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610c4a90339088908890600401611c0e565b6020604051808303816000875af1158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190611a3b565b610ca95760405162461bcd60e51b815260040161042690611a5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f1983193610d3b9391169160e401611b99565b600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051610dbe93929190611c0e565b60405180910390a4505050505050565b600080808080610de086880188611c2f565b6001600160a01b03808616600090815260376020526040902054959a50939850919650945092501680610e255760405162461bcd60e51b81526004016104269061196a565b610e2e81611504565b610e3a57610e3a6119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e919061194d565b9050866001600160a01b0316816001600160a01b031614610ec157610ec16119af565b6001600160a01b038116610ed757610ed76119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f43919061194d565b6001600160a01b031614610f5957610f596119af565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690610f8990889088908890600401611c0e565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc9190611a3b565b610fe85760405162461bcd60e51b815260040161042690611c8a565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610aa693929190611c0e565b60008080808061104b86880188611da0565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806110925760405162461bcd60e51b81526004016104269061196a565b61109b81611504565b6110a7576110a76119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b919061194d565b9050866001600160a01b0316816001600160a01b03161461112e5761112e6119af565b6001600160a01b038116611144576111446119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b0919061194d565b6001600160a01b0316146111c6576111c66119af565b604051635712868360e01b81526001600160a01b038316906357128683906111f690889088908890600401611ee5565b6020604051808303816000875af1158015611215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112399190611a3b565b6112555760405162461bcd60e51b815260040161042690611c8a565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610aa693929190611ee5565b6000806112b583850185611f5a565b9093509150506001600160a01b0382166112d1576112d16119af565b6001600160a01b0382811660009081526037602052604090205416156112f9576112f96119af565b6036546040516bffffffffffffffffffffffff19606085901b166020820152600091611349916001600160a01b039091169060340160405160208183030381529060405280519060200120611599565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061139d9086908690600401611b99565b600060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061142e57506001600160a01b03831615155b801561144257506001600160a01b03821615155b801561145657506001600160a01b03811615155b6114b45760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b6064820152608401610426565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361152057506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611587575060408051601f3d908101601f1916820190925261158491810190611a3b565b60015b61159357506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115935760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610426565b6001600160a01b038116811461164557600080fd5b50565b60006020828403121561165a57600080fd5b813561166581611630565b9392505050565b60008083601f84011261167e57600080fd5b5081356001600160401b0381111561169557600080fd5b6020830191508360208260051b85010111156116b057600080fd5b9250929050565b60008060008060008060006080888a0312156116d257600080fd5b87356116dd81611630565b965060208801356001600160401b03808211156116f957600080fd5b6117058b838c0161166c565b909850965060408a013591508082111561171e57600080fd5b61172a8b838c0161166c565b909650945060608a013591508082111561174357600080fd5b506117508a828b0161166c565b989b979a50959850939692959293505050565b60008060006060848603121561177857600080fd5b833561178381611630565b95602085013595506040909401359392505050565b600080600080608085870312156117ae57600080fd5b84356117b981611630565b935060208501356117c981611630565b93969395505050506040820135916060013590565b600080600080606085870312156117f457600080fd5b84359350602085013561180681611630565b925060408501356001600160401b038082111561182257600080fd5b818701915087601f83011261183657600080fd5b81358181111561184557600080fd5b88602082850101111561185757600080fd5b95989497505060200194505050565b6000806000806080858703121561187c57600080fd5b843561188781611630565b9350602085013561189781611630565b925060408501356118a781611630565b915060608501356118b781611630565b939692955090935050565b600080858511156118d257600080fd5b838611156118df57600080fd5b5050820193919092039150565b8035602083101561159357600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561195f57600080fd5b815161166581611630565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156119de57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611a1c90830186886119c5565b8281036040840152611a2f8185876119c5565b98975050505050505050565b600060208284031215611a4d57600080fd5b8151801515811461166557600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611add578135611ac281611630565b6001600160a01b031687529582019590820190600101611aaf565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611b1b908301888a611a9f565b8281036080840152611b2e8187896119c5565b905082810360a0840152611b438185876119c5565b9c9b505050505050505050505050565b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611bbd90830184611b53565b949350505050565b606081526000611bd960608301888a611a9f565b8281036020840152611bec8187896119c5565b90508281036040840152611c018185876119c5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a08688031215611c4757600080fd5b8535611c5281611630565b94506020860135611c6281611630565b93506040860135611c7281611630565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611d0a57611d0a611ccc565b604052919050565b60006001600160401b03821115611d2b57611d2b611ccc565b5060051b60200190565b600082601f830112611d4657600080fd5b81356020611d5b611d5683611d12565b611ce2565b82815260059290921b84018101918181019086841115611d7a57600080fd5b8286015b84811015611d955780358352918301918301611d7e565b509695505050505050565b60008060008060008060c08789031215611db957600080fd5b86359550602080880135611dcc81611630565b95506040880135611ddc81611630565b945060608801356001600160401b0380821115611df857600080fd5b818a0191508a601f830112611e0c57600080fd5b8135611e1a611d5682611d12565b81815260059190911b8301840190848101908d831115611e3957600080fd5b938501935b82851015611e60578435611e5181611630565b82529385019390850190611e3e565b9750505060808a0135925080831115611e7857600080fd5b611e848b848c01611d35565b945060a08a0135925080831115611e9a57600080fd5b5050611ea889828a01611d35565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611add57815187529582019590820190600101611ec9565b606080825284519082018190526000906020906080840190828801845b82811015611f275781516001600160a01b031684529284019290840190600101611f02565b50505083810382850152611f3b8187611eb5565b9150508281036040840152611f508185611eb5565b9695505050505050565b600080600060608486031215611f6f57600080fd5b83359250602080850135611f8281611630565b925060408501356001600160401b0380821115611f9e57600080fd5b818701915087601f830112611fb257600080fd5b813581811115611fc457611fc4611ccc565b611fd6601f8201601f19168501611ce2565b91508082528884828501011115611fec57600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220144e7d3687aae30c76d4672a727fea0faa7f80324ee0ce29478a172a7808516964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC1155PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155PredicateAccessList","sourceName":"contracts/child/ChildERC1155PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506127d8806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611c73565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004611ce2565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004611d8e565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004611dc3565b610525565b61026661033f366004611e17565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004611e17565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da366004611e34565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b610266610407366004611eca565b6106f6565b61026661041a366004611c73565b610911565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b610266610454366004611f52565b610982565b610461610a7b565b61046b6000610ad5565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610ad5565b50565b6104f4610aee565b61050387878787878787610af6565b50505050505050565b610514610aee565b61052083338484610e76565b505050565b61052d610aee565b61053984848484610e76565b50505050565b610547610a7b565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610a7b565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b6106818888888861118c565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610ad5565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107635760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b60fe546001600160a01b038481169116146107d35760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610802602060008486612020565b61080b9161204a565b0361082a576108256108208260208186612020565b611282565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610859602060008486612020565b6108629161204a565b036108715761082582826114ee565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108a0602060008486612020565b6108a99161204a565b036108b857610825828261175c565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610919610a7b565b606580546001600160a01b0383166001600160a01b0319909116811790915561094a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b03146109a95760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff16158080156109c95750600054600160ff909116105b806109e35750303b1580156109e3575060005460ff166001145b6109ff5760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610a22576000805461ff0019166101001790555b610a2e8585858561118c565b8015610a74576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e9816118c6565b61046b611918565b86610b0081611b32565b610b1c5760405162461bcd60e51b81526004016104d790612068565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906120ab565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610bc05760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610bd657610bd661210d565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906120ab565b6001600160a01b031614610c5857610c5861210d565b8685148015610c6657508483145b610cc05760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610cf49033908a908a908a908a90600401612155565b6020604051808303816000875af1158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d379190612199565b610d535760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe546040516001600160a01b03928316926316f19831921690610dae907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001612241565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610dda9291906122fc565b600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610e6396959493929190612328565b60405180910390a4505050505050505050565b83610e8081611b32565b610e9c5760405162461bcd60e51b81526004016104d790612068565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0091906120ab565b6001600160a01b0381811660009081526101006020526040902054919250878116911614610f405760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610f5657610f5661210d565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc291906120ab565b6001600160a01b031614610fd857610fd861210d565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061100890339088908890600401612371565b6020604051808303816000875af1158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190612199565b6110675760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110f99391169160e4016122fc565b600060405180830381600087803b15801561111357600080fd5b505af1158015611127573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec233888860405161117c93929190612371565b60405180910390a4505050505050565b6001600160a01b038416158015906111ac57506001600160a01b03831615155b80156111c057506001600160a01b03821615155b80156111d457506001600160a01b03811615155b6112325760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b60008080808061129486880188612392565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806112da5760405162461bcd60e51b81526004016104d7906120c8565b6112e381611b32565b6112ef576112ef61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135391906120ab565b9050866001600160a01b0316816001600160a01b0316146113765761137661210d565b6001600160a01b03811661138c5761138c61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f891906120ab565b6001600160a01b03161461140e5761140e61210d565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f69061143e90889088908890600401612371565b6020604051808303816000875af115801561145d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114819190612199565b61149d5760405162461bcd60e51b81526004016104d7906123ed565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610e6393929190612371565b60008080808061150086880188612503565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806115485760405162461bcd60e51b81526004016104d7906120c8565b61155181611b32565b61155d5761155d61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906120ab565b9050866001600160a01b0316816001600160a01b0316146115e4576115e461210d565b6001600160a01b0381166115fa576115fa61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166691906120ab565b6001600160a01b03161461167c5761167c61210d565b604051635712868360e01b81526001600160a01b038316906357128683906116ac90889088908890600401612648565b6020604051808303816000875af11580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef9190612199565b61170b5760405162461bcd60e51b81526004016104d7906123ed565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610e6393929190612648565b60008061176b838501856126bd565b9093509150506001600160a01b0382166117875761178761210d565b6001600160a01b038281166000908152610100602052604090205416156117b0576117b061210d565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611800916001600160a01b039091169060340160405160208183030381529060405280519060200120611bc7565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061185590869086906004016122fc565b600060405180830381600087803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611a2357604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161197a919061276d565b6000604051808303818686fa925050503d80600081146119b6576040519150601f19603f3d011682016040523d82523d6000602084013e6119bb565b606091505b50915091508180156119e057506000818060200190518101906119de9190612789565b115b611a205760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a8a919061276d565b6000604051808303818686fa925050503d8060008114611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b5091509150818015611af1575080806020019051810190611aec9190612789565b600114155b611b2e5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611b4e57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611bb5575060408051601f3d908101601f19168201909252611bb291810190612199565b60015b611bc157506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611bc15760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b6001600160a01b03811681146104e957600080fd5b600060208284031215611c8557600080fd5b8135611c9081611c5e565b9392505050565b60008083601f840112611ca957600080fd5b5081356001600160401b03811115611cc057600080fd5b6020830191508360208260051b8501011115611cdb57600080fd5b9250929050565b60008060008060008060006080888a031215611cfd57600080fd5b8735611d0881611c5e565b965060208801356001600160401b0380821115611d2457600080fd5b611d308b838c01611c97565b909850965060408a0135915080821115611d4957600080fd5b611d558b838c01611c97565b909650945060608a0135915080821115611d6e57600080fd5b50611d7b8a828b01611c97565b989b979a50959850939692959293505050565b600080600060608486031215611da357600080fd5b8335611dae81611c5e565b95602085013595506040909401359392505050565b60008060008060808587031215611dd957600080fd5b8435611de481611c5e565b93506020850135611df481611c5e565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b600060208284031215611e2957600080fd5b8135611c9081611e09565b600080600080600080600060e0888a031215611e4f57600080fd5b8735611e5a81611c5e565b96506020880135611e6a81611c5e565b95506040880135611e7a81611c5e565b94506060880135611e8a81611c5e565b93506080880135611e9a81611e09565b925060a0880135611eaa81611e09565b915060c0880135611eba81611c5e565b8091505092959891949750929550565b60008060008060608587031215611ee057600080fd5b843593506020850135611ef281611c5e565b925060408501356001600160401b0380821115611f0e57600080fd5b818701915087601f830112611f2257600080fd5b813581811115611f3157600080fd5b886020828501011115611f4357600080fd5b95989497505060200194505050565b60008060008060808587031215611f6857600080fd5b8435611f7381611c5e565b93506020850135611f8381611c5e565b92506040850135611f9381611c5e565b91506060850135611fa381611c5e565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561203057600080fd5b8386111561203d57600080fd5b5050820193919092039150565b80356020831015611bc157600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b6000602082840312156120bd57600080fd5b8151611c9081611c5e565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561213c57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038616815260606020820181905260009061217a9083018688612123565b828103604084015261218d818587612123565b98975050505050505050565b6000602082840312156121ab57600080fd5b8151611c9081611e09565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b8581101561223657813561221b81611c5e565b6001600160a01b031687529582019590820190600101612208565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612274908301888a6121f8565b8281036080840152612287818789612123565b905082810360a084015261229c818587612123565b9c9b505050505050505050505050565b60005b838110156122c75781810151838201526020016122af565b50506000910152565b600081518084526122e88160208601602086016122ac565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612320908301846122d0565b949350505050565b60608152600061233c60608301888a6121f8565b828103602084015261234f818789612123565b90508281036040840152612364818587612123565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a086880312156123aa57600080fd5b85356123b581611c5e565b945060208601356123c581611c5e565b935060408601356123d581611c5e565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561246d5761246d61242f565b604052919050565b60006001600160401b0382111561248e5761248e61242f565b5060051b60200190565b600082601f8301126124a957600080fd5b813560206124be6124b983612475565b612445565b82815260059290921b840181019181810190868411156124dd57600080fd5b8286015b848110156124f857803583529183019183016124e1565b509695505050505050565b60008060008060008060c0878903121561251c57600080fd5b8635955060208088013561252f81611c5e565b9550604088013561253f81611c5e565b945060608801356001600160401b038082111561255b57600080fd5b818a0191508a601f83011261256f57600080fd5b813561257d6124b982612475565b81815260059190911b8301840190848101908d83111561259c57600080fd5b938501935b828510156125c35784356125b481611c5e565b825293850193908501906125a1565b9750505060808a01359250808311156125db57600080fd5b6125e78b848c01612498565b945060a08a01359250808311156125fd57600080fd5b505061260b89828a01612498565b9150509295509295509295565b600081518084526020808501945080840160005b838110156122365781518752958201959082019060010161262c565b606080825284519082018190526000906020906080840190828801845b8281101561268a5781516001600160a01b031684529284019290840190600101612665565b5050508381038285015261269e8187612618565b91505082810360408401526126b38185612618565b9695505050505050565b6000806000606084860312156126d257600080fd5b833592506020808501356126e581611c5e565b925060408501356001600160401b038082111561270157600080fd5b818701915087601f83011261271557600080fd5b8135818111156127275761272761242f565b612739601f8201601f19168501612445565b9150808252888482850101111561274f57600080fd5b80848401858401376000848284010152508093505050509250925092565b6000825161277f8184602087016122ac565b9190910192915050565b60006020828403121561279b57600080fd5b505191905056fea26469706673582212205d35ced486c2210da22d8254dca762acf5687ec4e599a9e2dbab26a8777a105964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611c73565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004611ce2565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004611d8e565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004611dc3565b610525565b61026661033f366004611e17565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004611e17565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da366004611e34565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b610266610407366004611eca565b6106f6565b61026661041a366004611c73565b610911565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b610266610454366004611f52565b610982565b610461610a7b565b61046b6000610ad5565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610ad5565b50565b6104f4610aee565b61050387878787878787610af6565b50505050505050565b610514610aee565b61052083338484610e76565b505050565b61052d610aee565b61053984848484610e76565b50505050565b610547610a7b565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610a7b565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b6106818888888861118c565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610ad5565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107635760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b60fe546001600160a01b038481169116146107d35760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610802602060008486612020565b61080b9161204a565b0361082a576108256108208260208186612020565b611282565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610859602060008486612020565b6108629161204a565b036108715761082582826114ee565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108a0602060008486612020565b6108a99161204a565b036108b857610825828261175c565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610919610a7b565b606580546001600160a01b0383166001600160a01b0319909116811790915561094a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b03146109a95760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff16158080156109c95750600054600160ff909116105b806109e35750303b1580156109e3575060005460ff166001145b6109ff5760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610a22576000805461ff0019166101001790555b610a2e8585858561118c565b8015610a74576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e9816118c6565b61046b611918565b86610b0081611b32565b610b1c5760405162461bcd60e51b81526004016104d790612068565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906120ab565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610bc05760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610bd657610bd661210d565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906120ab565b6001600160a01b031614610c5857610c5861210d565b8685148015610c6657508483145b610cc05760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610cf49033908a908a908a908a90600401612155565b6020604051808303816000875af1158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d379190612199565b610d535760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe546040516001600160a01b03928316926316f19831921690610dae907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001612241565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610dda9291906122fc565b600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610e6396959493929190612328565b60405180910390a4505050505050505050565b83610e8081611b32565b610e9c5760405162461bcd60e51b81526004016104d790612068565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0091906120ab565b6001600160a01b0381811660009081526101006020526040902054919250878116911614610f405760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610f5657610f5661210d565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc291906120ab565b6001600160a01b031614610fd857610fd861210d565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061100890339088908890600401612371565b6020604051808303816000875af1158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190612199565b6110675760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110f99391169160e4016122fc565b600060405180830381600087803b15801561111357600080fd5b505af1158015611127573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec233888860405161117c93929190612371565b60405180910390a4505050505050565b6001600160a01b038416158015906111ac57506001600160a01b03831615155b80156111c057506001600160a01b03821615155b80156111d457506001600160a01b03811615155b6112325760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b60008080808061129486880188612392565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806112da5760405162461bcd60e51b81526004016104d7906120c8565b6112e381611b32565b6112ef576112ef61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135391906120ab565b9050866001600160a01b0316816001600160a01b0316146113765761137661210d565b6001600160a01b03811661138c5761138c61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f891906120ab565b6001600160a01b03161461140e5761140e61210d565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f69061143e90889088908890600401612371565b6020604051808303816000875af115801561145d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114819190612199565b61149d5760405162461bcd60e51b81526004016104d7906123ed565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610e6393929190612371565b60008080808061150086880188612503565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806115485760405162461bcd60e51b81526004016104d7906120c8565b61155181611b32565b61155d5761155d61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906120ab565b9050866001600160a01b0316816001600160a01b0316146115e4576115e461210d565b6001600160a01b0381166115fa576115fa61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166691906120ab565b6001600160a01b03161461167c5761167c61210d565b604051635712868360e01b81526001600160a01b038316906357128683906116ac90889088908890600401612648565b6020604051808303816000875af11580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef9190612199565b61170b5760405162461bcd60e51b81526004016104d7906123ed565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610e6393929190612648565b60008061176b838501856126bd565b9093509150506001600160a01b0382166117875761178761210d565b6001600160a01b038281166000908152610100602052604090205416156117b0576117b061210d565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611800916001600160a01b039091169060340160405160208183030381529060405280519060200120611bc7565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061185590869086906004016122fc565b600060405180830381600087803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611a2357604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161197a919061276d565b6000604051808303818686fa925050503d80600081146119b6576040519150601f19603f3d011682016040523d82523d6000602084013e6119bb565b606091505b50915091508180156119e057506000818060200190518101906119de9190612789565b115b611a205760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a8a919061276d565b6000604051808303818686fa925050503d8060008114611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b5091509150818015611af1575080806020019051810190611aec9190612789565b600114155b611b2e5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611b4e57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611bb5575060408051601f3d908101601f19168201909252611bb291810190612199565b60015b611bc157506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611bc15760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b6001600160a01b03811681146104e957600080fd5b600060208284031215611c8557600080fd5b8135611c9081611c5e565b9392505050565b60008083601f840112611ca957600080fd5b5081356001600160401b03811115611cc057600080fd5b6020830191508360208260051b8501011115611cdb57600080fd5b9250929050565b60008060008060008060006080888a031215611cfd57600080fd5b8735611d0881611c5e565b965060208801356001600160401b0380821115611d2457600080fd5b611d308b838c01611c97565b909850965060408a0135915080821115611d4957600080fd5b611d558b838c01611c97565b909650945060608a0135915080821115611d6e57600080fd5b50611d7b8a828b01611c97565b989b979a50959850939692959293505050565b600080600060608486031215611da357600080fd5b8335611dae81611c5e565b95602085013595506040909401359392505050565b60008060008060808587031215611dd957600080fd5b8435611de481611c5e565b93506020850135611df481611c5e565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b600060208284031215611e2957600080fd5b8135611c9081611e09565b600080600080600080600060e0888a031215611e4f57600080fd5b8735611e5a81611c5e565b96506020880135611e6a81611c5e565b95506040880135611e7a81611c5e565b94506060880135611e8a81611c5e565b93506080880135611e9a81611e09565b925060a0880135611eaa81611e09565b915060c0880135611eba81611c5e565b8091505092959891949750929550565b60008060008060608587031215611ee057600080fd5b843593506020850135611ef281611c5e565b925060408501356001600160401b0380821115611f0e57600080fd5b818701915087601f830112611f2257600080fd5b813581811115611f3157600080fd5b886020828501011115611f4357600080fd5b95989497505060200194505050565b60008060008060808587031215611f6857600080fd5b8435611f7381611c5e565b93506020850135611f8381611c5e565b92506040850135611f9381611c5e565b91506060850135611fa381611c5e565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561203057600080fd5b8386111561203d57600080fd5b5050820193919092039150565b80356020831015611bc157600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b6000602082840312156120bd57600080fd5b8151611c9081611c5e565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561213c57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038616815260606020820181905260009061217a9083018688612123565b828103604084015261218d818587612123565b98975050505050505050565b6000602082840312156121ab57600080fd5b8151611c9081611e09565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b8581101561223657813561221b81611c5e565b6001600160a01b031687529582019590820190600101612208565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612274908301888a6121f8565b8281036080840152612287818789612123565b905082810360a084015261229c818587612123565b9c9b505050505050505050505050565b60005b838110156122c75781810151838201526020016122af565b50506000910152565b600081518084526122e88160208601602086016122ac565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612320908301846122d0565b949350505050565b60608152600061233c60608301888a6121f8565b828103602084015261234f818789612123565b90508281036040840152612364818587612123565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a086880312156123aa57600080fd5b85356123b581611c5e565b945060208601356123c581611c5e565b935060408601356123d581611c5e565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561246d5761246d61242f565b604052919050565b60006001600160401b0382111561248e5761248e61242f565b5060051b60200190565b600082601f8301126124a957600080fd5b813560206124be6124b983612475565b612445565b82815260059290921b840181019181810190868411156124dd57600080fd5b8286015b848110156124f857803583529183019183016124e1565b509695505050505050565b60008060008060008060c0878903121561251c57600080fd5b8635955060208088013561252f81611c5e565b9550604088013561253f81611c5e565b945060608801356001600160401b038082111561255b57600080fd5b818a0191508a601f83011261256f57600080fd5b813561257d6124b982612475565b81815260059190911b8301840190848101908d83111561259c57600080fd5b938501935b828510156125c35784356125b481611c5e565b825293850193908501906125a1565b9750505060808a01359250808311156125db57600080fd5b6125e78b848c01612498565b945060a08a01359250808311156125fd57600080fd5b505061260b89828a01612498565b9150509295509295509295565b600081518084526020808501945080840160005b838110156122365781518752958201959082019060010161262c565b606080825284519082018190526000906020906080840190828801845b8281101561268a5781516001600160a01b031684529284019290840190600101612665565b5050508381038285015261269e8187612618565b91505082810360408401526126b38185612618565b9695505050505050565b6000806000606084860312156126d257600080fd5b833592506020808501356126e581611c5e565b925060408501356001600160401b038082111561270157600080fd5b818701915087601f83011261271557600080fd5b8135818111156127275761272761242f565b612739601f8201601f19168501612445565b9150808252888482850101111561274f57600080fd5b80848401858401376000848284010152508093505050509250925092565b6000825161277f8184602087016122ac565b9190910192915050565b60006020828403121561279b57600080fd5b505191905056fea26469706673582212205d35ced486c2210da22d8254dca762acf5687ec4e599a9e2dbab26a8777a105964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC1155PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155Predicate","sourceName":"contracts/child/ChildERC1155Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506123d5806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b6101706102143660046119ca565b6037602052600090815260409020546001600160a01b031681565b61024261023d366004611a39565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611ae5565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611b1a565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b610242610343366004611b60565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611be8565b6108f2565b61039187878787878787610a4f565b50505050505050565b6103a683338484610dce565b505050565b6103b784848484610dce565b50505050565b6103f5604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b8152506110e3565b6034546001600160a01b031633146104675760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b61049f6040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b8152506110e3565b6035546001600160a01b0384811691161461050f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b606482015260840161045e565b610547604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b8152506110e3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610576602060008486611c44565b61057f91611c6e565b0361067e576105bc6040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b8152506110e3565b6105f4604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b8152506110e3565b6106096106048260208186611c44565b611129565b6106416040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b8152506110e3565b610679604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b8152506110e3565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186106ad602060008486611c44565b6106b691611c6e565b036107a7576106f360405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b8152506110e3565b61072b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b8152506110e3565b6107358282611394565b61076e6040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b8152506110e3565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b8152506110e3565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107d6602060008486611c44565b6107df91611c6e565b036108605761081d6040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b8152506110e3565b6108278282611601565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b8152506110e3565b6108996040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b8152506110e3565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b606482015260840161045e565b336002600160a01b03146109365760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161045e565b600054610100900460ff16158080156109565750600054600160ff909116105b806109705750303b158015610970575060005460ff166001145b6109d35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161045e565b6000805460ff1916600117905580156109f6576000805461ff0019166101001790555b610a0285858585611769565b8015610a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b86610a598161185f565b610a755760405162461bcd60e51b815260040161045e90611c8c565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad99190611ccf565b6001600160a01b038181166000908152603760205260409020549192508a8116911614610b185760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610b2e57610b2e611d31565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190611ccf565b6001600160a01b031614610bb057610bb0611d31565b8685148015610bbe57508483145b610c185760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b606482015260840161045e565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610c4c9033908a908a908a908a90600401611d79565b6020604051808303816000875af1158015610c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8f9190611dbd565b610cab5760405162461bcd60e51b815260040161045e90611ddf565b6033546035546040516001600160a01b03928316926316f19831921690610d06907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611e6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d32929190611f1b565b600060405180830381600087803b158015610d4c57600080fd5b505af1158015610d60573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610dbb96959493929190611f47565b60405180910390a4505050505050505050565b83610dd88161185f565b610df45760405162461bcd60e51b815260040161045e90611c8c565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190611ccf565b6001600160a01b03818116600090815260376020526040902054919250878116911614610e975760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610ead57610ead611d31565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611ccf565b6001600160a01b031614610f2f57610f2f611d31565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610f5f90339088908890600401611f90565b6020604051808303816000875af1158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190611dbd565b610fbe5760405162461bcd60e51b815260040161045e90611ddf565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110509391169160e401611f1b565b600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec23388886040516110d393929190611f90565b60405180910390a4505050505050565b611126816040516024016110f79190611fb1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118f4565b50565b60008080808061113b86880188611fc4565b6001600160a01b03808616600090815260376020526040902054959a509398509196509450925016806111805760405162461bcd60e51b815260040161045e90611cec565b6111898161185f565b61119557611195611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f99190611ccf565b9050866001600160a01b0316816001600160a01b03161461121c5761121c611d31565b6001600160a01b03811661123257611232611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190611ccf565b6001600160a01b0316146112b4576112b4611d31565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f6906112e490889088908890600401611f90565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190611dbd565b6113435760405162461bcd60e51b815260040161045e9061201f565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610dbb93929190611f90565b6000808080806113a686880188612135565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806113ed5760405162461bcd60e51b815260040161045e90611cec565b6113f68161185f565b61140257611402611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190611ccf565b9050866001600160a01b0316816001600160a01b03161461148957611489611d31565b6001600160a01b03811661149f5761149f611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190611ccf565b6001600160a01b03161461152157611521611d31565b604051635712868360e01b81526001600160a01b038316906357128683906115519088908890889060040161227a565b6020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115949190611dbd565b6115b05760405162461bcd60e51b815260040161045e9061201f565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610dbb9392919061227a565b600080611610838501856122ef565b9093509150506001600160a01b03821661162c5761162c611d31565b6001600160a01b03828116600090815260376020526040902054161561165457611654611d31565b6036546040516bffffffffffffffffffffffff19606085901b1660208201526000916116a4916001600160a01b0390911690603401604051602081830303815290604052805190602001206118fd565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e906116f89086908690600401611f1b565b600060405180830381600087803b15801561171257600080fd5b505af1158015611726573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061178957506001600160a01b03831615155b801561179d57506001600160a01b03821615155b80156117b157506001600160a01b03811615155b61180f5760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b606482015260840161045e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361187b57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118e2575060408051601f3d908101601f191682019092526118df91810190611dbd565b60015b6118ee57506000919050565b92915050565b61112681611994565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118ee5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161045e565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461112657600080fd5b6000602082840312156119dc57600080fd5b81356119e7816119b5565b9392505050565b60008083601f840112611a0057600080fd5b5081356001600160401b03811115611a1757600080fd5b6020830191508360208260051b8501011115611a3257600080fd5b9250929050565b60008060008060008060006080888a031215611a5457600080fd5b8735611a5f816119b5565b965060208801356001600160401b0380821115611a7b57600080fd5b611a878b838c016119ee565b909850965060408a0135915080821115611aa057600080fd5b611aac8b838c016119ee565b909650945060608a0135915080821115611ac557600080fd5b50611ad28a828b016119ee565b989b979a50959850939692959293505050565b600080600060608486031215611afa57600080fd5b8335611b05816119b5565b95602085013595506040909401359392505050565b60008060008060808587031215611b3057600080fd5b8435611b3b816119b5565b93506020850135611b4b816119b5565b93969395505050506040820135916060013590565b60008060008060608587031215611b7657600080fd5b843593506020850135611b88816119b5565b925060408501356001600160401b0380821115611ba457600080fd5b818701915087601f830112611bb857600080fd5b813581811115611bc757600080fd5b886020828501011115611bd957600080fd5b95989497505060200194505050565b60008060008060808587031215611bfe57600080fd5b8435611c09816119b5565b93506020850135611c19816119b5565b92506040850135611c29816119b5565b91506060850135611c39816119b5565b939692955090935050565b60008085851115611c5457600080fd5b83861115611c6157600080fd5b5050820193919092039150565b803560208310156118ee57600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b600060208284031215611ce157600080fd5b81516119e7816119b5565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611d6057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611d9e9083018688611d47565b8281036040840152611db1818587611d47565b98975050505050505050565b600060208284031215611dcf57600080fd5b815180151581146119e757600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611e5f578135611e44816119b5565b6001600160a01b031687529582019590820190600101611e31565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611e9d908301888a611e21565b8281036080840152611eb0818789611d47565b905082810360a0840152611ec5818587611d47565b9c9b505050505050505050505050565b6000815180845260005b81811015611efb57602081850181015186830182015201611edf565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611f3f90830184611ed5565b949350505050565b606081526000611f5b60608301888a611e21565b8281036020840152611f6e818789611d47565b90508281036040840152611f83818587611d47565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006119e76020830184611ed5565b600080600080600060a08688031215611fdc57600080fd5b8535611fe7816119b5565b94506020860135611ff7816119b5565b93506040860135612007816119b5565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561209f5761209f612061565b604052919050565b60006001600160401b038211156120c0576120c0612061565b5060051b60200190565b600082601f8301126120db57600080fd5b813560206120f06120eb836120a7565b612077565b82815260059290921b8401810191818101908684111561210f57600080fd5b8286015b8481101561212a5780358352918301918301612113565b509695505050505050565b60008060008060008060c0878903121561214e57600080fd5b86359550602080880135612161816119b5565b95506040880135612171816119b5565b945060608801356001600160401b038082111561218d57600080fd5b818a0191508a601f8301126121a157600080fd5b81356121af6120eb826120a7565b81815260059190911b8301840190848101908d8311156121ce57600080fd5b938501935b828510156121f55784356121e6816119b5565b825293850193908501906121d3565b9750505060808a013592508083111561220d57600080fd5b6122198b848c016120ca565b945060a08a013592508083111561222f57600080fd5b505061223d89828a016120ca565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611e5f5781518752958201959082019060010161225e565b606080825284519082018190526000906020906080840190828801845b828110156122bc5781516001600160a01b031684529284019290840190600101612297565b505050838103828501526122d0818761224a565b91505082810360408401526122e5818561224a565b9695505050505050565b60008060006060848603121561230457600080fd5b83359250602080850135612317816119b5565b925060408501356001600160401b038082111561233357600080fd5b818701915087601f83011261234757600080fd5b81358181111561235957612359612061565b61236b601f8201601f19168501612077565b9150808252888482850101111561238157600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220b8ff1c1a3dc85da9eeea2b90e4ccedbf900288e11dfec6acff2354fa0f387aed64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b6101706102143660046119ca565b6037602052600090815260409020546001600160a01b031681565b61024261023d366004611a39565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611ae5565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611b1a565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b610242610343366004611b60565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611be8565b6108f2565b61039187878787878787610a4f565b50505050505050565b6103a683338484610dce565b505050565b6103b784848484610dce565b50505050565b6103f5604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b8152506110e3565b6034546001600160a01b031633146104675760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b61049f6040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b8152506110e3565b6035546001600160a01b0384811691161461050f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b606482015260840161045e565b610547604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b8152506110e3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610576602060008486611c44565b61057f91611c6e565b0361067e576105bc6040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b8152506110e3565b6105f4604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b8152506110e3565b6106096106048260208186611c44565b611129565b6106416040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b8152506110e3565b610679604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b8152506110e3565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186106ad602060008486611c44565b6106b691611c6e565b036107a7576106f360405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b8152506110e3565b61072b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b8152506110e3565b6107358282611394565b61076e6040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b8152506110e3565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b8152506110e3565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107d6602060008486611c44565b6107df91611c6e565b036108605761081d6040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b8152506110e3565b6108278282611601565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b8152506110e3565b6108996040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b8152506110e3565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b606482015260840161045e565b336002600160a01b03146109365760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161045e565b600054610100900460ff16158080156109565750600054600160ff909116105b806109705750303b158015610970575060005460ff166001145b6109d35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161045e565b6000805460ff1916600117905580156109f6576000805461ff0019166101001790555b610a0285858585611769565b8015610a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b86610a598161185f565b610a755760405162461bcd60e51b815260040161045e90611c8c565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad99190611ccf565b6001600160a01b038181166000908152603760205260409020549192508a8116911614610b185760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610b2e57610b2e611d31565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190611ccf565b6001600160a01b031614610bb057610bb0611d31565b8685148015610bbe57508483145b610c185760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b606482015260840161045e565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610c4c9033908a908a908a908a90600401611d79565b6020604051808303816000875af1158015610c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8f9190611dbd565b610cab5760405162461bcd60e51b815260040161045e90611ddf565b6033546035546040516001600160a01b03928316926316f19831921690610d06907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611e6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d32929190611f1b565b600060405180830381600087803b158015610d4c57600080fd5b505af1158015610d60573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610dbb96959493929190611f47565b60405180910390a4505050505050505050565b83610dd88161185f565b610df45760405162461bcd60e51b815260040161045e90611c8c565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190611ccf565b6001600160a01b03818116600090815260376020526040902054919250878116911614610e975760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610ead57610ead611d31565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611ccf565b6001600160a01b031614610f2f57610f2f611d31565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610f5f90339088908890600401611f90565b6020604051808303816000875af1158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190611dbd565b610fbe5760405162461bcd60e51b815260040161045e90611ddf565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110509391169160e401611f1b565b600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec23388886040516110d393929190611f90565b60405180910390a4505050505050565b611126816040516024016110f79190611fb1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118f4565b50565b60008080808061113b86880188611fc4565b6001600160a01b03808616600090815260376020526040902054959a509398509196509450925016806111805760405162461bcd60e51b815260040161045e90611cec565b6111898161185f565b61119557611195611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f99190611ccf565b9050866001600160a01b0316816001600160a01b03161461121c5761121c611d31565b6001600160a01b03811661123257611232611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190611ccf565b6001600160a01b0316146112b4576112b4611d31565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f6906112e490889088908890600401611f90565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190611dbd565b6113435760405162461bcd60e51b815260040161045e9061201f565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610dbb93929190611f90565b6000808080806113a686880188612135565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806113ed5760405162461bcd60e51b815260040161045e90611cec565b6113f68161185f565b61140257611402611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190611ccf565b9050866001600160a01b0316816001600160a01b03161461148957611489611d31565b6001600160a01b03811661149f5761149f611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190611ccf565b6001600160a01b03161461152157611521611d31565b604051635712868360e01b81526001600160a01b038316906357128683906115519088908890889060040161227a565b6020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115949190611dbd565b6115b05760405162461bcd60e51b815260040161045e9061201f565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610dbb9392919061227a565b600080611610838501856122ef565b9093509150506001600160a01b03821661162c5761162c611d31565b6001600160a01b03828116600090815260376020526040902054161561165457611654611d31565b6036546040516bffffffffffffffffffffffff19606085901b1660208201526000916116a4916001600160a01b0390911690603401604051602081830303815290604052805190602001206118fd565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e906116f89086908690600401611f1b565b600060405180830381600087803b15801561171257600080fd5b505af1158015611726573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061178957506001600160a01b03831615155b801561179d57506001600160a01b03821615155b80156117b157506001600160a01b03811615155b61180f5760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b606482015260840161045e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361187b57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118e2575060408051601f3d908101601f191682019092526118df91810190611dbd565b60015b6118ee57506000919050565b92915050565b61112681611994565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118ee5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161045e565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461112657600080fd5b6000602082840312156119dc57600080fd5b81356119e7816119b5565b9392505050565b60008083601f840112611a0057600080fd5b5081356001600160401b03811115611a1757600080fd5b6020830191508360208260051b8501011115611a3257600080fd5b9250929050565b60008060008060008060006080888a031215611a5457600080fd5b8735611a5f816119b5565b965060208801356001600160401b0380821115611a7b57600080fd5b611a878b838c016119ee565b909850965060408a0135915080821115611aa057600080fd5b611aac8b838c016119ee565b909650945060608a0135915080821115611ac557600080fd5b50611ad28a828b016119ee565b989b979a50959850939692959293505050565b600080600060608486031215611afa57600080fd5b8335611b05816119b5565b95602085013595506040909401359392505050565b60008060008060808587031215611b3057600080fd5b8435611b3b816119b5565b93506020850135611b4b816119b5565b93969395505050506040820135916060013590565b60008060008060608587031215611b7657600080fd5b843593506020850135611b88816119b5565b925060408501356001600160401b0380821115611ba457600080fd5b818701915087601f830112611bb857600080fd5b813581811115611bc757600080fd5b886020828501011115611bd957600080fd5b95989497505060200194505050565b60008060008060808587031215611bfe57600080fd5b8435611c09816119b5565b93506020850135611c19816119b5565b92506040850135611c29816119b5565b91506060850135611c39816119b5565b939692955090935050565b60008085851115611c5457600080fd5b83861115611c6157600080fd5b5050820193919092039150565b803560208310156118ee57600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b600060208284031215611ce157600080fd5b81516119e7816119b5565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611d6057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611d9e9083018688611d47565b8281036040840152611db1818587611d47565b98975050505050505050565b600060208284031215611dcf57600080fd5b815180151581146119e757600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611e5f578135611e44816119b5565b6001600160a01b031687529582019590820190600101611e31565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611e9d908301888a611e21565b8281036080840152611eb0818789611d47565b905082810360a0840152611ec5818587611d47565b9c9b505050505050505050505050565b6000815180845260005b81811015611efb57602081850181015186830182015201611edf565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611f3f90830184611ed5565b949350505050565b606081526000611f5b60608301888a611e21565b8281036020840152611f6e818789611d47565b90508281036040840152611f83818587611d47565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006119e76020830184611ed5565b600080600080600060a08688031215611fdc57600080fd5b8535611fe7816119b5565b94506020860135611ff7816119b5565b93506040860135612007816119b5565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561209f5761209f612061565b604052919050565b60006001600160401b038211156120c0576120c0612061565b5060051b60200190565b600082601f8301126120db57600080fd5b813560206120f06120eb836120a7565b612077565b82815260059290921b8401810191818101908684111561210f57600080fd5b8286015b8481101561212a5780358352918301918301612113565b509695505050505050565b60008060008060008060c0878903121561214e57600080fd5b86359550602080880135612161816119b5565b95506040880135612171816119b5565b945060608801356001600160401b038082111561218d57600080fd5b818a0191508a601f8301126121a157600080fd5b81356121af6120eb826120a7565b81815260059190911b8301840190848101908d8311156121ce57600080fd5b938501935b828510156121f55784356121e6816119b5565b825293850193908501906121d3565b9750505060808a013592508083111561220d57600080fd5b6122198b848c016120ca565b945060a08a013592508083111561222f57600080fd5b505061223d89828a016120ca565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611e5f5781518752958201959082019060010161225e565b606080825284519082018190526000906020906080840190828801845b828110156122bc5781516001600160a01b031684529284019290840190600101612297565b505050838103828501526122d0818761224a565b91505082810360408401526122e5818561224a565b9695505050505050565b60008060006060848603121561230457600080fd5b83359250602080850135612317816119b5565b925060408501356001600160401b038082111561233357600080fd5b818701915087601f83011261234757600080fd5b81358181111561235957612359612061565b61236b601f8201601f19168501612077565b9150808252888482850101111561238157600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220b8ff1c1a3dc85da9eeea2b90e4ccedbf900288e11dfec6acff2354fa0f387aed64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC1155PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155PredicateAccessList","sourceName":"contracts/child/ChildERC1155PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612b6d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611ff5565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004612064565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004612110565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004612145565b610525565b61026661033f366004612199565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004612199565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da3660046121b6565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b61026661040736600461224c565b6106f6565b61026661041a366004611ff5565b610c26565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102666104543660046122d4565b610c97565b610461610d90565b61046b6000610dea565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610dea565b50565b6104f4610e03565b61050387878787878787610e0b565b50505050505050565b610514610e03565b6105208333848461118b565b505050565b61052d610e03565b6105398484848461118b565b50505050565b610547610d90565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610d90565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b610681888888886114a1565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610dea565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61072e604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b815250611597565b60fd546001600160a01b0316331461079b5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b6107d36040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b815250611597565b60fe546001600160a01b038481169116146108435760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b61087b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b815250611597565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108aa6020600084866123a2565b6108b3916123cc565b036109b2576108f06040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b815250611597565b610928604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b815250611597565b61093d61093882602081866123a2565b6115da565b6109756040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b815250611597565b6109ad604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b815250611597565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109e16020600084866123a2565b6109ea916123cc565b03610adb57610a2760405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b815250611597565b610a5f604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b815250611597565b610a698282611846565b610aa26040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b815250611597565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b815250611597565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610b0a6020600084866123a2565b610b13916123cc565b03610b9457610b516040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b815250611597565b610b5b8282611ab4565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b815250611597565b610bcd6040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b815250611597565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610c2e610d90565b606580546001600160a01b0383166001600160a01b03199091168117909155610c5f6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b0314610cbe5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff1615808015610cde5750600054600160ff909116105b80610cf85750303b158015610cf8575060005460ff166001145b610d145760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610d37576000805461ff0019166101001790555b610d43858585856114a1565b8015610d89576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e981611c1e565b61046b611c70565b86610e1581611e8a565b610e315760405162461bcd60e51b81526004016104d7906123ea565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e95919061242d565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610ed55760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b038116610eeb57610eeb61248f565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f57919061242d565b6001600160a01b031614610f6d57610f6d61248f565b8685148015610f7b57508483145b610fd55760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906110099033908a908a908a908a906004016124d7565b6020604051808303816000875af1158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c919061251b565b6110685760405162461bcd60e51b81526004016104d790612538565b60fc5460fe546040516001600160a01b03928316926316f198319216906110c3907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f906020016125c3565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110ef92919061267e565b600060405180830381600087803b15801561110957600080fd5b505af115801561111d573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051611178969594939291906126aa565b60405180910390a4505050505050505050565b8361119581611e8a565b6111b15760405162461bcd60e51b81526004016104d7906123ea565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611215919061242d565b6001600160a01b03818116600090815261010060205260409020549192508781169116146112555760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b03811661126b5761126b61248f565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d7919061242d565b6001600160a01b0316146112ed576112ed61248f565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061131d903390889088906004016126f3565b6020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061251b565b61137c5760405162461bcd60e51b81526004016104d790612538565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f198319361140e9391169160e40161267e565b600060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051611491939291906126f3565b60405180910390a4505050505050565b6001600160a01b038416158015906114c157506001600160a01b03831615155b80156114d557506001600160a01b03821615155b80156114e957506001600160a01b03811615155b6115475760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6104e9816040516024016115ab9190612714565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611f1f565b6000808080806115ec86880188612727565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806116325760405162461bcd60e51b81526004016104d79061244a565b61163b81611e8a565b6116475761164761248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ab919061242d565b9050866001600160a01b0316816001600160a01b0316146116ce576116ce61248f565b6001600160a01b0381166116e4576116e461248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611750919061242d565b6001600160a01b0316146117665761176661248f565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690611796908890889088906004016126f3565b6020604051808303816000875af11580156117b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d9919061251b565b6117f55760405162461bcd60e51b81526004016104d790612782565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051611178939291906126f3565b60008080808061185886880188612898565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806118a05760405162461bcd60e51b81526004016104d79061244a565b6118a981611e8a565b6118b5576118b561248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611919919061242d565b9050866001600160a01b0316816001600160a01b03161461193c5761193c61248f565b6001600160a01b0381166119525761195261248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119be919061242d565b6001600160a01b0316146119d4576119d461248f565b604051635712868360e01b81526001600160a01b03831690635712868390611a04908890889088906004016129dd565b6020604051808303816000875af1158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a47919061251b565b611a635760405162461bcd60e51b81526004016104d790612782565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051611178939291906129dd565b600080611ac383850185612a52565b9093509150506001600160a01b038216611adf57611adf61248f565b6001600160a01b03828116600090815261010060205260409020541615611b0857611b0861248f565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611b58916001600160a01b039091169060340160405160208183030381529060405280519060200120611f28565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e90611bad908690869060040161267e565b600060405180830381600087803b158015611bc757600080fd5b505af1158015611bdb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611d7b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611cd29190612b02565b6000604051808303818686fa925050503d8060008114611d0e576040519150601f19603f3d011682016040523d82523d6000602084013e611d13565b606091505b5091509150818015611d385750600081806020019051810190611d369190612b1e565b115b611d785760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611de29190612b02565b6000604051808303818686fa925050503d8060008114611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b5091509150818015611e49575080806020019051810190611e449190612b1e565b600114155b611e865760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611ea657506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611f0d575060408051601f3d908101601f19168201909252611f0a9181019061251b565b60015b611f1957506000919050565b92915050565b6104e981611fbf565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611f195760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146104e957600080fd5b60006020828403121561200757600080fd5b813561201281611fe0565b9392505050565b60008083601f84011261202b57600080fd5b5081356001600160401b0381111561204257600080fd5b6020830191508360208260051b850101111561205d57600080fd5b9250929050565b60008060008060008060006080888a03121561207f57600080fd5b873561208a81611fe0565b965060208801356001600160401b03808211156120a657600080fd5b6120b28b838c01612019565b909850965060408a01359150808211156120cb57600080fd5b6120d78b838c01612019565b909650945060608a01359150808211156120f057600080fd5b506120fd8a828b01612019565b989b979a50959850939692959293505050565b60008060006060848603121561212557600080fd5b833561213081611fe0565b95602085013595506040909401359392505050565b6000806000806080858703121561215b57600080fd5b843561216681611fe0565b9350602085013561217681611fe0565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b6000602082840312156121ab57600080fd5b81356120128161218b565b600080600080600080600060e0888a0312156121d157600080fd5b87356121dc81611fe0565b965060208801356121ec81611fe0565b955060408801356121fc81611fe0565b9450606088013561220c81611fe0565b9350608088013561221c8161218b565b925060a088013561222c8161218b565b915060c088013561223c81611fe0565b8091505092959891949750929550565b6000806000806060858703121561226257600080fd5b84359350602085013561227481611fe0565b925060408501356001600160401b038082111561229057600080fd5b818701915087601f8301126122a457600080fd5b8135818111156122b357600080fd5b8860208285010111156122c557600080fd5b95989497505060200194505050565b600080600080608085870312156122ea57600080fd5b84356122f581611fe0565b9350602085013561230581611fe0565b9250604085013561231581611fe0565b9150606085013561232581611fe0565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156123b257600080fd5b838611156123bf57600080fd5b5050820193919092039150565b80356020831015611f1957600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561243f57600080fd5b815161201281611fe0565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156124be57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03861681526060602082018190526000906124fc90830186886124a5565b828103604084015261250f8185876124a5565b98975050505050505050565b60006020828403121561252d57600080fd5b81516120128161218b565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b858110156125b857813561259d81611fe0565b6001600160a01b03168752958201959082019060010161258a565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906125f6908301888a61257a565b82810360808401526126098187896124a5565b905082810360a084015261261e8185876124a5565b9c9b505050505050505050505050565b60005b83811015612649578181015183820152602001612631565b50506000910152565b6000815180845261266a81602086016020860161262e565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906126a290830184612652565b949350505050565b6060815260006126be60608301888a61257a565b82810360208401526126d18187896124a5565b905082810360408401526126e68185876124a5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006120126020830184612652565b600080600080600060a0868803121561273f57600080fd5b853561274a81611fe0565b9450602086013561275a81611fe0565b9350604086013561276a81611fe0565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612802576128026127c4565b604052919050565b60006001600160401b03821115612823576128236127c4565b5060051b60200190565b600082601f83011261283e57600080fd5b8135602061285361284e8361280a565b6127da565b82815260059290921b8401810191818101908684111561287257600080fd5b8286015b8481101561288d5780358352918301918301612876565b509695505050505050565b60008060008060008060c087890312156128b157600080fd5b863595506020808801356128c481611fe0565b955060408801356128d481611fe0565b945060608801356001600160401b03808211156128f057600080fd5b818a0191508a601f83011261290457600080fd5b813561291261284e8261280a565b81815260059190911b8301840190848101908d83111561293157600080fd5b938501935b8285101561295857843561294981611fe0565b82529385019390850190612936565b9750505060808a013592508083111561297057600080fd5b61297c8b848c0161282d565b945060a08a013592508083111561299257600080fd5b50506129a089828a0161282d565b9150509295509295509295565b600081518084526020808501945080840160005b838110156125b8578151875295820195908201906001016129c1565b606080825284519082018190526000906020906080840190828801845b82811015612a1f5781516001600160a01b0316845292840192908401906001016129fa565b50505083810382850152612a3381876129ad565b9150508281036040840152612a4881856129ad565b9695505050505050565b600080600060608486031215612a6757600080fd5b83359250602080850135612a7a81611fe0565b925060408501356001600160401b0380821115612a9657600080fd5b818701915087601f830112612aaa57600080fd5b813581811115612abc57612abc6127c4565b612ace601f8201601f191685016127da565b91508082528884828501011115612ae457600080fd5b80848401858401376000848284010152508093505050509250925092565b60008251612b1481846020870161262e565b9190910192915050565b600060208284031215612b3057600080fd5b505191905056fea26469706673582212201c0bd6f5fcdfe08c70b8df7e77905aeb88a61268b0b41fb26f79c4fe107b8b8764736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611ff5565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004612064565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004612110565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004612145565b610525565b61026661033f366004612199565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004612199565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da3660046121b6565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b61026661040736600461224c565b6106f6565b61026661041a366004611ff5565b610c26565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102666104543660046122d4565b610c97565b610461610d90565b61046b6000610dea565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610dea565b50565b6104f4610e03565b61050387878787878787610e0b565b50505050505050565b610514610e03565b6105208333848461118b565b505050565b61052d610e03565b6105398484848461118b565b50505050565b610547610d90565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610d90565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b610681888888886114a1565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610dea565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61072e604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b815250611597565b60fd546001600160a01b0316331461079b5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b6107d36040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b815250611597565b60fe546001600160a01b038481169116146108435760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b61087b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b815250611597565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108aa6020600084866123a2565b6108b3916123cc565b036109b2576108f06040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b815250611597565b610928604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b815250611597565b61093d61093882602081866123a2565b6115da565b6109756040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b815250611597565b6109ad604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b815250611597565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109e16020600084866123a2565b6109ea916123cc565b03610adb57610a2760405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b815250611597565b610a5f604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b815250611597565b610a698282611846565b610aa26040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b815250611597565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b815250611597565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610b0a6020600084866123a2565b610b13916123cc565b03610b9457610b516040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b815250611597565b610b5b8282611ab4565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b815250611597565b610bcd6040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b815250611597565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610c2e610d90565b606580546001600160a01b0383166001600160a01b03199091168117909155610c5f6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b0314610cbe5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff1615808015610cde5750600054600160ff909116105b80610cf85750303b158015610cf8575060005460ff166001145b610d145760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610d37576000805461ff0019166101001790555b610d43858585856114a1565b8015610d89576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e981611c1e565b61046b611c70565b86610e1581611e8a565b610e315760405162461bcd60e51b81526004016104d7906123ea565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e95919061242d565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610ed55760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b038116610eeb57610eeb61248f565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f57919061242d565b6001600160a01b031614610f6d57610f6d61248f565b8685148015610f7b57508483145b610fd55760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906110099033908a908a908a908a906004016124d7565b6020604051808303816000875af1158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c919061251b565b6110685760405162461bcd60e51b81526004016104d790612538565b60fc5460fe546040516001600160a01b03928316926316f198319216906110c3907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f906020016125c3565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110ef92919061267e565b600060405180830381600087803b15801561110957600080fd5b505af115801561111d573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051611178969594939291906126aa565b60405180910390a4505050505050505050565b8361119581611e8a565b6111b15760405162461bcd60e51b81526004016104d7906123ea565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611215919061242d565b6001600160a01b03818116600090815261010060205260409020549192508781169116146112555760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b03811661126b5761126b61248f565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d7919061242d565b6001600160a01b0316146112ed576112ed61248f565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061131d903390889088906004016126f3565b6020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061251b565b61137c5760405162461bcd60e51b81526004016104d790612538565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f198319361140e9391169160e40161267e565b600060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051611491939291906126f3565b60405180910390a4505050505050565b6001600160a01b038416158015906114c157506001600160a01b03831615155b80156114d557506001600160a01b03821615155b80156114e957506001600160a01b03811615155b6115475760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6104e9816040516024016115ab9190612714565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611f1f565b6000808080806115ec86880188612727565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806116325760405162461bcd60e51b81526004016104d79061244a565b61163b81611e8a565b6116475761164761248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ab919061242d565b9050866001600160a01b0316816001600160a01b0316146116ce576116ce61248f565b6001600160a01b0381166116e4576116e461248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611750919061242d565b6001600160a01b0316146117665761176661248f565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690611796908890889088906004016126f3565b6020604051808303816000875af11580156117b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d9919061251b565b6117f55760405162461bcd60e51b81526004016104d790612782565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051611178939291906126f3565b60008080808061185886880188612898565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806118a05760405162461bcd60e51b81526004016104d79061244a565b6118a981611e8a565b6118b5576118b561248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611919919061242d565b9050866001600160a01b0316816001600160a01b03161461193c5761193c61248f565b6001600160a01b0381166119525761195261248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119be919061242d565b6001600160a01b0316146119d4576119d461248f565b604051635712868360e01b81526001600160a01b03831690635712868390611a04908890889088906004016129dd565b6020604051808303816000875af1158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a47919061251b565b611a635760405162461bcd60e51b81526004016104d790612782565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051611178939291906129dd565b600080611ac383850185612a52565b9093509150506001600160a01b038216611adf57611adf61248f565b6001600160a01b03828116600090815261010060205260409020541615611b0857611b0861248f565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611b58916001600160a01b039091169060340160405160208183030381529060405280519060200120611f28565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e90611bad908690869060040161267e565b600060405180830381600087803b158015611bc757600080fd5b505af1158015611bdb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611d7b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611cd29190612b02565b6000604051808303818686fa925050503d8060008114611d0e576040519150601f19603f3d011682016040523d82523d6000602084013e611d13565b606091505b5091509150818015611d385750600081806020019051810190611d369190612b1e565b115b611d785760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611de29190612b02565b6000604051808303818686fa925050503d8060008114611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b5091509150818015611e49575080806020019051810190611e449190612b1e565b600114155b611e865760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611ea657506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611f0d575060408051601f3d908101601f19168201909252611f0a9181019061251b565b60015b611f1957506000919050565b92915050565b6104e981611fbf565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611f195760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146104e957600080fd5b60006020828403121561200757600080fd5b813561201281611fe0565b9392505050565b60008083601f84011261202b57600080fd5b5081356001600160401b0381111561204257600080fd5b6020830191508360208260051b850101111561205d57600080fd5b9250929050565b60008060008060008060006080888a03121561207f57600080fd5b873561208a81611fe0565b965060208801356001600160401b03808211156120a657600080fd5b6120b28b838c01612019565b909850965060408a01359150808211156120cb57600080fd5b6120d78b838c01612019565b909650945060608a01359150808211156120f057600080fd5b506120fd8a828b01612019565b989b979a50959850939692959293505050565b60008060006060848603121561212557600080fd5b833561213081611fe0565b95602085013595506040909401359392505050565b6000806000806080858703121561215b57600080fd5b843561216681611fe0565b9350602085013561217681611fe0565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b6000602082840312156121ab57600080fd5b81356120128161218b565b600080600080600080600060e0888a0312156121d157600080fd5b87356121dc81611fe0565b965060208801356121ec81611fe0565b955060408801356121fc81611fe0565b9450606088013561220c81611fe0565b9350608088013561221c8161218b565b925060a088013561222c8161218b565b915060c088013561223c81611fe0565b8091505092959891949750929550565b6000806000806060858703121561226257600080fd5b84359350602085013561227481611fe0565b925060408501356001600160401b038082111561229057600080fd5b818701915087601f8301126122a457600080fd5b8135818111156122b357600080fd5b8860208285010111156122c557600080fd5b95989497505060200194505050565b600080600080608085870312156122ea57600080fd5b84356122f581611fe0565b9350602085013561230581611fe0565b9250604085013561231581611fe0565b9150606085013561232581611fe0565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156123b257600080fd5b838611156123bf57600080fd5b5050820193919092039150565b80356020831015611f1957600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561243f57600080fd5b815161201281611fe0565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156124be57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03861681526060602082018190526000906124fc90830186886124a5565b828103604084015261250f8185876124a5565b98975050505050505050565b60006020828403121561252d57600080fd5b81516120128161218b565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b858110156125b857813561259d81611fe0565b6001600160a01b03168752958201959082019060010161258a565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906125f6908301888a61257a565b82810360808401526126098187896124a5565b905082810360a084015261261e8185876124a5565b9c9b505050505050505050505050565b60005b83811015612649578181015183820152602001612631565b50506000910152565b6000815180845261266a81602086016020860161262e565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906126a290830184612652565b949350505050565b6060815260006126be60608301888a61257a565b82810360208401526126d18187896124a5565b905082810360408401526126e68185876124a5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006120126020830184612652565b600080600080600060a0868803121561273f57600080fd5b853561274a81611fe0565b9450602086013561275a81611fe0565b9350604086013561276a81611fe0565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612802576128026127c4565b604052919050565b60006001600160401b03821115612823576128236127c4565b5060051b60200190565b600082601f83011261283e57600080fd5b8135602061285361284e8361280a565b6127da565b82815260059290921b8401810191818101908684111561287257600080fd5b8286015b8481101561288d5780358352918301918301612876565b509695505050505050565b60008060008060008060c087890312156128b157600080fd5b863595506020808801356128c481611fe0565b955060408801356128d481611fe0565b945060608801356001600160401b03808211156128f057600080fd5b818a0191508a601f83011261290457600080fd5b813561291261284e8261280a565b81815260059190911b8301840190848101908d83111561293157600080fd5b938501935b8285101561295857843561294981611fe0565b82529385019390850190612936565b9750505060808a013592508083111561297057600080fd5b61297c8b848c0161282d565b945060a08a013592508083111561299257600080fd5b50506129a089828a0161282d565b9150509295509295509295565b600081518084526020808501945080840160005b838110156125b8578151875295820195908201906001016129c1565b606080825284519082018190526000906020906080840190828801845b82811015612a1f5781516001600160a01b0316845292840192908401906001016129fa565b50505083810382850152612a3381876129ad565b9150508281036040840152612a4881856129ad565b9695505050505050565b600080600060608486031215612a6757600080fd5b83359250602080850135612a7a81611fe0565b925060408501356001600160401b0380821115612a9657600080fd5b818701915087601f830112612aaa57600080fd5b813581811115612abc57612abc6127c4565b612ace601f8201601f191685016127da565b91508082528884828501011115612ae457600080fd5b80848401858401376000848284010152508093505050509250925092565b60008251612b1481846020870161262e565b9190910192915050565b600060208284031215612b3057600080fd5b505191905056fea26469706673582212201c0bd6f5fcdfe08c70b8df7e77905aeb88a61268b0b41fb26f79c4fe107b8b8764736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC1155PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC1155Predicate","sourceName":"contracts/child/RootMintableERC1155Predicate.sol","abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"childToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611c01806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063b68ad1e4116100ad578063eeb4994511610071578063eeb49945146102fe578063f23a6e6114610311578063f4a120f714610330578063f645125514610343578063f8c8765e1461036a57600080fd5b8063b68ad1e41461023e578063bc197c8114610251578063c5ac2b1c14610289578063d41f1771146102b0578063d7c9e3ec146102d757600080fd5b80634c4c45de116100f45780634c4c45de146101a7578063654715e6146101ba5780637efab4f5146101cd578063a78e111c146101f6578063b17680651461020957600080fd5b806301ffc9a71461012657806305dc2e8f1461014e5780630efe6a8b146101795780631bc114ba1461018e575b600080fd5b610139610134366004611182565b61037d565b60405190151581526020015b60405180910390f35b600154610161906001600160a01b031681565b6040516001600160a01b039091168152602001610145565b61018c6101873660046111cb565b6103b4565b005b600054610161906201000090046001600160a01b031681565b61018c6101b536600461124b565b6103c5565b600254610161906001600160a01b031681565b6101616101db3660046112f7565b6004602052600090815260409020546001600160a01b031681565b61018c610204366004611314565b61043f565b6102307f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b604051908152602001610145565b600354610161906001600160a01b031681565b61027061025f3660046114a6565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610145565b6102307faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102307f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102307f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018c61030c366004611553565b610451565b61027061031f3660046115db565b63f23a6e6160e01b95945050505050565b61016161033e3660046112f7565b610629565b6102307f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61018c610378366004611643565b610944565b60006001600160e01b03198216630271189760e51b14806103ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6103c083338484610a5d565b505050565b84831480156103d357508481145b6104275760405162461bcd60e51b815260206004820152602c6024820152600080516020611bac83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61043687878787878787610bf3565b50505050505050565b61044b84848484610a5d565b50505050565b6001546001600160a01b031633146104c55760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b606482015260840161041e565b6002546001600160a01b0384811691161461053d5760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b606482015260840161041e565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961056c60206000848661169f565b610575916116c9565b036105945761058f61058a826020818661169f565b610dd3565b61044b565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26105c360206000848661169f565b6105cc916116c9565b036105db5761058f8282610ed2565b60405162461bcd60e51b815260206004820152602f6024820152600080516020611bac83398151915260448201526e56414c49445f5349474e415455524560881b606482015260840161041e565b60006001600160a01b0382166106835760405162461bcd60e51b815260206004820152602b6024820152600080516020611bac83398151915260448201526a2b20a624a22faa27a5a2a760a91b606482015260840161041e565b6001600160a01b0382811660009081526004602052604090205416156107005760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b606482015260840161041e565b6002546003546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b03928316926107aa921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b03848116600081815260046020818152604080842080546001600160a01b031916968816969096179095558451908101855282815293516303a24d0760e21b8152908101919091529294509091630e89341c90602401600060405180830381865afa92505050801561084557506040513d6000823e601f3d908101601f19168201604052610842919081019061170b565b60015b1561084d5790505b600060029054906101000a90046001600160a01b03166001600160a01b03166316f19831837f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad87856040516020016108a7939291906117ad565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108d39291906117d7565b600060405180830381600087803b1580156108ed57600080fd5b505af1158015610901573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff16158080156109645750600054600160ff909116105b8061097e5750303b15801561097e575060005460ff166001145b6109e15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161041e565b6000805460ff191660011790558015610a04576000805461ff0019166101001790555b610a1085858585611033565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000610a688561113b565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610a9d903390309088908890600401611803565b600060405180830381600087803b158015610ab757600080fd5b505af1158015610acb573d6000803e3d6000fd5b5050600054600254604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935262010000909404841695506316f198319450610b68939092169160e4016117d7565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610a56565b6000610bfe8861113b565b905060005b84811015610caa57886001600160a01b031663f242432a3330898986818110610c2e57610c2e61183b565b90506020020135888887818110610c4757610c4761183b565b905060200201356040518563ffffffff1660e01b8152600401610c6d9493929190611803565b600060405180830381600087803b158015610c8757600080fd5b505af1158015610c9b573d6000803e3d6000fd5b50505050806001019050610c03565b506000546002546040516001600160a01b03620100009093048316926316f19831921690610d0c907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e906020016118cc565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d389291906117d7565b600060405180830381600087803b158015610d5257600080fd5b505af1158015610d66573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a604051610dc196959493929190611937565b60405180910390a45050505050505050565b600080808080610de586880188611980565b6001600160a01b03808616600090815260046020526040902054959a50939850919650945092501680610e1a57610e1a6119db565b604051637921219560e11b81526001600160a01b0387169063f242432a90610e4c903090889088908890600401611803565b600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c690606001610dc1565b600080808080610ee4868801886119f1565b6001600160a01b03808616600090815260046020526040902054959b509399509197509550935016905080610f1b57610f1b6119db565b60005b8351811015610fe157866001600160a01b031663f242432a30878481518110610f4957610f4961183b565b6020026020010151878581518110610f6357610f6361183b565b6020026020010151878681518110610f7d57610f7d61183b565b60200260200101516040518563ffffffff1660e01b8152600401610fa49493929190611803565b600060405180830381600087803b158015610fbe57600080fd5b505af1158015610fd2573d6000803e3d6000fd5b50505050806001019050610f1e565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd20878787604051610dc193929190611b36565b6001600160a01b0384161580159061105357506001600160a01b03831615155b801561106757506001600160a01b03821615155b801561107b57506001600160a01b03811615155b6110e05760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b606482015260840161041e565b600080546001600160a01b03958616620100000262010000600160b01b0319909116179055600180549385166001600160a01b0319948516179055600280549285169284169290921790915560038054919093169116179055565b6001600160a01b0380821660009081526004602052604090205416806111675761116482610629565b90505b6001600160a01b03811661117d5761117d6119db565b919050565b60006020828403121561119457600080fd5b81356001600160e01b0319811681146111ac57600080fd5b9392505050565b6001600160a01b03811681146111c857600080fd5b50565b6000806000606084860312156111e057600080fd5b83356111eb816111b3565b95602085013595506040909401359392505050565b60008083601f84011261121257600080fd5b5081356001600160401b0381111561122957600080fd5b6020830191508360208260051b850101111561124457600080fd5b9250929050565b60008060008060008060006080888a03121561126657600080fd5b8735611271816111b3565b965060208801356001600160401b038082111561128d57600080fd5b6112998b838c01611200565b909850965060408a01359150808211156112b257600080fd5b6112be8b838c01611200565b909650945060608a01359150808211156112d757600080fd5b506112e48a828b01611200565b989b979a50959850939692959293505050565b60006020828403121561130957600080fd5b81356111ac816111b3565b6000806000806080858703121561132a57600080fd5b8435611335816111b3565b93506020850135611345816111b3565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156113985761139861135a565b604052919050565b60006001600160401b038211156113b9576113b961135a565b5060051b60200190565b600082601f8301126113d457600080fd5b813560206113e96113e4836113a0565b611370565b82815260059290921b8401810191818101908684111561140857600080fd5b8286015b84811015611423578035835291830191830161140c565b509695505050505050565b60006001600160401b038211156114475761144761135a565b50601f01601f191660200190565b600082601f83011261146657600080fd5b81356114746113e48261142e565b81815284602083860101111561148957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156114be57600080fd5b85356114c9816111b3565b945060208601356114d9816111b3565b935060408601356001600160401b03808211156114f557600080fd5b61150189838a016113c3565b9450606088013591508082111561151757600080fd5b61152389838a016113c3565b9350608088013591508082111561153957600080fd5b5061154688828901611455565b9150509295509295909350565b6000806000806060858703121561156957600080fd5b84359350602085013561157b816111b3565b925060408501356001600160401b038082111561159757600080fd5b818701915087601f8301126115ab57600080fd5b8135818111156115ba57600080fd5b8860208285010111156115cc57600080fd5b95989497505060200194505050565b600080600080600060a086880312156115f357600080fd5b85356115fe816111b3565b9450602086013561160e816111b3565b9350604086013592506060860135915060808601356001600160401b0381111561163757600080fd5b61154688828901611455565b6000806000806080858703121561165957600080fd5b8435611664816111b3565b93506020850135611674816111b3565b92506040850135611684816111b3565b91506060850135611694816111b3565b939692955090935050565b600080858511156116af57600080fd5b838611156116bc57600080fd5b5050820193919092039150565b803560208310156103ae57600019602084900360031b1b1692915050565b60005b838110156117025781810151838201526020016116ea565b50506000910152565b60006020828403121561171d57600080fd5b81516001600160401b0381111561173357600080fd5b8201601f8101841361174457600080fd5b80516117526113e48261142e565b81815285602083850101111561176757600080fd5b6117788260208301602086016116e7565b95945050505050565b600081518084526117998160208601602086016116e7565b601f01601f19169290920160200192915050565b8381526001600160a01b038316602082015260606040820181905260009061177890830184611781565b6001600160a01b03831681526040602082018190526000906117fb90830184611781565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b8581101561188f578135611874816111b3565b6001600160a01b031687529582019590820190600101611861565b509495945050505050565b81835260006001600160fb1b038311156118b357600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906118ff908301888a611851565b828103608084015261191281878961189a565b905082810360a084015261192781858761189a565b9c9b505050505050505050505050565b60608152600061194b60608301888a611851565b828103602084015261195e81878961189a565b9050828103604084015261197381858761189a565b9998505050505050505050565b600080600080600060a0868803121561199857600080fd5b85356119a3816111b3565b945060208601356119b3816111b3565b935060408601356119c3816111b3565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c08789031215611a0a57600080fd5b86359550602080880135611a1d816111b3565b95506040880135611a2d816111b3565b945060608801356001600160401b0380821115611a4957600080fd5b818a0191508a601f830112611a5d57600080fd5b8135611a6b6113e4826113a0565b81815260059190911b8301840190848101908d831115611a8a57600080fd5b938501935b82851015611ab1578435611aa2816111b3565b82529385019390850190611a8f565b9750505060808a0135925080831115611ac957600080fd5b611ad58b848c016113c3565b945060a08a0135925080831115611aeb57600080fd5b5050611af989828a016113c3565b9150509295509295509295565b600081518084526020808501945080840160005b8381101561188f57815187529582019590820190600101611b1a565b606080825284519082018190526000906020906080840190828801845b82811015611b785781516001600160a01b031684529284019290840190600101611b53565b50505083810382850152611b8c8187611b06565b9150508281036040840152611ba18185611b06565b969550505050505056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea2646970667358221220bac4157c867ef25ba423441a6f4177226bff4063bb665be9fb147719e7b08cc664736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063b68ad1e4116100ad578063eeb4994511610071578063eeb49945146102fe578063f23a6e6114610311578063f4a120f714610330578063f645125514610343578063f8c8765e1461036a57600080fd5b8063b68ad1e41461023e578063bc197c8114610251578063c5ac2b1c14610289578063d41f1771146102b0578063d7c9e3ec146102d757600080fd5b80634c4c45de116100f45780634c4c45de146101a7578063654715e6146101ba5780637efab4f5146101cd578063a78e111c146101f6578063b17680651461020957600080fd5b806301ffc9a71461012657806305dc2e8f1461014e5780630efe6a8b146101795780631bc114ba1461018e575b600080fd5b610139610134366004611182565b61037d565b60405190151581526020015b60405180910390f35b600154610161906001600160a01b031681565b6040516001600160a01b039091168152602001610145565b61018c6101873660046111cb565b6103b4565b005b600054610161906201000090046001600160a01b031681565b61018c6101b536600461124b565b6103c5565b600254610161906001600160a01b031681565b6101616101db3660046112f7565b6004602052600090815260409020546001600160a01b031681565b61018c610204366004611314565b61043f565b6102307f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b604051908152602001610145565b600354610161906001600160a01b031681565b61027061025f3660046114a6565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610145565b6102307faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102307f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102307f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018c61030c366004611553565b610451565b61027061031f3660046115db565b63f23a6e6160e01b95945050505050565b61016161033e3660046112f7565b610629565b6102307f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61018c610378366004611643565b610944565b60006001600160e01b03198216630271189760e51b14806103ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6103c083338484610a5d565b505050565b84831480156103d357508481145b6104275760405162461bcd60e51b815260206004820152602c6024820152600080516020611bac83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61043687878787878787610bf3565b50505050505050565b61044b84848484610a5d565b50505050565b6001546001600160a01b031633146104c55760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b606482015260840161041e565b6002546001600160a01b0384811691161461053d5760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b606482015260840161041e565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961056c60206000848661169f565b610575916116c9565b036105945761058f61058a826020818661169f565b610dd3565b61044b565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26105c360206000848661169f565b6105cc916116c9565b036105db5761058f8282610ed2565b60405162461bcd60e51b815260206004820152602f6024820152600080516020611bac83398151915260448201526e56414c49445f5349474e415455524560881b606482015260840161041e565b60006001600160a01b0382166106835760405162461bcd60e51b815260206004820152602b6024820152600080516020611bac83398151915260448201526a2b20a624a22faa27a5a2a760a91b606482015260840161041e565b6001600160a01b0382811660009081526004602052604090205416156107005760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b606482015260840161041e565b6002546003546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b03928316926107aa921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b03848116600081815260046020818152604080842080546001600160a01b031916968816969096179095558451908101855282815293516303a24d0760e21b8152908101919091529294509091630e89341c90602401600060405180830381865afa92505050801561084557506040513d6000823e601f3d908101601f19168201604052610842919081019061170b565b60015b1561084d5790505b600060029054906101000a90046001600160a01b03166001600160a01b03166316f19831837f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad87856040516020016108a7939291906117ad565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108d39291906117d7565b600060405180830381600087803b1580156108ed57600080fd5b505af1158015610901573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff16158080156109645750600054600160ff909116105b8061097e5750303b15801561097e575060005460ff166001145b6109e15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161041e565b6000805460ff191660011790558015610a04576000805461ff0019166101001790555b610a1085858585611033565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000610a688561113b565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610a9d903390309088908890600401611803565b600060405180830381600087803b158015610ab757600080fd5b505af1158015610acb573d6000803e3d6000fd5b5050600054600254604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935262010000909404841695506316f198319450610b68939092169160e4016117d7565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610a56565b6000610bfe8861113b565b905060005b84811015610caa57886001600160a01b031663f242432a3330898986818110610c2e57610c2e61183b565b90506020020135888887818110610c4757610c4761183b565b905060200201356040518563ffffffff1660e01b8152600401610c6d9493929190611803565b600060405180830381600087803b158015610c8757600080fd5b505af1158015610c9b573d6000803e3d6000fd5b50505050806001019050610c03565b506000546002546040516001600160a01b03620100009093048316926316f19831921690610d0c907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e906020016118cc565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d389291906117d7565b600060405180830381600087803b158015610d5257600080fd5b505af1158015610d66573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a604051610dc196959493929190611937565b60405180910390a45050505050505050565b600080808080610de586880188611980565b6001600160a01b03808616600090815260046020526040902054959a50939850919650945092501680610e1a57610e1a6119db565b604051637921219560e11b81526001600160a01b0387169063f242432a90610e4c903090889088908890600401611803565b600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c690606001610dc1565b600080808080610ee4868801886119f1565b6001600160a01b03808616600090815260046020526040902054959b509399509197509550935016905080610f1b57610f1b6119db565b60005b8351811015610fe157866001600160a01b031663f242432a30878481518110610f4957610f4961183b565b6020026020010151878581518110610f6357610f6361183b565b6020026020010151878681518110610f7d57610f7d61183b565b60200260200101516040518563ffffffff1660e01b8152600401610fa49493929190611803565b600060405180830381600087803b158015610fbe57600080fd5b505af1158015610fd2573d6000803e3d6000fd5b50505050806001019050610f1e565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd20878787604051610dc193929190611b36565b6001600160a01b0384161580159061105357506001600160a01b03831615155b801561106757506001600160a01b03821615155b801561107b57506001600160a01b03811615155b6110e05760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b606482015260840161041e565b600080546001600160a01b03958616620100000262010000600160b01b0319909116179055600180549385166001600160a01b0319948516179055600280549285169284169290921790915560038054919093169116179055565b6001600160a01b0380821660009081526004602052604090205416806111675761116482610629565b90505b6001600160a01b03811661117d5761117d6119db565b919050565b60006020828403121561119457600080fd5b81356001600160e01b0319811681146111ac57600080fd5b9392505050565b6001600160a01b03811681146111c857600080fd5b50565b6000806000606084860312156111e057600080fd5b83356111eb816111b3565b95602085013595506040909401359392505050565b60008083601f84011261121257600080fd5b5081356001600160401b0381111561122957600080fd5b6020830191508360208260051b850101111561124457600080fd5b9250929050565b60008060008060008060006080888a03121561126657600080fd5b8735611271816111b3565b965060208801356001600160401b038082111561128d57600080fd5b6112998b838c01611200565b909850965060408a01359150808211156112b257600080fd5b6112be8b838c01611200565b909650945060608a01359150808211156112d757600080fd5b506112e48a828b01611200565b989b979a50959850939692959293505050565b60006020828403121561130957600080fd5b81356111ac816111b3565b6000806000806080858703121561132a57600080fd5b8435611335816111b3565b93506020850135611345816111b3565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156113985761139861135a565b604052919050565b60006001600160401b038211156113b9576113b961135a565b5060051b60200190565b600082601f8301126113d457600080fd5b813560206113e96113e4836113a0565b611370565b82815260059290921b8401810191818101908684111561140857600080fd5b8286015b84811015611423578035835291830191830161140c565b509695505050505050565b60006001600160401b038211156114475761144761135a565b50601f01601f191660200190565b600082601f83011261146657600080fd5b81356114746113e48261142e565b81815284602083860101111561148957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156114be57600080fd5b85356114c9816111b3565b945060208601356114d9816111b3565b935060408601356001600160401b03808211156114f557600080fd5b61150189838a016113c3565b9450606088013591508082111561151757600080fd5b61152389838a016113c3565b9350608088013591508082111561153957600080fd5b5061154688828901611455565b9150509295509295909350565b6000806000806060858703121561156957600080fd5b84359350602085013561157b816111b3565b925060408501356001600160401b038082111561159757600080fd5b818701915087601f8301126115ab57600080fd5b8135818111156115ba57600080fd5b8860208285010111156115cc57600080fd5b95989497505060200194505050565b600080600080600060a086880312156115f357600080fd5b85356115fe816111b3565b9450602086013561160e816111b3565b9350604086013592506060860135915060808601356001600160401b0381111561163757600080fd5b61154688828901611455565b6000806000806080858703121561165957600080fd5b8435611664816111b3565b93506020850135611674816111b3565b92506040850135611684816111b3565b91506060850135611694816111b3565b939692955090935050565b600080858511156116af57600080fd5b838611156116bc57600080fd5b5050820193919092039150565b803560208310156103ae57600019602084900360031b1b1692915050565b60005b838110156117025781810151838201526020016116ea565b50506000910152565b60006020828403121561171d57600080fd5b81516001600160401b0381111561173357600080fd5b8201601f8101841361174457600080fd5b80516117526113e48261142e565b81815285602083850101111561176757600080fd5b6117788260208301602086016116e7565b95945050505050565b600081518084526117998160208601602086016116e7565b601f01601f19169290920160200192915050565b8381526001600160a01b038316602082015260606040820181905260009061177890830184611781565b6001600160a01b03831681526040602082018190526000906117fb90830184611781565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b8581101561188f578135611874816111b3565b6001600160a01b031687529582019590820190600101611861565b509495945050505050565b81835260006001600160fb1b038311156118b357600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906118ff908301888a611851565b828103608084015261191281878961189a565b905082810360a084015261192781858761189a565b9c9b505050505050505050505050565b60608152600061194b60608301888a611851565b828103602084015261195e81878961189a565b9050828103604084015261197381858761189a565b9998505050505050505050565b600080600080600060a0868803121561199857600080fd5b85356119a3816111b3565b945060208601356119b3816111b3565b935060408601356119c3816111b3565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c08789031215611a0a57600080fd5b86359550602080880135611a1d816111b3565b95506040880135611a2d816111b3565b945060608801356001600160401b0380821115611a4957600080fd5b818a0191508a601f830112611a5d57600080fd5b8135611a6b6113e4826113a0565b81815260059190911b8301840190848101908d831115611a8a57600080fd5b938501935b82851015611ab1578435611aa2816111b3565b82529385019390850190611a8f565b9750505060808a0135925080831115611ac957600080fd5b611ad58b848c016113c3565b945060a08a0135925080831115611aeb57600080fd5b5050611af989828a016113c3565b9150509295509295509295565b600081518084526020808501945080840160005b8381101561188f57815187529582019590820190600101611b1a565b606080825284519082018190526000906020906080840190828801845b82811015611b785781516001600160a01b031684529284019290840190600101611b53565b50505083810382850152611b8c8187611b06565b9150508281036040840152611ba18185611b06565b969550505050505056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea2646970667358221220bac4157c867ef25ba423441a6f4177226bff4063bb665be9fb147719e7b08cc664736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC1155PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC1155PredicateAccessList","sourceName":"contracts/child/RootMintableERC1155PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"childToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612480806100206000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063a78e111c11610125578063d8dd1773116100ad578063f23a6e611161007c578063f23a6e61146104d3578063f2fde38b146104f2578063f4a120f714610505578063f645125514610518578063f8c8765e1461053f57600080fd5b8063d8dd177314610493578063e0563ab1146104a6578063e30c3978146104af578063eeb49945146104c057600080fd5b8063c1225a20116100f4578063c1225a20146103f8578063c5ac2b1c1461040b578063c5e4683a14610432578063d41f177114610445578063d7c9e3ec1461046c57600080fd5b8063a78e111c14610373578063b176806514610386578063b68ad1e4146103ad578063bc197c81146103c057600080fd5b806355b01e4d116101a857806379ba50971161017757806379ba50971461031d5780637efab4f5146103255780638da5cb5b1461034f578063947287cf1461036057806397e5230d1461036957600080fd5b806355b01e4d146102dd5780635ea5df79146102eb578063654715e614610302578063715018a61461031557600080fd5b80631bc114ba116101ef5780631bc114ba14610297578063284017f5146102aa5780633b878c22146102b35780634c4c45de146102bc57806351351d53146102cf57600080fd5b806301ffc9a71461022157806305dc2e8f1461024957806307b3e252146102745780630efe6a8b14610282575b600080fd5b61023461022f3660046118c4565b610552565b60405190151581526020015b60405180910390f35b60fd5461025c906001600160a01b031681565b6040516001600160a01b039091168152602001610240565b61025c6004600360981b0181565b61029561029036600461190a565b610589565b005b60fc5461025c906001600160a01b031681565b61025c61202081565b61025c61101081565b6102956102ca36600461198a565b61059a565b61025c6002600160a01b0381565b61025c6004600160991b0181565b6102f461138881565b604051908152602001610240565b60fe5461025c906001600160a01b031681565b610295610614565b610295610628565b61025c610333366004611a36565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b031661025c565b6102f461520881565b6102f4620249f081565b610295610381366004611a53565b6106a2565b6102f47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff5461025c906001600160a01b031681565b6103df6103ce366004611be5565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610240565b610295610406366004611ca2565b6106b4565b6102f47faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610295610440366004611ca2565b610703565b6102f47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102f47f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102956104a1366004611cbd565b61074a565b61025c61203081565b6065546001600160a01b031661025c565b6102956104ce366004611d4f565b610888565b6103df6104e1366004611dd7565b63f23a6e6160e01b95945050505050565b610295610500366004611a36565b610a60565b61025c610513366004611a36565b610ad1565b6102f47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61029561054d366004611e3f565b610de1565b60006001600160e01b03198216630271189760e51b148061058357506301ffc9a760e01b6001600160e01b03198316145b92915050565b61059583338484610eb3565b505050565b84831480156105a857508481145b6105fc5760405162461bcd60e51b815260206004820152602c602482015260008051602061242b83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61060b8787878787878761104b565b50505050505050565b61061c611228565b6106266000611282565b565b60655433906001600160a01b031681146106965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105f3565b61069f81611282565b50565b6106ae84848484610eb3565b50505050565b6106bc611228565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61070b611228565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b031461078e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016105f3565b600054610100900460ff16158080156107ae5750600054600160ff909116105b806107c85750303b1580156107c8575060005460ff166001145b6107e45760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610807576000805461ff0019166101001790555b6108138888888861129b565b60c9805461ffff191685151561ff001916176101008515150217905561083882611282565b801561087e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146108fc5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b60648201526084016105f3565b60fe546001600160a01b038481169116146109745760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b60648201526084016105f3565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696109a3602060008486611ee9565b6109ac91611f13565b036109cb576109c66109c18260208186611ee9565b611398565b6106ae565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26109fa602060008486611ee9565b610a0391611f13565b03610a12576109c682826114a6565b60405162461bcd60e51b815260206004820152602f602482015260008051602061242b83398151915260448201526e56414c49445f5349474e415455524560881b60648201526084016105f3565b610a68611228565b606580546001600160a01b0383166001600160a01b03199091168117909155610a996033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b038216610b2b5760405162461bcd60e51b815260206004820152602b602482015260008051602061242b83398151915260448201526a2b20a624a22faa27a5a2a760a91b60648201526084016105f3565b6001600160a01b03828116600090815261010060205260409020541615610ba95760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b60648201526084016105f3565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692610c53921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0384811660008181526101006020908152604080832080546001600160a01b031916958716959095179094558351908101845281815292516303a24d0760e21b815260048101919091529294509091630e89341c90602401600060405180830381865afa925050508015610cf057506040513d6000823e601f3d908101601f19168201604052610ced9190810190611f55565b60015b15610cf85790505b60fc546040516001600160a01b03909116906316f19831908490610d44907f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad9089908790602001611ff7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d70929190612021565b600060405180830381600087803b158015610d8a57600080fd5b505af1158015610d9e573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff1615808015610e015750600054600160ff909116105b80610e1b5750303b158015610e1b575060005460ff166001145b610e375760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610e5a576000805461ff0019166101001790555b610e668585858561129b565b8015610eac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610ebb611608565b6000610ec685611610565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610efb90339030908890889060040161204d565b600060405180830381600087803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935293841695506316f198319450610fc0939092169160e401612021565b600060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610eac565b611053611608565b600061105e88611610565b905060005b8481101561110a57886001600160a01b031663f242432a333089898681811061108e5761108e612085565b905060200201358888878181106110a7576110a7612085565b905060200201356040518563ffffffff1660e01b81526004016110cd949392919061204d565b600060405180830381600087803b1580156110e757600080fd5b505af11580156110fb573d6000803e3d6000fd5b50505050806001019050611063565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611166907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e90602001612116565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401611192929190612021565b600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a60405161121b96959493929190612181565b60405180910390a461087e565b6033546001600160a01b031633146106265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b606580546001600160a01b031916905561069f81611658565b6001600160a01b038416158015906112bb57506001600160a01b03831615155b80156112cf57506001600160a01b03821615155b80156112e357506001600160a01b03811615155b6113485760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b60648201526084016105f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080806113aa868801886121ca565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806113e0576113e0612225565b604051637921219560e11b81526001600160a01b0387169063f242432a9061141290309088908890889060040161204d565b600060405180830381600087803b15801561142c57600080fd5b505af1158015611440573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c6906060015b60405180910390a45050505050505050565b6000808080806114b88688018861223b565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806114f0576114f0612225565b60005b83518110156115b657866001600160a01b031663f242432a3087848151811061151e5761151e612085565b602002602001015187858151811061153857611538612085565b602002602001015187868151811061155257611552612085565b60200260200101516040518563ffffffff1660e01b8152600401611579949392919061204d565b600060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b505050508060010190506114f3565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd2087878760405161149493929190612380565b6106266116aa565b6001600160a01b0380821660009081526101006020526040902054168061163d5761163a82610ad1565b90505b6001600160a01b03811661165357611653612225565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156117b557604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161170c91906123f5565b6000604051808303818686fa925050503d8060008114611748576040519150601f19603f3d011682016040523d82523d6000602084013e61174d565b606091505b509150915081801561177257506000818060200190518101906117709190612411565b115b6117b25760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016105f3565b50505b60c954610100900460ff161561062657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161181c91906123f5565b6000604051808303818686fa925050503d8060008114611858576040519150601f19603f3d011682016040523d82523d6000602084013e61185d565b606091505b509150915081801561188357508080602001905181019061187e9190612411565b600114155b6118c05760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016105f3565b5050565b6000602082840312156118d657600080fd5b81356001600160e01b0319811681146118ee57600080fd5b9392505050565b6001600160a01b038116811461069f57600080fd5b60008060006060848603121561191f57600080fd5b833561192a816118f5565b95602085013595506040909401359392505050565b60008083601f84011261195157600080fd5b5081356001600160401b0381111561196857600080fd5b6020830191508360208260051b850101111561198357600080fd5b9250929050565b60008060008060008060006080888a0312156119a557600080fd5b87356119b0816118f5565b965060208801356001600160401b03808211156119cc57600080fd5b6119d88b838c0161193f565b909850965060408a01359150808211156119f157600080fd5b6119fd8b838c0161193f565b909650945060608a0135915080821115611a1657600080fd5b50611a238a828b0161193f565b989b979a50959850939692959293505050565b600060208284031215611a4857600080fd5b81356118ee816118f5565b60008060008060808587031215611a6957600080fd5b8435611a74816118f5565b93506020850135611a84816118f5565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611ad757611ad7611a99565b604052919050565b60006001600160401b03821115611af857611af8611a99565b5060051b60200190565b600082601f830112611b1357600080fd5b81356020611b28611b2383611adf565b611aaf565b82815260059290921b84018101918181019086841115611b4757600080fd5b8286015b84811015611b625780358352918301918301611b4b565b509695505050505050565b60006001600160401b03821115611b8657611b86611a99565b50601f01601f191660200190565b600082601f830112611ba557600080fd5b8135611bb3611b2382611b6d565b818152846020838601011115611bc857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611bfd57600080fd5b8535611c08816118f5565b94506020860135611c18816118f5565b935060408601356001600160401b0380821115611c3457600080fd5b611c4089838a01611b02565b94506060880135915080821115611c5657600080fd5b611c6289838a01611b02565b93506080880135915080821115611c7857600080fd5b50611c8588828901611b94565b9150509295509295909350565b8035801515811461165357600080fd5b600060208284031215611cb457600080fd5b6118ee82611c92565b600080600080600080600060e0888a031215611cd857600080fd5b8735611ce3816118f5565b96506020880135611cf3816118f5565b95506040880135611d03816118f5565b94506060880135611d13816118f5565b9350611d2160808901611c92565b9250611d2f60a08901611c92565b915060c0880135611d3f816118f5565b8091505092959891949750929550565b60008060008060608587031215611d6557600080fd5b843593506020850135611d77816118f5565b925060408501356001600160401b0380821115611d9357600080fd5b818701915087601f830112611da757600080fd5b813581811115611db657600080fd5b886020828501011115611dc857600080fd5b95989497505060200194505050565b600080600080600060a08688031215611def57600080fd5b8535611dfa816118f5565b94506020860135611e0a816118f5565b9350604086013592506060860135915060808601356001600160401b03811115611e3357600080fd5b611c8588828901611b94565b60008060008060808587031215611e5557600080fd5b8435611e60816118f5565b93506020850135611e70816118f5565b92506040850135611e80816118f5565b91506060850135611e90816118f5565b939692955090935050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611ef957600080fd5b83861115611f0657600080fd5b5050820193919092039150565b8035602083101561058357600019602084900360031b1b1692915050565b60005b83811015611f4c578181015183820152602001611f34565b50506000910152565b600060208284031215611f6757600080fd5b81516001600160401b03811115611f7d57600080fd5b8201601f81018413611f8e57600080fd5b8051611f9c611b2382611b6d565b818152856020838501011115611fb157600080fd5b611fc2826020830160208601611f31565b95945050505050565b60008151808452611fe3816020860160208601611f31565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090611fc290830184611fcb565b6001600160a01b038316815260406020820181905260009061204590830184611fcb565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b858110156120d95781356120be816118f5565b6001600160a01b0316875295820195908201906001016120ab565b509495945050505050565b81835260006001600160fb1b038311156120fd57600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612149908301888a61209b565b828103608084015261215c8187896120e4565b905082810360a08401526121718185876120e4565b9c9b505050505050505050505050565b60608152600061219560608301888a61209b565b82810360208401526121a88187896120e4565b905082810360408401526121bd8185876120e4565b9998505050505050505050565b600080600080600060a086880312156121e257600080fd5b85356121ed816118f5565b945060208601356121fd816118f5565b9350604086013561220d816118f5565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c0878903121561225457600080fd5b86359550602080880135612267816118f5565b95506040880135612277816118f5565b945060608801356001600160401b038082111561229357600080fd5b818a0191508a601f8301126122a757600080fd5b81356122b5611b2382611adf565b81815260059190911b8301840190848101908d8311156122d457600080fd5b938501935b828510156122fb5784356122ec816118f5565b825293850193908501906122d9565b9750505060808a013592508083111561231357600080fd5b61231f8b848c01611b02565b945060a08a013592508083111561233557600080fd5b505061234389828a01611b02565b9150509295509295509295565b600081518084526020808501945080840160005b838110156120d957815187529582019590820190600101612364565b606080825284519082018190526000906020906080840190828801845b828110156123c25781516001600160a01b03168452928401929084019060010161239d565b505050838103828501526123d68187612350565b91505082810360408401526123eb8185612350565b9695505050505050565b60008251612407818460208701611f31565b9190910192915050565b60006020828403121561242357600080fd5b505191905056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea26469706673582212207cc4d2e1fa811483449e50a585f2819503c945760fb6c93dc493fe7ad5264ad364736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063a78e111c11610125578063d8dd1773116100ad578063f23a6e611161007c578063f23a6e61146104d3578063f2fde38b146104f2578063f4a120f714610505578063f645125514610518578063f8c8765e1461053f57600080fd5b8063d8dd177314610493578063e0563ab1146104a6578063e30c3978146104af578063eeb49945146104c057600080fd5b8063c1225a20116100f4578063c1225a20146103f8578063c5ac2b1c1461040b578063c5e4683a14610432578063d41f177114610445578063d7c9e3ec1461046c57600080fd5b8063a78e111c14610373578063b176806514610386578063b68ad1e4146103ad578063bc197c81146103c057600080fd5b806355b01e4d116101a857806379ba50971161017757806379ba50971461031d5780637efab4f5146103255780638da5cb5b1461034f578063947287cf1461036057806397e5230d1461036957600080fd5b806355b01e4d146102dd5780635ea5df79146102eb578063654715e614610302578063715018a61461031557600080fd5b80631bc114ba116101ef5780631bc114ba14610297578063284017f5146102aa5780633b878c22146102b35780634c4c45de146102bc57806351351d53146102cf57600080fd5b806301ffc9a71461022157806305dc2e8f1461024957806307b3e252146102745780630efe6a8b14610282575b600080fd5b61023461022f3660046118c4565b610552565b60405190151581526020015b60405180910390f35b60fd5461025c906001600160a01b031681565b6040516001600160a01b039091168152602001610240565b61025c6004600360981b0181565b61029561029036600461190a565b610589565b005b60fc5461025c906001600160a01b031681565b61025c61202081565b61025c61101081565b6102956102ca36600461198a565b61059a565b61025c6002600160a01b0381565b61025c6004600160991b0181565b6102f461138881565b604051908152602001610240565b60fe5461025c906001600160a01b031681565b610295610614565b610295610628565b61025c610333366004611a36565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b031661025c565b6102f461520881565b6102f4620249f081565b610295610381366004611a53565b6106a2565b6102f47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff5461025c906001600160a01b031681565b6103df6103ce366004611be5565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610240565b610295610406366004611ca2565b6106b4565b6102f47faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610295610440366004611ca2565b610703565b6102f47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102f47f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102956104a1366004611cbd565b61074a565b61025c61203081565b6065546001600160a01b031661025c565b6102956104ce366004611d4f565b610888565b6103df6104e1366004611dd7565b63f23a6e6160e01b95945050505050565b610295610500366004611a36565b610a60565b61025c610513366004611a36565b610ad1565b6102f47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61029561054d366004611e3f565b610de1565b60006001600160e01b03198216630271189760e51b148061058357506301ffc9a760e01b6001600160e01b03198316145b92915050565b61059583338484610eb3565b505050565b84831480156105a857508481145b6105fc5760405162461bcd60e51b815260206004820152602c602482015260008051602061242b83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61060b8787878787878761104b565b50505050505050565b61061c611228565b6106266000611282565b565b60655433906001600160a01b031681146106965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105f3565b61069f81611282565b50565b6106ae84848484610eb3565b50505050565b6106bc611228565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61070b611228565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b031461078e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016105f3565b600054610100900460ff16158080156107ae5750600054600160ff909116105b806107c85750303b1580156107c8575060005460ff166001145b6107e45760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610807576000805461ff0019166101001790555b6108138888888861129b565b60c9805461ffff191685151561ff001916176101008515150217905561083882611282565b801561087e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146108fc5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b60648201526084016105f3565b60fe546001600160a01b038481169116146109745760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b60648201526084016105f3565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696109a3602060008486611ee9565b6109ac91611f13565b036109cb576109c66109c18260208186611ee9565b611398565b6106ae565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26109fa602060008486611ee9565b610a0391611f13565b03610a12576109c682826114a6565b60405162461bcd60e51b815260206004820152602f602482015260008051602061242b83398151915260448201526e56414c49445f5349474e415455524560881b60648201526084016105f3565b610a68611228565b606580546001600160a01b0383166001600160a01b03199091168117909155610a996033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b038216610b2b5760405162461bcd60e51b815260206004820152602b602482015260008051602061242b83398151915260448201526a2b20a624a22faa27a5a2a760a91b60648201526084016105f3565b6001600160a01b03828116600090815261010060205260409020541615610ba95760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b60648201526084016105f3565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692610c53921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0384811660008181526101006020908152604080832080546001600160a01b031916958716959095179094558351908101845281815292516303a24d0760e21b815260048101919091529294509091630e89341c90602401600060405180830381865afa925050508015610cf057506040513d6000823e601f3d908101601f19168201604052610ced9190810190611f55565b60015b15610cf85790505b60fc546040516001600160a01b03909116906316f19831908490610d44907f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad9089908790602001611ff7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d70929190612021565b600060405180830381600087803b158015610d8a57600080fd5b505af1158015610d9e573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff1615808015610e015750600054600160ff909116105b80610e1b5750303b158015610e1b575060005460ff166001145b610e375760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610e5a576000805461ff0019166101001790555b610e668585858561129b565b8015610eac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610ebb611608565b6000610ec685611610565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610efb90339030908890889060040161204d565b600060405180830381600087803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935293841695506316f198319450610fc0939092169160e401612021565b600060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610eac565b611053611608565b600061105e88611610565b905060005b8481101561110a57886001600160a01b031663f242432a333089898681811061108e5761108e612085565b905060200201358888878181106110a7576110a7612085565b905060200201356040518563ffffffff1660e01b81526004016110cd949392919061204d565b600060405180830381600087803b1580156110e757600080fd5b505af11580156110fb573d6000803e3d6000fd5b50505050806001019050611063565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611166907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e90602001612116565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401611192929190612021565b600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a60405161121b96959493929190612181565b60405180910390a461087e565b6033546001600160a01b031633146106265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b606580546001600160a01b031916905561069f81611658565b6001600160a01b038416158015906112bb57506001600160a01b03831615155b80156112cf57506001600160a01b03821615155b80156112e357506001600160a01b03811615155b6113485760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b60648201526084016105f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080806113aa868801886121ca565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806113e0576113e0612225565b604051637921219560e11b81526001600160a01b0387169063f242432a9061141290309088908890889060040161204d565b600060405180830381600087803b15801561142c57600080fd5b505af1158015611440573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c6906060015b60405180910390a45050505050505050565b6000808080806114b88688018861223b565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806114f0576114f0612225565b60005b83518110156115b657866001600160a01b031663f242432a3087848151811061151e5761151e612085565b602002602001015187858151811061153857611538612085565b602002602001015187868151811061155257611552612085565b60200260200101516040518563ffffffff1660e01b8152600401611579949392919061204d565b600060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b505050508060010190506114f3565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd2087878760405161149493929190612380565b6106266116aa565b6001600160a01b0380821660009081526101006020526040902054168061163d5761163a82610ad1565b90505b6001600160a01b03811661165357611653612225565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156117b557604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161170c91906123f5565b6000604051808303818686fa925050503d8060008114611748576040519150601f19603f3d011682016040523d82523d6000602084013e61174d565b606091505b509150915081801561177257506000818060200190518101906117709190612411565b115b6117b25760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016105f3565b50505b60c954610100900460ff161561062657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161181c91906123f5565b6000604051808303818686fa925050503d8060008114611858576040519150601f19603f3d011682016040523d82523d6000602084013e61185d565b606091505b509150915081801561188357508080602001905181019061187e9190612411565b600114155b6118c05760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016105f3565b5050565b6000602082840312156118d657600080fd5b81356001600160e01b0319811681146118ee57600080fd5b9392505050565b6001600160a01b038116811461069f57600080fd5b60008060006060848603121561191f57600080fd5b833561192a816118f5565b95602085013595506040909401359392505050565b60008083601f84011261195157600080fd5b5081356001600160401b0381111561196857600080fd5b6020830191508360208260051b850101111561198357600080fd5b9250929050565b60008060008060008060006080888a0312156119a557600080fd5b87356119b0816118f5565b965060208801356001600160401b03808211156119cc57600080fd5b6119d88b838c0161193f565b909850965060408a01359150808211156119f157600080fd5b6119fd8b838c0161193f565b909650945060608a0135915080821115611a1657600080fd5b50611a238a828b0161193f565b989b979a50959850939692959293505050565b600060208284031215611a4857600080fd5b81356118ee816118f5565b60008060008060808587031215611a6957600080fd5b8435611a74816118f5565b93506020850135611a84816118f5565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611ad757611ad7611a99565b604052919050565b60006001600160401b03821115611af857611af8611a99565b5060051b60200190565b600082601f830112611b1357600080fd5b81356020611b28611b2383611adf565b611aaf565b82815260059290921b84018101918181019086841115611b4757600080fd5b8286015b84811015611b625780358352918301918301611b4b565b509695505050505050565b60006001600160401b03821115611b8657611b86611a99565b50601f01601f191660200190565b600082601f830112611ba557600080fd5b8135611bb3611b2382611b6d565b818152846020838601011115611bc857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611bfd57600080fd5b8535611c08816118f5565b94506020860135611c18816118f5565b935060408601356001600160401b0380821115611c3457600080fd5b611c4089838a01611b02565b94506060880135915080821115611c5657600080fd5b611c6289838a01611b02565b93506080880135915080821115611c7857600080fd5b50611c8588828901611b94565b9150509295509295909350565b8035801515811461165357600080fd5b600060208284031215611cb457600080fd5b6118ee82611c92565b600080600080600080600060e0888a031215611cd857600080fd5b8735611ce3816118f5565b96506020880135611cf3816118f5565b95506040880135611d03816118f5565b94506060880135611d13816118f5565b9350611d2160808901611c92565b9250611d2f60a08901611c92565b915060c0880135611d3f816118f5565b8091505092959891949750929550565b60008060008060608587031215611d6557600080fd5b843593506020850135611d77816118f5565b925060408501356001600160401b0380821115611d9357600080fd5b818701915087601f830112611da757600080fd5b813581811115611db657600080fd5b886020828501011115611dc857600080fd5b95989497505060200194505050565b600080600080600060a08688031215611def57600080fd5b8535611dfa816118f5565b94506020860135611e0a816118f5565b9350604086013592506060860135915060808601356001600160401b03811115611e3357600080fd5b611c8588828901611b94565b60008060008060808587031215611e5557600080fd5b8435611e60816118f5565b93506020850135611e70816118f5565b92506040850135611e80816118f5565b91506060850135611e90816118f5565b939692955090935050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611ef957600080fd5b83861115611f0657600080fd5b5050820193919092039150565b8035602083101561058357600019602084900360031b1b1692915050565b60005b83811015611f4c578181015183820152602001611f34565b50506000910152565b600060208284031215611f6757600080fd5b81516001600160401b03811115611f7d57600080fd5b8201601f81018413611f8e57600080fd5b8051611f9c611b2382611b6d565b818152856020838501011115611fb157600080fd5b611fc2826020830160208601611f31565b95945050505050565b60008151808452611fe3816020860160208601611f31565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090611fc290830184611fcb565b6001600160a01b038316815260406020820181905260009061204590830184611fcb565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b858110156120d95781356120be816118f5565b6001600160a01b0316875295820195908201906001016120ab565b509495945050505050565b81835260006001600160fb1b038311156120fd57600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612149908301888a61209b565b828103608084015261215c8187896120e4565b905082810360a08401526121718185876120e4565b9c9b505050505050505050505050565b60608152600061219560608301888a61209b565b82810360208401526121a88187896120e4565b905082810360408401526121bd8185876120e4565b9998505050505050505050565b600080600080600060a086880312156121e257600080fd5b85356121ed816118f5565b945060208601356121fd816118f5565b9350604086013561220d816118f5565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c0878903121561225457600080fd5b86359550602080880135612267816118f5565b95506040880135612277816118f5565b945060608801356001600160401b038082111561229357600080fd5b818a0191508a601f8301126122a757600080fd5b81356122b5611b2382611adf565b81815260059190911b8301840190848101908d8311156122d457600080fd5b938501935b828510156122fb5784356122ec816118f5565b825293850193908501906122d9565b9750505060808a013592508083111561231357600080fd5b61231f8b848c01611b02565b945060a08a013592508083111561233557600080fd5b505061234389828a01611b02565b9150509295509295509295565b600081518084526020808501945080840160005b838110156120d957815187529582019590820190600101612364565b606080825284519082018190526000906020906080840190828801845b828110156123c25781516001600160a01b03168452928401929084019060010161239d565b505050838103828501526123d68187612350565b91505082810360408401526123eb8185612350565b9695505050505050565b60008251612407818460208701611f31565b9190910192915050565b60006020828403121561242357600080fd5b505191905056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea26469706673582212207cc4d2e1fa811483449e50a585f2819503c945760fb6c93dc493fe7ad5264ad364736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var SystemArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"System","sourceName":"contracts/child/System.sol","abi":[{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061015a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c806355b01e4d1161006657806355b01e4d146100e35780635ea5df79146100f1578063947287cf1461010857806397e5230d14610111578063e0563ab11461011b57600080fd5b806307b3e25214610098578063284017f5146100c35780633b878c22146100cc57806351351d53146100d5575b600080fd5b6100a66004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a661202081565b6100a661101081565b6100a66002600160a01b0381565b6100a66004600160991b0181565b6100fa61138881565b6040519081526020016100ba565b6100fa61520881565b6100fa620249f081565b6100a66120308156fea2646970667358221220cdc81f82626224fb8a04246ca1d1898f8b03c160e9b2f63cd0bc4b5d0b55c3f964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100935760003560e01c806355b01e4d1161006657806355b01e4d146100e35780635ea5df79146100f1578063947287cf1461010857806397e5230d14610111578063e0563ab11461011b57600080fd5b806307b3e25214610098578063284017f5146100c35780633b878c22146100cc57806351351d53146100d5575b600080fd5b6100a66004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a661202081565b6100a661101081565b6100a66002600160a01b0381565b6100a66004600160991b0181565b6100fa61138881565b6040519081526020016100ba565b6100fa61520881565b6100fa620249f081565b6100a66120308156fea2646970667358221220cdc81f82626224fb8a04246ca1d1898f8b03c160e9b2f63cd0bc4b5d0b55c3f964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` diff --git a/state/runtime/precompiled/precompiled.go b/state/runtime/precompiled/precompiled.go index 8b33d5eb80..a309113df6 100644 --- a/state/runtime/precompiled/precompiled.go +++ b/state/runtime/precompiled/precompiled.go @@ -74,7 +74,7 @@ func (p *Precompiled) setupContracts() { p.register(contracts.NativeTransferPrecompile.String(), &nativeTransfer{}) // Console precompile - // p.register(contracts.ConsolePrecompile.String(), &console{}) + p.register(contracts.ConsolePrecompile.String(), &console{}) // BLS aggregated signatures verification precompile p.register(contracts.BLSAggSigsVerificationPrecompile.String(), &blsAggSignsVerification{}) From 2501ccb3f284c08b0d88c303a1e62b4a85aebefc Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Wed, 11 Oct 2023 12:14:06 +0200 Subject: [PATCH 11/27] simplified --- consensus/polybft/state_sync_relayer.go | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index bf89209738..37a696342e 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -142,24 +142,9 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { state = &StateSyncRelayerStateData{LastBlockNumber: 0} } - for state.LastBlockNumber+1 < req.FullBlock.Block.Header.Number { - state.LastBlockNumber++ - - events, err := ssr.eventsGetter.getEvents(state.LastBlockNumber) - if err != nil { - return fmt.Errorf("state sync relayer: %w", err) - } - - if err = ssr.state.StateSyncStore.insertStateSyncRelayerStateData(state, getConvertedEvents(events)); err != nil { - return fmt.Errorf("state sync relayer insert state failed: %w", err) - } - - ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber) - } - - events, err := ssr.eventsGetter.getEventsFromReceipts(req.FullBlock.Block.Header, req.FullBlock.Receipts) + events, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) if err != nil { - return err + return fmt.Errorf("state sync relayer: %w", err) } state.LastBlockNumber = req.FullBlock.Block.Number() From 8aabb9b1760f1f3cecaba0b03551fc5dca25ea08 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Thu, 12 Oct 2023 10:36:24 +0200 Subject: [PATCH 12/27] Revert "contract logs" This reverts commit 76df7d786302642e7feea9f39b9071c166deec95. --- consensus/polybft/contractsapi/gen_sc_data.go | 14 +++++++------- state/runtime/precompiled/precompiled.go | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/consensus/polybft/contractsapi/gen_sc_data.go b/consensus/polybft/contractsapi/gen_sc_data.go index 6b2c386151..a3da7259b0 100644 --- a/consensus/polybft/contractsapi/gen_sc_data.go +++ b/consensus/polybft/contractsapi/gen_sc_data.go @@ -2,22 +2,22 @@ package contractsapi var L2StateSenderArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"L2StateSender","sourceName":"contracts/child/L2StateSender.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"L2StateSynced","type":"event"},{"inputs":[],"name":"MAX_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"syncState","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea264697066735822122041815082e2111df07ce129b83f0000ecca6c4886247dffeae7090f8f048b665164736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea264697066735822122041815082e2111df07ce129b83f0000ecca6c4886247dffeae7090f8f048b665164736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var StateReceiverArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"StateReceiver","sourceName":"contracts/child/StateReceiver.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"startId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"NewCommitment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"counter","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"StateSyncResult","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync[]","name":"objs","type":"tuple[]"}],"name":"batchExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"commitment","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"bitmap","type":"bytes"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitmentCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitmentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync","name":"obj","type":"tuple"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCommitmentByStateSyncId","outputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRootByStateSyncId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCommittedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedStateSyncs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506115d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004611041565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004611041565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e53660046110a5565b610356565b005b6101346002600160a01b0381565b61021d610208366004611041565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004611114565b6104be565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004611041565b61065e565b6101ea6102943660046111c0565b61067f565b61013461203081565b6102b56102b0366004611041565b610863565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610926565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b6103866040518060400160405280600f81526020016e53746174655265636569766572203160881b8152506109d3565b6103986103938235610a19565b6109d3565b60006103a48235610863565b90506103d66040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101960891b8152506109d3565b8051610443906103e790843561125e565b825160208401516103f8919061125e565b610403906001611271565b836040015187878760405160200161041b91906112c9565b60405160208183030381529060405280519060200120610aab9095949392919063ffffffff16565b61047f5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b6104af6040518060400160405280600f81526020016e53746174655265636569766572203360881b8152506109d3565b6104b882610b0e565b50505050565b828181146105215760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b8181101561065657600061055b85858481811061054357610543611365565b9050602002810190610555919061137b565b35610863565b9050600061060f826000015187878681811061057957610579611365565b905060200281019061058b919061137b565b61059691903561125e565b835160208501516105a7919061125e565b6105b2906001611271565b84604001518b8b888181106105c9576105c9611365565b90506020028101906105db919061139b565b8b8b8a8181106105ed576105ed611365565b90506020028101906105ff919061137b565b60405160200161041b91906112c9565b905080610620575050600101610524565b61064c86868581811061063557610635611365565b9050602002810190610647919061137b565b610b0e565b5050600101610524565b505050505050565b6036818154811061066e57600080fd5b600091825260209091200154905081565b336002600160a01b03146106c35760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b6033546106d1906001611271565b8535146107135760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156107595760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b6040805186356020808301919091528701358183015290860135606082015261079e906080016040516020818303038152906040528051906020012085858585610e19565b603280548691603591600091826107b4836113e4565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b604080516060810182526000808252602082018190529181018290529061088b603684610926565b60365490915081036108eb5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361093957506000610350565b82546000905b808210156109865760006109538383610f1d565b6000878152602090209091508590820154111561097257809150610980565b61097d816001611271565b92505b5061093f565b6000821180156109b25750836109af866109a160018661125e565b600091825260209091200190565b54145b156109cb576109c260018361125e565b92505050610350565b509392505050565b610a16816040516024016109e7919061144d565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610f3f565b50565b60606000610a2683610f48565b60010190506000816001600160401b03811115610a4557610a45611460565b6040519080825280601f01601f191660200182016040528015610a6f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610a7957509392505050565b60008115610aea578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c9750602081019050818110610abb5750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b610b3e6040518060400160405280600f81526020016e14dd185d19549958d95a5d995c880d608a1b8152506109d3565b803560009081526034602052604090205460ff1615610bae5760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610bde6040518060400160405280600f81526020016e53746174655265636569766572203560881b8152506109d3565b610bee6060820160408301611476565b6001600160a01b03163b600003610c7257610c2f6040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101b60891b8152506109d3565b6040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020908152604091829020805460ff191660011790558151808301909252600f82526e53746174655265636569766572203760881b90820152610cbd906109d3565b600080610cd06060840160408501611476565b6001600160a01b03168335610ceb6040860160208701611476565b610cf86060870187611491565b604051602401610d0b94939291906114d7565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610d40919061150c565b6000604051808303816000865af19150503d8060008114610d7d576040519150601f19603f3d011682016040523d82523d6000602084013e610d82565b606091505b5091509150610db76040518060400160405280600f81526020016e0a6e8c2e8caa4cac6cad2eccae4407608b1b8152506109d3565b81610dd55782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610e0c919061144d565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610e4595949392919061151e565b60408051601f1981840301815290829052610e5f9161150c565b6000604051808303818686fa925050503d8060008114610e9b576040519150601f19603f3d011682016040523d82523d6000602084013e610ea0565b606091505b5091509150600081806020019051810190610ebb9190611557565b9050828015610ec75750805b610f135760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610f2c6002848418611579565b610f3890848416611271565b9392505050565b610a1681611020565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610f875772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610fb3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610fd157662386f26fc10000830492506010015b6305f5e1008310610fe9576305f5e100830492506008015b6127108310610ffd57612710830492506004015b6064831061100f576064830492506002015b600a83106103505760010192915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b60006020828403121561105357600080fd5b5035919050565b60008083601f84011261106c57600080fd5b5081356001600160401b0381111561108357600080fd5b6020830191508360208260051b850101111561109e57600080fd5b9250929050565b6000806000604084860312156110ba57600080fd5b83356001600160401b03808211156110d157600080fd5b6110dd8783880161105a565b909550935060208601359150808211156110f657600080fd5b5084016080818703121561110957600080fd5b809150509250925092565b6000806000806040858703121561112a57600080fd5b84356001600160401b038082111561114157600080fd5b61114d8883890161105a565b9096509450602087013591508082111561116657600080fd5b506111738782880161105a565b95989497509550505050565b60008083601f84011261119157600080fd5b5081356001600160401b038111156111a857600080fd5b60208301915083602082850101111561109e57600080fd5b600080600080600085870360a08112156111d957600080fd5b60608112156111e757600080fd5b5085945060608601356001600160401b038082111561120557600080fd5b61121189838a0161117f565b9096509450608088013591508082111561122a57600080fd5b506112378882890161117f565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350611248565b8082018082111561035057610350611248565b80356001600160a01b038116811461129b57600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081528135602082015260006112e260208401611284565b60018060a01b038082166040850152806112fe60408701611284565b16606085015250506060830135601e1984360301811261131d57600080fd5b83016020810190356001600160401b0381111561133957600080fd5b80360382131561134857600080fd5b60808085015261135c60a0850182846112a0565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261139157600080fd5b9190910192915050565b6000808335601e198436030181126113b257600080fd5b8301803591506001600160401b038211156113cc57600080fd5b6020019150600581901b360382131561109e57600080fd5b6000600182016113f6576113f6611248565b5060010190565b60005b83811015611418578181015183820152602001611400565b50506000910152565b600081518084526114398160208601602086016113fd565b601f01601f19169290920160200192915050565b602081526000610f386020830184611421565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561148857600080fd5b610f3882611284565b6000808335601e198436030181126114a857600080fd5b8301803591506001600160401b038211156114c257600080fd5b60200191503681900382131561109e57600080fd5b8481526001600160a01b038416602082015260606040820181905260009061150290830184866112a0565b9695505050505050565b600082516113918184602087016113fd565b8581526060602082015260006115386060830186886112a0565b828103604084015261154b8185876112a0565b98975050505050505050565b60006020828403121561156957600080fd5b81518015158114610f3857600080fd5b60008261159657634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220329a2dd999c566ec5693f89063a2812ecb671fa2dcb49d33f239384bbf1ab6da64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004611041565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004611041565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e53660046110a5565b610356565b005b6101346002600160a01b0381565b61021d610208366004611041565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004611114565b6104be565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004611041565b61065e565b6101ea6102943660046111c0565b61067f565b61013461203081565b6102b56102b0366004611041565b610863565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610926565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b6103866040518060400160405280600f81526020016e53746174655265636569766572203160881b8152506109d3565b6103986103938235610a19565b6109d3565b60006103a48235610863565b90506103d66040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101960891b8152506109d3565b8051610443906103e790843561125e565b825160208401516103f8919061125e565b610403906001611271565b836040015187878760405160200161041b91906112c9565b60405160208183030381529060405280519060200120610aab9095949392919063ffffffff16565b61047f5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b6104af6040518060400160405280600f81526020016e53746174655265636569766572203360881b8152506109d3565b6104b882610b0e565b50505050565b828181146105215760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b8181101561065657600061055b85858481811061054357610543611365565b9050602002810190610555919061137b565b35610863565b9050600061060f826000015187878681811061057957610579611365565b905060200281019061058b919061137b565b61059691903561125e565b835160208501516105a7919061125e565b6105b2906001611271565b84604001518b8b888181106105c9576105c9611365565b90506020028101906105db919061139b565b8b8b8a8181106105ed576105ed611365565b90506020028101906105ff919061137b565b60405160200161041b91906112c9565b905080610620575050600101610524565b61064c86868581811061063557610635611365565b9050602002810190610647919061137b565b610b0e565b5050600101610524565b505050505050565b6036818154811061066e57600080fd5b600091825260209091200154905081565b336002600160a01b03146106c35760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b6033546106d1906001611271565b8535146107135760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156107595760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b6040805186356020808301919091528701358183015290860135606082015261079e906080016040516020818303038152906040528051906020012085858585610e19565b603280548691603591600091826107b4836113e4565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b604080516060810182526000808252602082018190529181018290529061088b603684610926565b60365490915081036108eb5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361093957506000610350565b82546000905b808210156109865760006109538383610f1d565b6000878152602090209091508590820154111561097257809150610980565b61097d816001611271565b92505b5061093f565b6000821180156109b25750836109af866109a160018661125e565b600091825260209091200190565b54145b156109cb576109c260018361125e565b92505050610350565b509392505050565b610a16816040516024016109e7919061144d565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052610f3f565b50565b60606000610a2683610f48565b60010190506000816001600160401b03811115610a4557610a45611460565b6040519080825280601f01601f191660200182016040528015610a6f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610a7957509392505050565b60008115610aea578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c9750602081019050818110610abb5750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b610b3e6040518060400160405280600f81526020016e14dd185d19549958d95a5d995c880d608a1b8152506109d3565b803560009081526034602052604090205460ff1615610bae5760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610bde6040518060400160405280600f81526020016e53746174655265636569766572203560881b8152506109d3565b610bee6060820160408301611476565b6001600160a01b03163b600003610c7257610c2f6040518060400160405280600f81526020016e29ba30ba32a932b1b2b4bb32b9101b60891b8152506109d3565b6040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020908152604091829020805460ff191660011790558151808301909252600f82526e53746174655265636569766572203760881b90820152610cbd906109d3565b600080610cd06060840160408501611476565b6001600160a01b03168335610ceb6040860160208701611476565b610cf86060870187611491565b604051602401610d0b94939291906114d7565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610d40919061150c565b6000604051808303816000865af19150503d8060008114610d7d576040519150601f19603f3d011682016040523d82523d6000602084013e610d82565b606091505b5091509150610db76040518060400160405280600f81526020016e0a6e8c2e8caa4cac6cad2eccae4407608b1b8152506109d3565b81610dd55782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610e0c919061144d565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610e4595949392919061151e565b60408051601f1981840301815290829052610e5f9161150c565b6000604051808303818686fa925050503d8060008114610e9b576040519150601f19603f3d011682016040523d82523d6000602084013e610ea0565b606091505b5091509150600081806020019051810190610ebb9190611557565b9050828015610ec75750805b610f135760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610f2c6002848418611579565b610f3890848416611271565b9392505050565b610a1681611020565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610f875772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610fb3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610fd157662386f26fc10000830492506010015b6305f5e1008310610fe9576305f5e100830492506008015b6127108310610ffd57612710830492506004015b6064831061100f576064830492506002015b600a83106103505760010192915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b60006020828403121561105357600080fd5b5035919050565b60008083601f84011261106c57600080fd5b5081356001600160401b0381111561108357600080fd5b6020830191508360208260051b850101111561109e57600080fd5b9250929050565b6000806000604084860312156110ba57600080fd5b83356001600160401b03808211156110d157600080fd5b6110dd8783880161105a565b909550935060208601359150808211156110f657600080fd5b5084016080818703121561110957600080fd5b809150509250925092565b6000806000806040858703121561112a57600080fd5b84356001600160401b038082111561114157600080fd5b61114d8883890161105a565b9096509450602087013591508082111561116657600080fd5b506111738782880161105a565b95989497509550505050565b60008083601f84011261119157600080fd5b5081356001600160401b038111156111a857600080fd5b60208301915083602082850101111561109e57600080fd5b600080600080600085870360a08112156111d957600080fd5b60608112156111e757600080fd5b5085945060608601356001600160401b038082111561120557600080fd5b61121189838a0161117f565b9096509450608088013591508082111561122a57600080fd5b506112378882890161117f565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350611248565b8082018082111561035057610350611248565b80356001600160a01b038116811461129b57600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081528135602082015260006112e260208401611284565b60018060a01b038082166040850152806112fe60408701611284565b16606085015250506060830135601e1984360301811261131d57600080fd5b83016020810190356001600160401b0381111561133957600080fd5b80360382131561134857600080fd5b60808085015261135c60a0850182846112a0565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261139157600080fd5b9190910192915050565b6000808335601e198436030181126113b257600080fd5b8301803591506001600160401b038211156113cc57600080fd5b6020019150600581901b360382131561109e57600080fd5b6000600182016113f6576113f6611248565b5060010190565b60005b83811015611418578181015183820152602001611400565b50506000910152565b600081518084526114398160208601602086016113fd565b601f01601f19169290920160200192915050565b602081526000610f386020830184611421565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561148857600080fd5b610f3882611284565b6000808335601e198436030181126114a857600080fd5b8301803591506001600160401b038211156114c257600080fd5b60200191503681900382131561109e57600080fd5b8481526001600160a01b038416602082015260606040820181905260009061150290830184866112a0565b9695505050505050565b600082516113918184602087016113fd565b8581526060602082015260006115386060830186886112a0565b828103604084015261154b8185876112a0565b98975050505050505050565b60006020828403121561156957600080fd5b81518015158114610f3857600080fd5b60008261159657634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220329a2dd999c566ec5693f89063a2812ecb671fa2dcb49d33f239384bbf1ab6da64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var StateReceiverArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"StateReceiver","sourceName":"contracts/child/StateReceiver.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"startId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"NewCommitment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"counter","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"StateSyncResult","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync[]","name":"objs","type":"tuple[]"}],"name":"batchExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"commitment","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"bitmap","type":"bytes"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitmentCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitmentIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct StateReceiver.StateSync","name":"obj","type":"tuple"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCommitmentByStateSyncId","outputs":[{"components":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"endId","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"internalType":"struct StateReceiver.StateSyncCommitment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRootByStateSyncId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCommittedId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedStateSyncs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611244806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004610cd6565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004610cd6565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e5366004610d3a565b610356565b005b6101346002600160a01b0381565b61021d610208366004610cd6565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004610da9565b61041d565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004610cd6565b6105bd565b6101ea610294366004610e55565b6105de565b61013461203081565b6102b56102b0366004610cd6565b6107c2565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610885565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061036282356107c2565b80519091506103d290610376908435610ef3565b825160208401516103879190610ef3565b610392906001610f06565b83604001518787876040516020016103aa9190610f5e565b604051602081830303815290604052805190602001206109329095949392919063ffffffff16565b61040e5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b61041782610995565b50505050565b828181146104805760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b818110156105b55760006104ba8585848181106104a2576104a2610ffa565b90506020028101906104b49190611010565b356107c2565b9050600061056e82600001518787868181106104d8576104d8610ffa565b90506020028101906104ea9190611010565b6104f5919035610ef3565b835160208501516105069190610ef3565b610511906001610f06565b84604001518b8b8881811061052857610528610ffa565b905060200281019061053a9190611030565b8b8b8a81811061054c5761054c610ffa565b905060200281019061055e9190611010565b6040516020016103aa9190610f5e565b90508061057f575050600101610483565b6105ab86868581811061059457610594610ffa565b90506020028101906105a69190611010565b610995565b5050600101610483565b505050505050565b603681815481106105cd57600080fd5b600091825260209091200154905081565b336002600160a01b03146106225760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b603354610630906001610f06565b8535146106725760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156106b85760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b604080518635602080830191909152870135818301529086013560608201526106fd906080016040516020818303038152906040528051906020012085858585610bb0565b6032805486916035916000918261071383611079565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b60408051606081018252600080825260208201819052918101829052906107ea603684610885565b603654909150810361084a5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361089857506000610350565b82546000905b808210156108e55760006108b28383610cb4565b600087815260209020909150859082015411156108d1578091506108df565b6108dc816001610f06565b92505b5061089e565b60008211801561091157508361090e86610900600186610ef3565b600091825260209091200190565b54145b1561092a57610921600183610ef3565b92505050610350565b509392505050565b60008115610971578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c97506020810190508181106109425750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b803560009081526034602052604090205460ff1615610a055760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610a156060820160408301611092565b6001600160a01b03163b600003610a69576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610a979060608501908501611092565b6001600160a01b03168335610ab26040860160208701611092565b610abf60608701876110ad565b604051602401610ad294939291906110f3565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610b07919061114c565b6000604051808303816000865af19150503d8060008114610b44576040519150601f19603f3d011682016040523d82523d6000602084013e610b49565b606091505b509150915081610b6c5782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610ba3919061115e565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610bdc959493929190611191565b60408051601f1981840301815290829052610bf69161114c565b6000604051808303818686fa925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5091509150600081806020019051810190610c5291906111ca565b9050828015610c5e5750805b610caa5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610cc360028484186111ec565b610ccf90848416610f06565b9392505050565b600060208284031215610ce857600080fd5b5035919050565b60008083601f840112610d0157600080fd5b5081356001600160401b03811115610d1857600080fd5b6020830191508360208260051b8501011115610d3357600080fd5b9250929050565b600080600060408486031215610d4f57600080fd5b83356001600160401b0380821115610d6657600080fd5b610d7287838801610cef565b90955093506020860135915080821115610d8b57600080fd5b50840160808187031215610d9e57600080fd5b809150509250925092565b60008060008060408587031215610dbf57600080fd5b84356001600160401b0380821115610dd657600080fd5b610de288838901610cef565b90965094506020870135915080821115610dfb57600080fd5b50610e0887828801610cef565b95989497509550505050565b60008083601f840112610e2657600080fd5b5081356001600160401b03811115610e3d57600080fd5b602083019150836020828501011115610d3357600080fd5b600080600080600085870360a0811215610e6e57600080fd5b6060811215610e7c57600080fd5b5085945060608601356001600160401b0380821115610e9a57600080fd5b610ea689838a01610e14565b90965094506080880135915080821115610ebf57600080fd5b50610ecc88828901610e14565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350610edd565b8082018082111561035057610350610edd565b80356001600160a01b0381168114610f3057600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152813560208201526000610f7760208401610f19565b60018060a01b03808216604085015280610f9360408701610f19565b16606085015250506060830135601e19843603018112610fb257600080fd5b83016020810190356001600160401b03811115610fce57600080fd5b803603821315610fdd57600080fd5b608080850152610ff160a085018284610f35565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261102657600080fd5b9190910192915050565b6000808335601e1984360301811261104757600080fd5b8301803591506001600160401b0382111561106157600080fd5b6020019150600581901b3603821315610d3357600080fd5b60006001820161108b5761108b610edd565b5060010190565b6000602082840312156110a457600080fd5b610ccf82610f19565b6000808335601e198436030181126110c457600080fd5b8301803591506001600160401b038211156110de57600080fd5b602001915036819003821315610d3357600080fd5b8481526001600160a01b038416602082015260606040820181905260009061111e9083018486610f35565b9695505050505050565b60005b8381101561114357818101518382015260200161112b565b50506000910152565b60008251611026818460208701611128565b602081526000825180602084015261117d816040850160208701611128565b601f01601f19169190910160400192915050565b8581526060602082015260006111ab606083018688610f35565b82810360408401526111be818587610f35565b98975050505050505050565b6000602082840312156111dc57600080fd5b81518015158114610ccf57600080fd5b60008261120957634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212205e465487d9414dfe77390f61a0c38958de52ee524ceeb4baa7548b12c5998a1564736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c806355b01e4d116100ad578063ad240c2a11610071578063ad240c2a1461026a578063c59a18f714610273578063c6df461714610286578063e0563ab114610299578063eb70ef44146102a257600080fd5b806355b01e4d1461022d5780635ea5df791461023b5780639017c12714610244578063947287cf1461025757806397e5230d1461026057600080fd5b80633b878c22116100f45780633b878c221461018457806349ce89971461018d57806350d5b95b146101d757806351351d53146101ec578063544c5e0f146101fa57600080fd5b806307b3e25214610126578063196f1b2d1461015157806323e281cf14610172578063284017f51461017b575b600080fd5b6101346004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b61016461015f366004610cd6565b6102d7565b604051908152602001610148565b61016460325481565b61013461202081565b61013461101081565b6101bc61019b366004610cd6565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610148565b6101ea6101e5366004610d3a565b610356565b005b6101346002600160a01b0381565b61021d610208366004610cd6565b60346020526000908152604090205460ff1681565b6040519015158152602001610148565b6101346004600160991b0181565b61016461138881565b6101ea610252366004610da9565b61041d565b61016461520881565b610164620249f081565b61016460335481565b610164610281366004610cd6565b6105bd565b6101ea610294366004610e55565b6105de565b61013461203081565b6102b56102b0366004610cd6565b6107c2565b6040805182518152602080840151908201529181015190820152606001610148565b6000806035816102e8603686610885565b81526020810191909152604001600020600201549050806103505760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061036282356107c2565b80519091506103d290610376908435610ef3565b825160208401516103879190610ef3565b610392906001610f06565b83604001518787876040516020016103aa9190610f5e565b604051602081830303815290604052805190602001206109329095949392919063ffffffff16565b61040e5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610347565b61041782610995565b50505050565b828181146104805760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610347565b60005b818110156105b55760006104ba8585848181106104a2576104a2610ffa565b90506020028101906104b49190611010565b356107c2565b9050600061056e82600001518787868181106104d8576104d8610ffa565b90506020028101906104ea9190611010565b6104f5919035610ef3565b835160208501516105069190610ef3565b610511906001610f06565b84604001518b8b8881811061052857610528610ffa565b905060200281019061053a9190611030565b8b8b8a81811061054c5761054c610ffa565b905060200281019061055e9190611010565b6040516020016103aa9190610f5e565b90508061057f575050600101610483565b6105ab86868581811061059457610594610ffa565b90506020028101906105a69190611010565b610995565b5050600101610483565b505050505050565b603681815481106105cd57600080fd5b600091825260209091200154905081565b336002600160a01b03146106225760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610347565b603354610630906001610f06565b8535146106725760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610347565b8435602086013510156106b85760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610347565b604080518635602080830191909152870135818301529086013560608201526106fd906080016040516020818303038152906040528051906020012085858585610bb0565b6032805486916035916000918261071383611079565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b60408051606081018252600080825260208201819052918101829052906107ea603684610885565b603654909150810361084a5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610347565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b8154600090810361089857506000610350565b82546000905b808210156108e55760006108b28383610cb4565b600087815260209020909150859082015411156108d1578091506108df565b6108dc816001610f06565b92505b5061089e565b60008211801561091157508361090e86610900600186610ef3565b600091825260209091200190565b54145b1561092a57610921600183610ef3565b92505050610350565b509392505050565b60008115610971578160051b8301835b8760011660051b8981528135602082185250604060002098508760011c97506020810190508181106109425750505b85158488141660018084031b8611600180851b018710161690509695505050505050565b803560009081526034602052604090205460ff1615610a055760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610347565b610a156060820160408301611092565b6001600160a01b03163b600003610a69576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610a979060608501908501611092565b6001600160a01b03168335610ab26040860160208701611092565b610abf60608701876110ad565b604051602401610ad294939291906110f3565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610b07919061114c565b6000604051808303816000865af19150503d8060008114610b44576040519150601f19603f3d011682016040523d82523d6000602084013e610b49565b606091505b509150915081610b6c5782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610ba3919061115e565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610bdc959493929190611191565b60408051601f1981840301815290829052610bf69161114c565b6000604051808303818686fa925050503d8060008114610c32576040519150601f19603f3d011682016040523d82523d6000602084013e610c37565b606091505b5091509150600081806020019051810190610c5291906111ca565b9050828015610c5e5750805b610caa5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610347565b5050505050505050565b6000610cc360028484186111ec565b610ccf90848416610f06565b9392505050565b600060208284031215610ce857600080fd5b5035919050565b60008083601f840112610d0157600080fd5b5081356001600160401b03811115610d1857600080fd5b6020830191508360208260051b8501011115610d3357600080fd5b9250929050565b600080600060408486031215610d4f57600080fd5b83356001600160401b0380821115610d6657600080fd5b610d7287838801610cef565b90955093506020860135915080821115610d8b57600080fd5b50840160808187031215610d9e57600080fd5b809150509250925092565b60008060008060408587031215610dbf57600080fd5b84356001600160401b0380821115610dd657600080fd5b610de288838901610cef565b90965094506020870135915080821115610dfb57600080fd5b50610e0887828801610cef565b95989497509550505050565b60008083601f840112610e2657600080fd5b5081356001600160401b03811115610e3d57600080fd5b602083019150836020828501011115610d3357600080fd5b600080600080600085870360a0811215610e6e57600080fd5b6060811215610e7c57600080fd5b5085945060608601356001600160401b0380821115610e9a57600080fd5b610ea689838a01610e14565b90965094506080880135915080821115610ebf57600080fd5b50610ecc88828901610e14565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561035057610350610edd565b8082018082111561035057610350610edd565b80356001600160a01b0381168114610f3057600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152813560208201526000610f7760208401610f19565b60018060a01b03808216604085015280610f9360408701610f19565b16606085015250506060830135601e19843603018112610fb257600080fd5b83016020810190356001600160401b03811115610fce57600080fd5b803603821315610fdd57600080fd5b608080850152610ff160a085018284610f35565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261102657600080fd5b9190910192915050565b6000808335601e1984360301811261104757600080fd5b8301803591506001600160401b0382111561106157600080fd5b6020019150600581901b3603821315610d3357600080fd5b60006001820161108b5761108b610edd565b5060010190565b6000602082840312156110a457600080fd5b610ccf82610f19565b6000808335601e198436030181126110c457600080fd5b8301803591506001600160401b038211156110de57600080fd5b602001915036819003821315610d3357600080fd5b8481526001600160a01b038416602082015260606040820181905260009061111e9083018486610f35565b9695505050505050565b60005b8381101561114357818101518382015260200161112b565b50506000910152565b60008251611026818460208701611128565b602081526000825180602084015261117d816040850160208701611128565b601f01601f19169190910160400192915050565b8581526060602082015260006111ab606083018688610f35565b82810360408401526111be818587610f35565b98975050505050505050565b6000602082840312156111dc57600080fd5b81518015158114610ccf57600080fd5b60008261120957634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212205e465487d9414dfe77390f61a0c38958de52ee524ceeb4baa7548b12c5998a1564736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var NativeERC20Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"NativeERC20","sourceName":"contracts/child/NativeERC20.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"predicate_","type":"address"},{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"tokenSupply_","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061121c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101635760003560e01c806355b01e4d116100ce57806397e5230d1161008757806397e5230d146102b85780639dc29fac146102c2578063a457c2d7146102d5578063a9059cbb146102e8578063dd62ed3e146102fb578063e0563ab11461030e578063e61987051461031757600080fd5b806355b01e4d146102605780635ea5df791461026e57806370a0823114610277578063740b08dc14610292578063947287cf146102a757806395d89b41146102b057600080fd5b8063284017f511610120578063284017f514610205578063313ce5671461020e57806339509351146102235780633b878c221461023657806340c10f191461023f57806351351d531461025257600080fd5b806306fdde031461016857806307b3e25214610186578063095ea7b3146101ac57806318160ddd146101cf5780631f2d0065146101e157806323b872dd146101f2575b600080fd5b610170610328565b60405161017d9190610d4d565b60405180910390f35b6101946004600360981b0181565b6040516001600160a01b03909116815260200161017d565b6101bf6101ba366004610d9c565b6103ba565b604051901515815260200161017d565b6034545b60405190815260200161017d565b6036546001600160a01b0316610194565b6101bf610200366004610dc6565b6103d4565b61019461202081565b60395460405160ff909116815260200161017d565b6101bf610231366004610d9c565b6103f8565b61019461101081565b6101bf61024d366004610d9c565b61041a565b6101946002600160a01b0381565b6101946004600160991b0181565b6101d361138881565b6101d3610285366004610e02565b6001600160a01b03163190565b6102a56102a0366004610e6d565b610463565b005b6101d361520881565b610170610618565b6101d3620249f081565b6101bf6102d0366004610d9c565b610627565b6101bf6102e3366004610d9c565b61065e565b6101bf6102f6366004610d9c565b6106d9565b6101d3610309366004610f21565b6106e7565b61019461203081565b6035546001600160a01b0316610194565b60606037805461033790610f54565b80601f016020809104026020016040519081016040528092919081815260200182805461036390610f54565b80156103b05780601f10610385576101008083540402835291602001916103b0565b820191906000526020600020905b81548152906001019060200180831161039357829003601f168201915b5050505050905090565b6000336103c8818585610712565b60019150505b92915050565b6000336103e2858285610836565b6103ed8585856108b0565b506001949350505050565b6000336103c881858561040b83836106e7565b6104159190610fa4565b610712565b6035546000906001600160a01b031633146104505760405162461bcd60e51b815260040161044790610fb7565b60405180910390fd5b61045a8383610a75565b50600192915050565b600054610100900460ff16158080156104835750600054600160ff909116105b8061049d5750303b15801561049d575060005460ff166001145b6105005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610447565b6000805460ff191660011790558015610523576000805461ff0019166101001790555b336002600160a01b03146105675760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610447565b603580546001600160a01b03808c166001600160a01b03199283161790925560368054928b169290911691909117905560376105a4878983611060565b5060386105b2858783611060565b506039805460ff191660ff85161790556034829055801561060d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b60606038805461033790610f54565b6035546000906001600160a01b031633146106545760405162461bcd60e51b815260040161044790610fb7565b61045a8383610bcf565b6000338161066c82866106e7565b9050838110156106cc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610447565b6103ed8286868403610712565b6000336103c88185856108b0565b6001600160a01b03918216600090815260336020908152604080832093909416825291909152205490565b6001600160a01b0383166107745760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610447565b6001600160a01b0382166107d55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610447565b6001600160a01b0383811660008181526033602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061084284846106e7565b905060001981146108aa578181101561089d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610447565b6108aa8484848403610712565b50505050565b6001600160a01b0383166109145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610447565b6001600160a01b0382166109765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610447565b6000806120206001600160a01b031685858560405160200161099a93929190611121565b60408051601f19818403018152908290526109b491611145565b6000604051808303816000865af19150503d80600081146109f1576040519150601f19603f3d011682016040523d82523d6000602084013e6109f6565b606091505b5091509150818015610a17575080806020019051810190610a179190611161565b610a335760405162461bcd60e51b815260040161044790611183565b836001600160a01b0316856001600160a01b03166000805160206111c783398151915285604051610a6691815260200190565b60405180910390a35050505050565b6001600160a01b038216610acb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610447565b8060346000828254610add9190610fa4565b9091555050604051600090819061202090610b0090839087908790602001611121565b60408051601f1981840301815290829052610b1a91611145565b6000604051808303816000865af19150503d8060008114610b57576040519150601f19603f3d011682016040523d82523d6000602084013e610b5c565b606091505b5091509150818015610b7d575080806020019051810190610b7d9190611161565b610b995760405162461bcd60e51b815260040161044790611183565b6040518381526001600160a01b038516906000906000805160206111c7833981519152906020015b60405180910390a350505050565b6001600160a01b038216610c2f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610447565b8060346000828254610c4191906111b3565b9091555050604051600090819061202090610c6490869084908790602001611121565b60408051601f1981840301815290829052610c7e91611145565b6000604051808303816000865af19150503d8060008114610cbb576040519150601f19603f3d011682016040523d82523d6000602084013e610cc0565b606091505b5091509150818015610ce1575080806020019051810190610ce19190611161565b610cfd5760405162461bcd60e51b815260040161044790611183565b6040518381526000906001600160a01b038616906000805160206111c783398151915290602001610bc1565b60005b83811015610d44578181015183820152602001610d2c565b50506000910152565b6020815260008251806020840152610d6c816040850160208701610d29565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610d9757600080fd5b919050565b60008060408385031215610daf57600080fd5b610db883610d80565b946020939093013593505050565b600080600060608486031215610ddb57600080fd5b610de484610d80565b9250610df260208501610d80565b9150604084013590509250925092565b600060208284031215610e1457600080fd5b610e1d82610d80565b9392505050565b60008083601f840112610e3657600080fd5b50813567ffffffffffffffff811115610e4e57600080fd5b602083019150836020828501011115610e6657600080fd5b9250929050565b60008060008060008060008060c0898b031215610e8957600080fd5b610e9289610d80565b9750610ea060208a01610d80565b9650604089013567ffffffffffffffff80821115610ebd57600080fd5b610ec98c838d01610e24565b909850965060608b0135915080821115610ee257600080fd5b50610eef8b828c01610e24565b909550935050608089013560ff81168114610f0957600080fd5b8092505060a089013590509295985092959890939650565b60008060408385031215610f3457600080fd5b610f3d83610d80565b9150610f4b60208401610d80565b90509250929050565b600181811c90821680610f6857607f821691505b602082108103610f8857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103ce576103ce610f8e565b60208082526024908201527f4e617469766545524332303a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561105b57600081815260208120601f850160051c810160208610156110385750805b601f850160051c820191505b8181101561105757828155600101611044565b5050505b505050565b67ffffffffffffffff83111561107857611078610ffb565b61108c836110868354610f54565b83611011565b6000601f8411600181146110c057600085156110a85750838201355b600019600387901b1c1916600186901b17835561111a565b600083815260209020601f19861690835b828110156110f157868501358255602094850194600190920191016110d1565b508682101561110e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611157818460208701610d29565b9190910192915050565b60006020828403121561117357600080fd5b81518015158114610e1d57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b818103818111156103ce576103ce610f8e56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203e253e3b3f3175f58563f905e4d35905dc8b894d96a80a43930b6a730edd9a2a64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101635760003560e01c806355b01e4d116100ce57806397e5230d1161008757806397e5230d146102b85780639dc29fac146102c2578063a457c2d7146102d5578063a9059cbb146102e8578063dd62ed3e146102fb578063e0563ab11461030e578063e61987051461031757600080fd5b806355b01e4d146102605780635ea5df791461026e57806370a0823114610277578063740b08dc14610292578063947287cf146102a757806395d89b41146102b057600080fd5b8063284017f511610120578063284017f514610205578063313ce5671461020e57806339509351146102235780633b878c221461023657806340c10f191461023f57806351351d531461025257600080fd5b806306fdde031461016857806307b3e25214610186578063095ea7b3146101ac57806318160ddd146101cf5780631f2d0065146101e157806323b872dd146101f2575b600080fd5b610170610328565b60405161017d9190610d4d565b60405180910390f35b6101946004600360981b0181565b6040516001600160a01b03909116815260200161017d565b6101bf6101ba366004610d9c565b6103ba565b604051901515815260200161017d565b6034545b60405190815260200161017d565b6036546001600160a01b0316610194565b6101bf610200366004610dc6565b6103d4565b61019461202081565b60395460405160ff909116815260200161017d565b6101bf610231366004610d9c565b6103f8565b61019461101081565b6101bf61024d366004610d9c565b61041a565b6101946002600160a01b0381565b6101946004600160991b0181565b6101d361138881565b6101d3610285366004610e02565b6001600160a01b03163190565b6102a56102a0366004610e6d565b610463565b005b6101d361520881565b610170610618565b6101d3620249f081565b6101bf6102d0366004610d9c565b610627565b6101bf6102e3366004610d9c565b61065e565b6101bf6102f6366004610d9c565b6106d9565b6101d3610309366004610f21565b6106e7565b61019461203081565b6035546001600160a01b0316610194565b60606037805461033790610f54565b80601f016020809104026020016040519081016040528092919081815260200182805461036390610f54565b80156103b05780601f10610385576101008083540402835291602001916103b0565b820191906000526020600020905b81548152906001019060200180831161039357829003601f168201915b5050505050905090565b6000336103c8818585610712565b60019150505b92915050565b6000336103e2858285610836565b6103ed8585856108b0565b506001949350505050565b6000336103c881858561040b83836106e7565b6104159190610fa4565b610712565b6035546000906001600160a01b031633146104505760405162461bcd60e51b815260040161044790610fb7565b60405180910390fd5b61045a8383610a75565b50600192915050565b600054610100900460ff16158080156104835750600054600160ff909116105b8061049d5750303b15801561049d575060005460ff166001145b6105005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610447565b6000805460ff191660011790558015610523576000805461ff0019166101001790555b336002600160a01b03146105675760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610447565b603580546001600160a01b03808c166001600160a01b03199283161790925560368054928b169290911691909117905560376105a4878983611060565b5060386105b2858783611060565b506039805460ff191660ff85161790556034829055801561060d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b60606038805461033790610f54565b6035546000906001600160a01b031633146106545760405162461bcd60e51b815260040161044790610fb7565b61045a8383610bcf565b6000338161066c82866106e7565b9050838110156106cc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610447565b6103ed8286868403610712565b6000336103c88185856108b0565b6001600160a01b03918216600090815260336020908152604080832093909416825291909152205490565b6001600160a01b0383166107745760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610447565b6001600160a01b0382166107d55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610447565b6001600160a01b0383811660008181526033602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061084284846106e7565b905060001981146108aa578181101561089d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610447565b6108aa8484848403610712565b50505050565b6001600160a01b0383166109145760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610447565b6001600160a01b0382166109765760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610447565b6000806120206001600160a01b031685858560405160200161099a93929190611121565b60408051601f19818403018152908290526109b491611145565b6000604051808303816000865af19150503d80600081146109f1576040519150601f19603f3d011682016040523d82523d6000602084013e6109f6565b606091505b5091509150818015610a17575080806020019051810190610a179190611161565b610a335760405162461bcd60e51b815260040161044790611183565b836001600160a01b0316856001600160a01b03166000805160206111c783398151915285604051610a6691815260200190565b60405180910390a35050505050565b6001600160a01b038216610acb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610447565b8060346000828254610add9190610fa4565b9091555050604051600090819061202090610b0090839087908790602001611121565b60408051601f1981840301815290829052610b1a91611145565b6000604051808303816000865af19150503d8060008114610b57576040519150601f19603f3d011682016040523d82523d6000602084013e610b5c565b606091505b5091509150818015610b7d575080806020019051810190610b7d9190611161565b610b995760405162461bcd60e51b815260040161044790611183565b6040518381526001600160a01b038516906000906000805160206111c7833981519152906020015b60405180910390a350505050565b6001600160a01b038216610c2f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610447565b8060346000828254610c4191906111b3565b9091555050604051600090819061202090610c6490869084908790602001611121565b60408051601f1981840301815290829052610c7e91611145565b6000604051808303816000865af19150503d8060008114610cbb576040519150601f19603f3d011682016040523d82523d6000602084013e610cc0565b606091505b5091509150818015610ce1575080806020019051810190610ce19190611161565b610cfd5760405162461bcd60e51b815260040161044790611183565b6040518381526000906001600160a01b038616906000805160206111c783398151915290602001610bc1565b60005b83811015610d44578181015183820152602001610d2c565b50506000910152565b6020815260008251806020840152610d6c816040850160208701610d29565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610d9757600080fd5b919050565b60008060408385031215610daf57600080fd5b610db883610d80565b946020939093013593505050565b600080600060608486031215610ddb57600080fd5b610de484610d80565b9250610df260208501610d80565b9150604084013590509250925092565b600060208284031215610e1457600080fd5b610e1d82610d80565b9392505050565b60008083601f840112610e3657600080fd5b50813567ffffffffffffffff811115610e4e57600080fd5b602083019150836020828501011115610e6657600080fd5b9250929050565b60008060008060008060008060c0898b031215610e8957600080fd5b610e9289610d80565b9750610ea060208a01610d80565b9650604089013567ffffffffffffffff80821115610ebd57600080fd5b610ec98c838d01610e24565b909850965060608b0135915080821115610ee257600080fd5b50610eef8b828c01610e24565b909550935050608089013560ff81168114610f0957600080fd5b8092505060a089013590509295985092959890939650565b60008060408385031215610f3457600080fd5b610f3d83610d80565b9150610f4b60208401610d80565b90509250929050565b600181811c90821680610f6857607f821691505b602082108103610f8857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103ce576103ce610f8e565b60208082526024908201527f4e617469766545524332303a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561105b57600081815260208120601f850160051c810160208610156110385750805b601f850160051c820191505b8181101561105757828155600101611044565b5050505b505050565b67ffffffffffffffff83111561107857611078610ffb565b61108c836110868354610f54565b83611011565b6000601f8411600181146110c057600085156110a85750838201355b600019600387901b1c1916600186901b17835561111a565b600083815260209020601f19861690835b828110156110f157868501358255602094850194600190920191016110d1565b508682101561110e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611157818460208701610d29565b9190910192915050565b60006020828403121561117357600080fd5b81518015158114610e1d57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b818103818111156103ce576103ce610f8e56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212203e253e3b3f3175f58563f905e4d35905dc8b894d96a80a43930b6a730edd9a2a64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var NativeERC20MintableArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"NativeERC20Mintable","sourceName":"contracts/child/NativeERC20Mintable.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"predicate_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"tokenSupply_","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061001a3361001f565b61008d565b603480546001600160a01b03191690556100388161003b565b50565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61150a8061009c6000396000f3fe608060405234801561001057600080fd5b506004361061019a5760003560e01c806370a08231116100e45780639dc29fac116100925780639dc29fac1461031a578063a457c2d71461032d578063a9059cbb14610340578063dd62ed3e14610353578063e0563ab114610366578063e30c39781461036f578063e619870514610380578063f2fde38b1461039157600080fd5b806370a08231146102c3578063715018a6146102de57806379ba5097146102e65780638da5cb5b146102ee578063947287cf146102ff57806395d89b411461030857806397e5230d1461031057600080fd5b8063313ce5671161014c578063313ce56714610245578063395093511461025a5780633b878c221461026d57806340c10f191461027657806351351d531461028957806355b01e4d146102975780635ea5df79146102a55780636091636b146102ae57600080fd5b806306fdde031461019f57806307b3e252146101bd578063095ea7b3146101e357806318160ddd146102065780631f2d00651461021857806323b872dd14610229578063284017f51461023c575b600080fd5b6101a76103a4565b6040516101b49190611022565b60405180910390f35b6101cb6004600360981b0181565b6040516001600160a01b0390911681526020016101b4565b6101f66101f1366004611071565b610436565b60405190151581526020016101b4565b6036545b6040519081526020016101b4565b6038546001600160a01b03166101cb565b6101f661023736600461109b565b610450565b6101cb61202081565b603b5460405160ff90911681526020016101b4565b6101f6610268366004611071565b610474565b6101cb61101081565b6101f6610284366004611071565b610496565b6101cb6002600160a01b0381565b6101cb6004600160991b0181565b61020a61138881565b6102c16102bc366004611120565b6104f4565b005b61020a6102d13660046111e4565b6001600160a01b03163190565b6102c1610714565b6102c1610728565b6033546001600160a01b03166101cb565b61020a61520881565b6101a76107a2565b61020a620249f081565b6101f6610328366004611071565b6107b1565b6101f661033b366004611071565b6107fd565b6101f661034e366004611071565b610878565b61020a610361366004611206565b610886565b6101cb61203081565b6034546001600160a01b03166101cb565b6037546001600160a01b03166101cb565b6102c161039f3660046111e4565b6108b1565b6060603980546103b390611239565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90611239565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600033610444818585610922565b60019150505b92915050565b60003361045e858285610a46565b610469858585610ac0565b506001949350505050565b6000336104448185856104878383610886565b6104919190611289565b610922565b6037546000906001600160a01b03163314806104bc57506033546001600160a01b031633145b6104e15760405162461bcd60e51b81526004016104d89061129c565b60405180910390fd5b6104eb8383610c85565b50600192915050565b600054610100900460ff16158080156105145750600054600160ff909116105b8061052e5750303b15801561052e575060005460ff166001145b6105915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104d8565b6000805460ff1916600117905580156105b4576000805461ff0019166101001790555b336002600160a01b03146105f85760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016104d8565b6001600160a01b0389166106595760405162461bcd60e51b815260206004820152602260248201527f4e617469766545524332303a20496e76616c6964206f776e6572206164647265604482015261737360f01b60648201526084016104d8565b603780546001600160a01b03808d166001600160a01b03199283161790925560388054928b1692909116919091179055603961069687898361134e565b50603a6106a485878361134e565b50603b805460ff191660ff851617905560368290556106c289610ddf565b8015610708576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61071c610df8565b6107266000610ddf565b565b60345433906001600160a01b031681146107965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016104d8565b61079f81610ddf565b50565b6060603a80546103b390611239565b6037546000906001600160a01b03163314806107d757506033546001600160a01b031633145b6107f35760405162461bcd60e51b81526004016104d89061129c565b6104eb8383610e52565b6000338161080b8286610886565b90508381101561086b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d8565b6104698286868403610922565b600033610444818585610ac0565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6108b9610df8565b603480546001600160a01b0383166001600160a01b031990911681179091556108ea6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0383166109845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d8565b6001600160a01b0382166109e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d8565b6001600160a01b0383811660008181526035602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a528484610886565b90506000198114610aba5781811015610aad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d8565b610aba8484848403610922565b50505050565b6001600160a01b038316610b245760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d8565b6001600160a01b038216610b865760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d8565b6000806120206001600160a01b0316858585604051602001610baa9392919061140f565b60408051601f1981840301815290829052610bc491611433565b6000604051808303816000865af19150503d8060008114610c01576040519150601f19603f3d011682016040523d82523d6000602084013e610c06565b606091505b5091509150818015610c27575080806020019051810190610c27919061144f565b610c435760405162461bcd60e51b81526004016104d890611471565b836001600160a01b0316856001600160a01b03166000805160206114b583398151915285604051610c7691815260200190565b60405180910390a35050505050565b6001600160a01b038216610cdb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d8565b8060366000828254610ced9190611289565b9091555050604051600090819061202090610d109083908790879060200161140f565b60408051601f1981840301815290829052610d2a91611433565b6000604051808303816000865af19150503d8060008114610d67576040519150601f19603f3d011682016040523d82523d6000602084013e610d6c565b606091505b5091509150818015610d8d575080806020019051810190610d8d919061144f565b610da95760405162461bcd60e51b81526004016104d890611471565b6040518381526001600160a01b038516906000906000805160206114b5833981519152906020015b60405180910390a350505050565b603480546001600160a01b031916905561079f81610fac565b6033546001600160a01b031633146107265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b6001600160a01b038216610eb25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d8565b8060366000828254610ec491906114a1565b9091555050604051600090819061202090610ee79086908490879060200161140f565b60408051601f1981840301815290829052610f0191611433565b6000604051808303816000865af19150503d8060008114610f3e576040519150601f19603f3d011682016040523d82523d6000602084013e610f43565b606091505b5091509150818015610f64575080806020019051810190610f64919061144f565b610f805760405162461bcd60e51b81526004016104d890611471565b6040518381526000906001600160a01b038616906000805160206114b583398151915290602001610dd1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b83811015611019578181015183820152602001611001565b50506000910152565b6020815260008251806020840152611041816040850160208701610ffe565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461106c57600080fd5b919050565b6000806040838503121561108457600080fd5b61108d83611055565b946020939093013593505050565b6000806000606084860312156110b057600080fd5b6110b984611055565b92506110c760208501611055565b9150604084013590509250925092565b60008083601f8401126110e957600080fd5b50813567ffffffffffffffff81111561110157600080fd5b60208301915083602082850101111561111957600080fd5b9250929050565b600080600080600080600080600060e08a8c03121561113e57600080fd5b6111478a611055565b985061115560208b01611055565b975061116360408b01611055565b965060608a013567ffffffffffffffff8082111561118057600080fd5b61118c8d838e016110d7565b909850965060808c01359150808211156111a557600080fd5b506111b28c828d016110d7565b90955093505060a08a013560ff811681146111cc57600080fd5b8092505060c08a013590509295985092959850929598565b6000602082840312156111f657600080fd5b6111ff82611055565b9392505050565b6000806040838503121561121957600080fd5b61122283611055565b915061123060208401611055565b90509250929050565b600181811c9082168061124d57607f821691505b60208210810361126d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561044a5761044a611273565b6020808252602d908201527f4e617469766545524332303a204f6e6c7920707265646963617465206f72206f60408201526c1ddb995c8818d85b8818d85b1b609a1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561134957600081815260208120601f850160051c810160208610156113265750805b601f850160051c820191505b8181101561134557828155600101611332565b5050505b505050565b67ffffffffffffffff831115611366576113666112e9565b61137a836113748354611239565b836112ff565b6000601f8411600181146113ae57600085156113965750838201355b600019600387901b1c1916600186901b178355611408565b600083815260209020601f19861690835b828110156113df57868501358255602094850194600190920191016113bf565b50868210156113fc5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611445818460208701610ffe565b9190910192915050565b60006020828403121561146157600080fd5b815180151581146111ff57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561044a5761044a61127356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c841ea6b2ede0321e38158aa4ac46f255ea0caf34a5429d64b9287ce7df103b364736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061019a5760003560e01c806370a08231116100e45780639dc29fac116100925780639dc29fac1461031a578063a457c2d71461032d578063a9059cbb14610340578063dd62ed3e14610353578063e0563ab114610366578063e30c39781461036f578063e619870514610380578063f2fde38b1461039157600080fd5b806370a08231146102c3578063715018a6146102de57806379ba5097146102e65780638da5cb5b146102ee578063947287cf146102ff57806395d89b411461030857806397e5230d1461031057600080fd5b8063313ce5671161014c578063313ce56714610245578063395093511461025a5780633b878c221461026d57806340c10f191461027657806351351d531461028957806355b01e4d146102975780635ea5df79146102a55780636091636b146102ae57600080fd5b806306fdde031461019f57806307b3e252146101bd578063095ea7b3146101e357806318160ddd146102065780631f2d00651461021857806323b872dd14610229578063284017f51461023c575b600080fd5b6101a76103a4565b6040516101b49190611022565b60405180910390f35b6101cb6004600360981b0181565b6040516001600160a01b0390911681526020016101b4565b6101f66101f1366004611071565b610436565b60405190151581526020016101b4565b6036545b6040519081526020016101b4565b6038546001600160a01b03166101cb565b6101f661023736600461109b565b610450565b6101cb61202081565b603b5460405160ff90911681526020016101b4565b6101f6610268366004611071565b610474565b6101cb61101081565b6101f6610284366004611071565b610496565b6101cb6002600160a01b0381565b6101cb6004600160991b0181565b61020a61138881565b6102c16102bc366004611120565b6104f4565b005b61020a6102d13660046111e4565b6001600160a01b03163190565b6102c1610714565b6102c1610728565b6033546001600160a01b03166101cb565b61020a61520881565b6101a76107a2565b61020a620249f081565b6101f6610328366004611071565b6107b1565b6101f661033b366004611071565b6107fd565b6101f661034e366004611071565b610878565b61020a610361366004611206565b610886565b6101cb61203081565b6034546001600160a01b03166101cb565b6037546001600160a01b03166101cb565b6102c161039f3660046111e4565b6108b1565b6060603980546103b390611239565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90611239565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600033610444818585610922565b60019150505b92915050565b60003361045e858285610a46565b610469858585610ac0565b506001949350505050565b6000336104448185856104878383610886565b6104919190611289565b610922565b6037546000906001600160a01b03163314806104bc57506033546001600160a01b031633145b6104e15760405162461bcd60e51b81526004016104d89061129c565b60405180910390fd5b6104eb8383610c85565b50600192915050565b600054610100900460ff16158080156105145750600054600160ff909116105b8061052e5750303b15801561052e575060005460ff166001145b6105915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104d8565b6000805460ff1916600117905580156105b4576000805461ff0019166101001790555b336002600160a01b03146105f85760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016104d8565b6001600160a01b0389166106595760405162461bcd60e51b815260206004820152602260248201527f4e617469766545524332303a20496e76616c6964206f776e6572206164647265604482015261737360f01b60648201526084016104d8565b603780546001600160a01b03808d166001600160a01b03199283161790925560388054928b1692909116919091179055603961069687898361134e565b50603a6106a485878361134e565b50603b805460ff191660ff851617905560368290556106c289610ddf565b8015610708576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61071c610df8565b6107266000610ddf565b565b60345433906001600160a01b031681146107965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016104d8565b61079f81610ddf565b50565b6060603a80546103b390611239565b6037546000906001600160a01b03163314806107d757506033546001600160a01b031633145b6107f35760405162461bcd60e51b81526004016104d89061129c565b6104eb8383610e52565b6000338161080b8286610886565b90508381101561086b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d8565b6104698286868403610922565b600033610444818585610ac0565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6108b9610df8565b603480546001600160a01b0383166001600160a01b031990911681179091556108ea6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0383166109845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d8565b6001600160a01b0382166109e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d8565b6001600160a01b0383811660008181526035602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a528484610886565b90506000198114610aba5781811015610aad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d8565b610aba8484848403610922565b50505050565b6001600160a01b038316610b245760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d8565b6001600160a01b038216610b865760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d8565b6000806120206001600160a01b0316858585604051602001610baa9392919061140f565b60408051601f1981840301815290829052610bc491611433565b6000604051808303816000865af19150503d8060008114610c01576040519150601f19603f3d011682016040523d82523d6000602084013e610c06565b606091505b5091509150818015610c27575080806020019051810190610c27919061144f565b610c435760405162461bcd60e51b81526004016104d890611471565b836001600160a01b0316856001600160a01b03166000805160206114b583398151915285604051610c7691815260200190565b60405180910390a35050505050565b6001600160a01b038216610cdb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d8565b8060366000828254610ced9190611289565b9091555050604051600090819061202090610d109083908790879060200161140f565b60408051601f1981840301815290829052610d2a91611433565b6000604051808303816000865af19150503d8060008114610d67576040519150601f19603f3d011682016040523d82523d6000602084013e610d6c565b606091505b5091509150818015610d8d575080806020019051810190610d8d919061144f565b610da95760405162461bcd60e51b81526004016104d890611471565b6040518381526001600160a01b038516906000906000805160206114b5833981519152906020015b60405180910390a350505050565b603480546001600160a01b031916905561079f81610fac565b6033546001600160a01b031633146107265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b6001600160a01b038216610eb25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d8565b8060366000828254610ec491906114a1565b9091555050604051600090819061202090610ee79086908490879060200161140f565b60408051601f1981840301815290829052610f0191611433565b6000604051808303816000865af19150503d8060008114610f3e576040519150601f19603f3d011682016040523d82523d6000602084013e610f43565b606091505b5091509150818015610f64575080806020019051810190610f64919061144f565b610f805760405162461bcd60e51b81526004016104d890611471565b6040518381526000906001600160a01b038616906000805160206114b583398151915290602001610dd1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b83811015611019578181015183820152602001611001565b50506000910152565b6020815260008251806020840152611041816040850160208701610ffe565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461106c57600080fd5b919050565b6000806040838503121561108457600080fd5b61108d83611055565b946020939093013593505050565b6000806000606084860312156110b057600080fd5b6110b984611055565b92506110c760208501611055565b9150604084013590509250925092565b60008083601f8401126110e957600080fd5b50813567ffffffffffffffff81111561110157600080fd5b60208301915083602082850101111561111957600080fd5b9250929050565b600080600080600080600080600060e08a8c03121561113e57600080fd5b6111478a611055565b985061115560208b01611055565b975061116360408b01611055565b965060608a013567ffffffffffffffff8082111561118057600080fd5b61118c8d838e016110d7565b909850965060808c01359150808211156111a557600080fd5b506111b28c828d016110d7565b90955093505060a08a013560ff811681146111cc57600080fd5b8092505060c08a013590509295985092959850929598565b6000602082840312156111f657600080fd5b6111ff82611055565b9392505050565b6000806040838503121561121957600080fd5b61122283611055565b915061123060208401611055565b90509250929050565b600181811c9082168061124d57607f821691505b60208210810361126d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561044a5761044a611273565b6020808252602d908201527f4e617469766545524332303a204f6e6c7920707265646963617465206f72206f60408201526c1ddb995c8818d85b8818d85b1b609a1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561134957600081815260208120601f850160051c810160208610156113265750805b601f850160051c820191505b8181101561134557828155600101611332565b5050505b505050565b67ffffffffffffffff831115611366576113666112e9565b61137a836113748354611239565b836112ff565b6000601f8411600181146113ae57600085156113965750838201355b600019600387901b1c1916600186901b178355611408565b600083815260209020601f19861690835b828110156113df57868501358255602094850194600190920191016113bf565b50868210156113fc5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008251611445818460208701610ffe565b9190910192915050565b60006020828403121561146157600080fd5b815180151581146111ff57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561044a5761044a61127356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c841ea6b2ede0321e38158aa4ac46f255ea0caf34a5429d64b9287ce7df103b364736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var ChildERC20Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20","sourceName":"contracts/child/ChildERC20.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"invalidateNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611920806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806340c10f19116100ad578063a457c2d711610071578063a457c2d71461028b578063a9059cbb1461029e578063dd62ed3e146102b1578063e6198705146102c4578063f6d2ee86146102d557600080fd5b806340c10f191461021f57806370a082311461023257806395d89b411461025b5780639b77ef11146102635780639dc29fac1461027857600080fd5b80631f2d0065116100f45780631f2d00651461018c57806323b872dd146101b15780632d0335ab146101c4578063313ce567146101ed578063395093511461020c57600080fd5b806306fdde0314610126578063095ea7b3146101445780630c53c51c1461016757806318160ddd1461017a575b600080fd5b61012e6102e8565b60405161013b9190611395565b60405180910390f35b6101576101523660046113cb565b61037a565b604051901515815260200161013b565b61012e61017536600461144f565b61039e565b60a0545b60405190815260200161013b565b60d1546001600160a01b03165b6040516001600160a01b03909116815260200161013b565b6101576101bf3660046114c5565b610681565b61017e6101d2366004611501565b6001600160a01b031660009081526038602052604090205490565b60d154600160a01b900460ff1660405160ff909116815260200161013b565b61015761021a3660046113cb565b6106af565b61015761022d3660046113cb565b6106db565b61017e610240366004611501565b6001600160a01b03166000908152609e602052604090205490565b61012e61071b565b61027661027136600461151c565b61072a565b005b6101576102863660046113cb565b610751565b6101576102993660046113cb565b610788565b6101576102ac3660046113cb565b61080e565b61017e6102bf366004611535565b610826565b60d0546001600160a01b0316610199565b6102766102e3366004611568565b610851565b606060a180546102f7906115ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610323906115ec565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600080610385610ad1565b9050610392818585610ae0565b60019150505b92915050565b606060006103e187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0592505050565b90506001600160e01b031960003581169082160361046c5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084015b60405180910390fd5b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506104dd8982888888610c20565b6105335760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610463565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161058893929190611626565b60408051601f19818403018152908290526105a29161164c565b6000604051808303816000865af19150503d80600081146105df576040519150601f19603f3d011682016040523d82523d6000602084013e6105e4565b606091505b5091509150816106365760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610463565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161066b9493929190611668565b60405180910390a19a9950505050505050505050565b60008061068c610ad1565b9050610699858285610cfc565b6106a4858585610d76565b506001949350505050565b6000806106ba610ad1565b90506103928185856106cc8589610826565b6106d691906116b4565b610ae0565b60d0546000906001600160a01b031633146107085760405162461bcd60e51b8152600401610463906116d5565b6107128383610f0f565b50600192915050565b606060a280546102f7906115ec565b33600090815260386020526040812080548392906107499084906116b4565b909155505050565b60d0546000906001600160a01b0316331461077e5760405162461bcd60e51b8152600401610463906116d5565b6107128383610fbf565b600080610793610ad1565b905060006107a18286610826565b9050838110156108015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610463565b6106a48286868403610ae0565b600080610819610ad1565b9050610392818585610d76565b6001600160a01b039182166000908152609f6020908152604080832093909416825291909152205490565b606b54610100900460ff16158080156108715750606b54600160ff909116105b8061088b5750303b15801561088b5750606b5460ff166001145b6108ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610463565b606b805460ff19166001179055801561091157606b805461ff0019166101001790555b6001600160a01b0387161580159061092857508415155b801561093357508215155b61097f5760405162461bcd60e51b815260206004820152601e60248201527f4368696c6445524332303a204241445f494e495449414c495a4154494f4e00006044820152606401610463565b60d1805460ff8416600160a01b026001600160a81b03199091166001600160a01b038a161717905560d080546001600160a01b03191633179055604080516020601f8801819004810282018101909252868152610a2a91889088908190840183828082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506110de92505050565b610a8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b6020820152915061110f9050565b8015610ac857606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000610adb61117b565b905090565b6001600160a01b038316610b425760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610463565b6001600160a01b038216610ba35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610463565b6001600160a01b038381166000818152609f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008151600003610c1857506000919050565b506020015190565b6000806001610c36610c31886111d7565b611254565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610c84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cdb5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610463565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610d088484610826565b90506000198114610d705781811015610d635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610463565b610d708484848403610ae0565b50505050565b6001600160a01b038316610dda5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610463565b6001600160a01b038216610e3c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610463565b6001600160a01b0383166000908152609e602052604090205481811015610eb45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610463565b6001600160a01b038085166000818152609e602052604080822086860390559286168082529083902080548601905591516000805160206118cb83398151915290610f029086815260200190565b60405180910390a3610d70565b6001600160a01b038216610f655760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610463565b8060a06000828254610f7791906116b4565b90915550506001600160a01b0382166000818152609e60209081526040808320805486019055518481526000805160206118cb833981519152910160405180910390a35b5050565b6001600160a01b03821661101f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610463565b6001600160a01b0382166000908152609e6020526040902054818110156110935760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610463565b6001600160a01b0383166000818152609e60209081526040808320868603905560a080548790039055518581529192916000805160206118cb8339815191529101610bf8565b505050565b606b54610100900460ff166111055760405162461bcd60e51b815260040161046390611718565b610fbb8282611281565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61115d8184846112c1565b600055600280546001600160a01b0319163017905560055550505050565b60003033036111d157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111d49050565b50335b90565b60006040518060800160405280604381526020016118886043913980516020918201208351848301516040808701518051908601209051611237950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039861126161130a565b8360405161190160f01b8152600281019290925260228201526042902090565b606b54610100900460ff166112a85760405162461bcd60e51b815260040161046390611718565b60a16112b483826117c7565b5060a26110d982826117c7565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611328575060015446145b15611334575060005490565b610adb6005546003546004546112c1565b60005b83811015611360578181015183820152602001611348565b50506000910152565b60008151808452611381816020860160208601611345565b601f01601f19169290920160200192915050565b6020815260006113a86020830184611369565b9392505050565b80356001600160a01b03811681146113c657600080fd5b919050565b600080604083850312156113de57600080fd5b6113e7836113af565b946020939093013593505050565b60008083601f84011261140757600080fd5b50813567ffffffffffffffff81111561141f57600080fd5b60208301915083602082850101111561143757600080fd5b9250929050565b803560ff811681146113c657600080fd5b60008060008060008060a0878903121561146857600080fd5b611471876113af565b9550602087013567ffffffffffffffff81111561148d57600080fd5b61149989828a016113f5565b90965094505060408701359250606087013591506114b96080880161143e565b90509295509295509295565b6000806000606084860312156114da57600080fd5b6114e3846113af565b92506114f1602085016113af565b9150604084013590509250925092565b60006020828403121561151357600080fd5b6113a8826113af565b60006020828403121561152e57600080fd5b5035919050565b6000806040838503121561154857600080fd5b611551836113af565b915061155f602084016113af565b90509250929050565b6000806000806000806080878903121561158157600080fd5b61158a876113af565b9550602087013567ffffffffffffffff808211156115a757600080fd5b6115b38a838b016113f5565b909750955060408901359150808211156115cc57600080fd5b506115d989828a016113f5565b90945092506114b990506060880161143e565b600181811c9082168061160057607f821691505b60208210810361162057634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161165e818460208701611345565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b8082018082111561039857634e487b7160e01b600052601160045260246000fd5b60208082526023908201527f4368696c6445524332303a204f6e6c79207072656469636174652063616e2063604082015262185b1b60ea1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156110d957600081815260208120601f850160051c810160208610156117a05750805b601f850160051c820191505b818110156117bf578281556001016117ac565b505050505050565b815167ffffffffffffffff8111156117e1576117e1611763565b6117f5816117ef84546115ec565b84611779565b602080601f83116001811461182a57600084156118125750858301515b600019600386901b1c1916600185901b1785556117bf565b600085815260208120601f198616915b828110156118595788860151825594840194600190910190840161183a565b50858210156118775787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b322ab3a17e671324178982233e8fdd83f1d7487c05f56ee80ebf7cb64b9b2c964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c806340c10f19116100ad578063a457c2d711610071578063a457c2d71461028b578063a9059cbb1461029e578063dd62ed3e146102b1578063e6198705146102c4578063f6d2ee86146102d557600080fd5b806340c10f191461021f57806370a082311461023257806395d89b411461025b5780639b77ef11146102635780639dc29fac1461027857600080fd5b80631f2d0065116100f45780631f2d00651461018c57806323b872dd146101b15780632d0335ab146101c4578063313ce567146101ed578063395093511461020c57600080fd5b806306fdde0314610126578063095ea7b3146101445780630c53c51c1461016757806318160ddd1461017a575b600080fd5b61012e6102e8565b60405161013b9190611395565b60405180910390f35b6101576101523660046113cb565b61037a565b604051901515815260200161013b565b61012e61017536600461144f565b61039e565b60a0545b60405190815260200161013b565b60d1546001600160a01b03165b6040516001600160a01b03909116815260200161013b565b6101576101bf3660046114c5565b610681565b61017e6101d2366004611501565b6001600160a01b031660009081526038602052604090205490565b60d154600160a01b900460ff1660405160ff909116815260200161013b565b61015761021a3660046113cb565b6106af565b61015761022d3660046113cb565b6106db565b61017e610240366004611501565b6001600160a01b03166000908152609e602052604090205490565b61012e61071b565b61027661027136600461151c565b61072a565b005b6101576102863660046113cb565b610751565b6101576102993660046113cb565b610788565b6101576102ac3660046113cb565b61080e565b61017e6102bf366004611535565b610826565b60d0546001600160a01b0316610199565b6102766102e3366004611568565b610851565b606060a180546102f7906115ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610323906115ec565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600080610385610ad1565b9050610392818585610ae0565b60019150505b92915050565b606060006103e187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0592505050565b90506001600160e01b031960003581169082160361046c5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084015b60405180910390fd5b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506104dd8982888888610c20565b6105335760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610463565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161058893929190611626565b60408051601f19818403018152908290526105a29161164c565b6000604051808303816000865af19150503d80600081146105df576040519150601f19603f3d011682016040523d82523d6000602084013e6105e4565b606091505b5091509150816106365760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610463565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161066b9493929190611668565b60405180910390a19a9950505050505050505050565b60008061068c610ad1565b9050610699858285610cfc565b6106a4858585610d76565b506001949350505050565b6000806106ba610ad1565b90506103928185856106cc8589610826565b6106d691906116b4565b610ae0565b60d0546000906001600160a01b031633146107085760405162461bcd60e51b8152600401610463906116d5565b6107128383610f0f565b50600192915050565b606060a280546102f7906115ec565b33600090815260386020526040812080548392906107499084906116b4565b909155505050565b60d0546000906001600160a01b0316331461077e5760405162461bcd60e51b8152600401610463906116d5565b6107128383610fbf565b600080610793610ad1565b905060006107a18286610826565b9050838110156108015760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610463565b6106a48286868403610ae0565b600080610819610ad1565b9050610392818585610d76565b6001600160a01b039182166000908152609f6020908152604080832093909416825291909152205490565b606b54610100900460ff16158080156108715750606b54600160ff909116105b8061088b5750303b15801561088b5750606b5460ff166001145b6108ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610463565b606b805460ff19166001179055801561091157606b805461ff0019166101001790555b6001600160a01b0387161580159061092857508415155b801561093357508215155b61097f5760405162461bcd60e51b815260206004820152601e60248201527f4368696c6445524332303a204241445f494e495449414c495a4154494f4e00006044820152606401610463565b60d1805460ff8416600160a01b026001600160a81b03199091166001600160a01b038a161717905560d080546001600160a01b03191633179055604080516020601f8801819004810282018101909252868152610a2a91889088908190840183828082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506110de92505050565b610a8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b6020820152915061110f9050565b8015610ac857606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000610adb61117b565b905090565b6001600160a01b038316610b425760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610463565b6001600160a01b038216610ba35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610463565b6001600160a01b038381166000818152609f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008151600003610c1857506000919050565b506020015190565b6000806001610c36610c31886111d7565b611254565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610c84573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cdb5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610463565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610d088484610826565b90506000198114610d705781811015610d635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610463565b610d708484848403610ae0565b50505050565b6001600160a01b038316610dda5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610463565b6001600160a01b038216610e3c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610463565b6001600160a01b0383166000908152609e602052604090205481811015610eb45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610463565b6001600160a01b038085166000818152609e602052604080822086860390559286168082529083902080548601905591516000805160206118cb83398151915290610f029086815260200190565b60405180910390a3610d70565b6001600160a01b038216610f655760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610463565b8060a06000828254610f7791906116b4565b90915550506001600160a01b0382166000818152609e60209081526040808320805486019055518481526000805160206118cb833981519152910160405180910390a35b5050565b6001600160a01b03821661101f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610463565b6001600160a01b0382166000908152609e6020526040902054818110156110935760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610463565b6001600160a01b0383166000818152609e60209081526040808320868603905560a080548790039055518581529192916000805160206118cb8339815191529101610bf8565b505050565b606b54610100900460ff166111055760405162461bcd60e51b815260040161046390611718565b610fbb8282611281565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61115d8184846112c1565b600055600280546001600160a01b0319163017905560055550505050565b60003033036111d157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111d49050565b50335b90565b60006040518060800160405280604381526020016118886043913980516020918201208351848301516040808701518051908601209051611237950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039861126161130a565b8360405161190160f01b8152600281019290925260228201526042902090565b606b54610100900460ff166112a85760405162461bcd60e51b815260040161046390611718565b60a16112b483826117c7565b5060a26110d982826117c7565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611328575060015446145b15611334575060005490565b610adb6005546003546004546112c1565b60005b83811015611360578181015183820152602001611348565b50506000910152565b60008151808452611381816020860160208601611345565b601f01601f19169290920160200192915050565b6020815260006113a86020830184611369565b9392505050565b80356001600160a01b03811681146113c657600080fd5b919050565b600080604083850312156113de57600080fd5b6113e7836113af565b946020939093013593505050565b60008083601f84011261140757600080fd5b50813567ffffffffffffffff81111561141f57600080fd5b60208301915083602082850101111561143757600080fd5b9250929050565b803560ff811681146113c657600080fd5b60008060008060008060a0878903121561146857600080fd5b611471876113af565b9550602087013567ffffffffffffffff81111561148d57600080fd5b61149989828a016113f5565b90965094505060408701359250606087013591506114b96080880161143e565b90509295509295509295565b6000806000606084860312156114da57600080fd5b6114e3846113af565b92506114f1602085016113af565b9150604084013590509250925092565b60006020828403121561151357600080fd5b6113a8826113af565b60006020828403121561152e57600080fd5b5035919050565b6000806040838503121561154857600080fd5b611551836113af565b915061155f602084016113af565b90509250929050565b6000806000806000806080878903121561158157600080fd5b61158a876113af565b9550602087013567ffffffffffffffff808211156115a757600080fd5b6115b38a838b016113f5565b909750955060408901359150808211156115cc57600080fd5b506115d989828a016113f5565b90945092506114b990506060880161143e565b600181811c9082168061160057607f821691505b60208210810361162057634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161165e818460208701611345565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b8082018082111561039857634e487b7160e01b600052601160045260246000fd5b60208082526023908201527f4368696c6445524332303a204f6e6c79207072656469636174652063616e2063604082015262185b1b60ea1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156110d957600081815260208120601f850160051c810160208610156117a05750805b601f850160051c820191505b818110156117bf578281556001016117ac565b505050505050565b815167ffffffffffffffff8111156117e1576117e1611763565b6117f5816117ef84546115ec565b84611779565b602080601f83116001811461182a57600084156118125750858301515b600019600386901b1c1916600185901b1785556117bf565b600085815260208120601f198616915b828110156118595788860151825594840194600190910190840161183a565b50858210156118775787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b322ab3a17e671324178982233e8fdd83f1d7487c05f56ee80ebf7cb64b9b2c964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC20PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20Predicate","sourceName":"contracts/child/ChildERC20Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611787806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d61018836600461127c565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f6102083660046112ed565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611311565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c1366004611352565b610474565b61018d6102d43660046113db565b610865565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610874565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836109c4565b505050565b6104aa604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b815250610d3a565b6034546001600160a01b031633146105155760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b61054b6040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b815250610d3a565b6035546001600160a01b038481169116146105b95760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b6105ef604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b815250610d3a565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161061e602060008486611407565b61062791611431565b0361071e576106626040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b815250610d3a565b610698604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b815250610d3a565b6106ad6106a88260208186611407565b610d80565b6106e36040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b815250610d3a565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b815250610d3a565b61085f565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61074d602060008486611407565b61075691611431565b036107d15761079160405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b815250610d3a565b61079b828261102b565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b815250610d3a565b6108086040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b815250610d3a565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6108708233836109c4565b5050565b6001600160a01b0385161580159061089457506001600160a01b03841615155b80156108a857506001600160a01b03831615155b80156108bc57506001600160a01b03821615155b6109185760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156109bd576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b600003610a285760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c919061144f565b6001600160a01b03818116600090815260376020526040902054919250858116911614610acb5760405162461bcd60e51b81526004016103409061146c565b6001600160a01b038116610ae157610ae16114af565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d919061144f565b6001600160a01b031614610b6357610b636114af565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610b9190339086906004016114c5565b6020604051808303816000875af1158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906114de565b610c205760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610cab9391169160c401611546565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610d2c9291906114c5565b60405180910390a450505050565b610d7d81604051602401610d4e9190611572565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526111a0565b50565b6000808080610d9185870187611585565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610dd45760405162461bcd60e51b81526004016103409061146c565b806001600160a01b03163b600003610dee57610dee6114af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e52919061144f565b9050856001600160a01b0316816001600160a01b031614610e7557610e756114af565b6001600160a01b038116610e8b57610e8b6114af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef7919061144f565b6001600160a01b031614610f0d57610f0d6114af565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f3b90879087906004016114c5565b6020604051808303816000875af1158015610f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e91906114de565b610fca5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516110199291906114c5565b60405180910390a45050505050505050565b600080808061103c85870187611679565b92975090955093509150506001600160a01b03841661105d5761105d6114af565b6001600160a01b038481166000908152603760205260409020541615611085576110856114af565b6036546040516bffffffffffffffffffffffff19606087901b1660208201526000916110d5916001600160a01b0390911690603401604051602081830303815290604052805190602001206111a9565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee869061112d908890889088908890600401611706565b600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b610d7d81611246565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166112405760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b0381168114610d7d57600080fd5b600080600080600060a0868803121561129457600080fd5b853561129f81611267565b945060208601356112af81611267565b935060408601356112bf81611267565b925060608601356112cf81611267565b915060808601356112df81611267565b809150509295509295909350565b6000602082840312156112ff57600080fd5b813561130a81611267565b9392505050565b60008060006060848603121561132657600080fd5b833561133181611267565b9250602084013561134181611267565b929592945050506040919091013590565b6000806000806060858703121561136857600080fd5b84359350602085013561137a81611267565b9250604085013567ffffffffffffffff8082111561139757600080fd5b818701915087601f8301126113ab57600080fd5b8135818111156113ba57600080fd5b8860208285010111156113cc57600080fd5b95989497505060200194505050565b600080604083850312156113ee57600080fd5b82356113f981611267565b946020939093013593505050565b6000808585111561141757600080fd5b8386111561142457600080fd5b5050820193919092039150565b8035602083101561124057600019602084900360031b1b1692915050565b60006020828403121561146157600080fd5b815161130a81611267565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156114f057600080fd5b8151801515811461130a57600080fd5b6000815180845260005b818110156115265760208185018101518683018201520161150a565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061156a90830184611500565b949350505050565b60208152600061130a6020830184611500565b6000806000806080858703121561159b57600080fd5b84356115a681611267565b935060208501356115b681611267565b925060408501356115c681611267565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126115fd57600080fd5b813567ffffffffffffffff80821115611618576116186115d6565b604051601f8301601f19908116603f01168101908282118183101715611640576116406115d6565b8160405283815286602085880101111561165957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561169157600080fd5b8535945060208601356116a381611267565b9350604086013567ffffffffffffffff808211156116c057600080fd5b6116cc89838a016115ec565b945060608801359150808211156116e257600080fd5b506116ef888289016115ec565b925050608086013560ff811681146112df57600080fd5b6001600160a01b038516815260806020820181905260009061172a90830186611500565b828103604084015261173c8186611500565b91505060ff831660608301529594505050505056fea2646970667358221220ab62d536b030923404efb7e5aabfc0a2fe40cb918bc51c862ac28b92f822139164736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d61018836600461127c565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f6102083660046112ed565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611311565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c1366004611352565b610474565b61018d6102d43660046113db565b610865565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610874565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836109c4565b505050565b6104aa604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b815250610d3a565b6034546001600160a01b031633146105155760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b61054b6040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b815250610d3a565b6035546001600160a01b038481169116146105b95760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b6105ef604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b815250610d3a565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161061e602060008486611407565b61062791611431565b0361071e576106626040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b815250610d3a565b610698604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b815250610d3a565b6106ad6106a88260208186611407565b610d80565b6106e36040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b815250610d3a565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b815250610d3a565b61085f565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61074d602060008486611407565b61075691611431565b036107d15761079160405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b815250610d3a565b61079b828261102b565b610719604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b815250610d3a565b6108086040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b815250610d3a565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6108708233836109c4565b5050565b6001600160a01b0385161580159061089457506001600160a01b03841615155b80156108a857506001600160a01b03831615155b80156108bc57506001600160a01b03821615155b6109185760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156109bd576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b600003610a285760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c919061144f565b6001600160a01b03818116600090815260376020526040902054919250858116911614610acb5760405162461bcd60e51b81526004016103409061146c565b6001600160a01b038116610ae157610ae16114af565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d919061144f565b6001600160a01b031614610b6357610b636114af565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610b9190339086906004016114c5565b6020604051808303816000875af1158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd491906114de565b610c205760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610cab9391169160c401611546565b600060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610d2c9291906114c5565b60405180910390a450505050565b610d7d81604051602401610d4e9190611572565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526111a0565b50565b6000808080610d9185870187611585565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610dd45760405162461bcd60e51b81526004016103409061146c565b806001600160a01b03163b600003610dee57610dee6114af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e52919061144f565b9050856001600160a01b0316816001600160a01b031614610e7557610e756114af565b6001600160a01b038116610e8b57610e8b6114af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef7919061144f565b6001600160a01b031614610f0d57610f0d6114af565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f3b90879087906004016114c5565b6020604051808303816000875af1158015610f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e91906114de565b610fca5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516110199291906114c5565b60405180910390a45050505050505050565b600080808061103c85870187611679565b92975090955093509150506001600160a01b03841661105d5761105d6114af565b6001600160a01b038481166000908152603760205260409020541615611085576110856114af565b6036546040516bffffffffffffffffffffffff19606087901b1660208201526000916110d5916001600160a01b0390911690603401604051602081830303815290604052805190602001206111a9565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee869061112d908890889088908890600401611706565b600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b610d7d81611246565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166112405760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b0381168114610d7d57600080fd5b600080600080600060a0868803121561129457600080fd5b853561129f81611267565b945060208601356112af81611267565b935060408601356112bf81611267565b925060608601356112cf81611267565b915060808601356112df81611267565b809150509295509295909350565b6000602082840312156112ff57600080fd5b813561130a81611267565b9392505050565b60008060006060848603121561132657600080fd5b833561133181611267565b9250602084013561134181611267565b929592945050506040919091013590565b6000806000806060858703121561136857600080fd5b84359350602085013561137a81611267565b9250604085013567ffffffffffffffff8082111561139757600080fd5b818701915087601f8301126113ab57600080fd5b8135818111156113ba57600080fd5b8860208285010111156113cc57600080fd5b95989497505060200194505050565b600080604083850312156113ee57600080fd5b82356113f981611267565b946020939093013593505050565b6000808585111561141757600080fd5b8386111561142457600080fd5b5050820193919092039150565b8035602083101561124057600019602084900360031b1b1692915050565b60006020828403121561146157600080fd5b815161130a81611267565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156114f057600080fd5b8151801515811461130a57600080fd5b6000815180845260005b818110156115265760208185018101518683018201520161150a565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038316815260406020820181905260009061156a90830184611500565b949350505050565b60208152600061130a6020830184611500565b6000806000806080858703121561159b57600080fd5b84356115a681611267565b935060208501356115b681611267565b925060408501356115c681611267565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126115fd57600080fd5b813567ffffffffffffffff80821115611618576116186115d6565b604051601f8301601f19908116603f01168101908282118183101715611640576116406115d6565b8160405283815286602085880101111561165957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561169157600080fd5b8535945060208601356116a381611267565b9350604086013567ffffffffffffffff808211156116c057600080fd5b6116cc89838a016115ec565b945060608801359150808211156116e257600080fd5b506116ef888289016115ec565b925050608086013560ff811681146112df57600080fd5b6001600160a01b038516815260806020820181905260009061172a90830186611500565b828103604084015261173c8186611500565b91505060ff831660608301529594505050505056fea2646970667358221220ab62d536b030923404efb7e5aabfc0a2fe40cb918bc51c862ac28b92f822139164736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC20PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20PredicateAccessList","sourceName":"contracts/child/ChildERC20PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611f2b806100206000396000f3fe608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e03660046118a0565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e561022836600461191f565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a76102833660046119c8565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b3660046119ec565b61068c565b6101e561031e366004611a09565b6106db565b6101e56103313660046119ec565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e5610385366004611a4a565b61073a565b6101e56103983660046119c8565b610b2b565b6101e56103ab366004611ad3565b610b9c565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611aff565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610bb3565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611aff565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610bb3565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610d04565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610d1d565b6106106000610d04565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610d04565b50565b610694610d1d565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610d77565b6106ee838383610d7f565b505050565b6106fb610d1d565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b610770604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b8152506110f6565b60fd546001600160a01b031633146107db5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b6108116040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b8152506110f6565b60fe546001600160a01b0384811691161461087f5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b6108b5604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b8152506110f6565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108e4602060008486611b71565b6108ed91611b9b565b036109e4576109286040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b8152506110f6565b61095e604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b8152506110f6565b61097361096e8260208186611b71565b611139565b6109a96040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b8152506110f6565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b8152506110f6565b610b25565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610a13602060008486611b71565b610a1c91611b9b565b03610a9757610a5760405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b8152506110f6565b610a6182826113e5565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b8152506110f6565b610ace6040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b8152506110f6565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610b33610d1d565b606580546001600160a01b0383166001600160a01b03199091168117909155610b646033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610ba4610d77565b610baf823383610d7f565b5050565b6001600160a01b03851615801590610bd357506001600160a01b03841615155b8015610be757506001600160a01b03831615155b8015610bfb57506001600160a01b03821615155b610c575760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610cfd576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b03191690556106898161155c565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b6106106115ae565b826001600160a01b03163b600003610de35760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e479190611bb9565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610e875760405162461bcd60e51b81526004016103fe90611bd6565b6001600160a01b038116610e9d57610e9d611c19565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f099190611bb9565b6001600160a01b031614610f1f57610f1f611c19565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610f4d9033908690600401611c2f565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190611c48565b610fdc5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110679391169160c401611cb5565b600060405180830381600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb2733866040516110e8929190611c2f565b60405180910390a450505050565b6106898160405160240161110a9190611ce1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526117c4565b600080808061114a85870187611cf4565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061118e5760405162461bcd60e51b81526004016103fe90611bd6565b806001600160a01b03163b6000036111a8576111a8611c19565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190611bb9565b9050856001600160a01b0316816001600160a01b03161461122f5761122f611c19565b6001600160a01b03811661124557611245611c19565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b19190611bb9565b6001600160a01b0316146112c7576112c7611c19565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112f59087908790600401611c2f565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113389190611c48565b6113845760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516113d3929190611c2f565b60405180910390a45050505050505050565b60008080806113f685870187611de8565b92975090955093509150506001600160a01b03841661141757611417611c19565b6001600160a01b0384811660009081526101006020526040902054161561144057611440611c19565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611490916001600160a01b0390911690603401604051602081830303815290604052805190602001206117cd565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee86906114e9908890889088908890600401611e75565b600060405180830381600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116b957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916116109190611ec0565b6000604051808303818686fa925050503d806000811461164c576040519150601f19603f3d011682016040523d82523d6000602084013e611651565b606091505b509150915081801561167657506000818060200190518101906116749190611edc565b115b6116b65760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916117209190611ec0565b6000604051808303818686fa925050503d806000811461175c576040519150601f19603f3d011682016040523d82523d6000602084013e611761565b606091505b50915091508180156117875750808060200190518101906117829190611edc565b600114155b610baf5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6106898161186a565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118645760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461068957600080fd5b600080600080600060a086880312156118b857600080fd5b85356118c38161188b565b945060208601356118d38161188b565b935060408601356118e38161188b565b925060608601356118f38161188b565b915060808601356119038161188b565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b03121561193c57600080fd5b88356119478161188b565b975060208901356119578161188b565b965060408901356119678161188b565b955060608901356119778161188b565b945060808901356119878161188b565b935060a089013561199781611911565b925060c08901356119a781611911565b915060e08901356119b78161188b565b809150509295985092959890939650565b6000602082840312156119da57600080fd5b81356119e58161188b565b9392505050565b6000602082840312156119fe57600080fd5b81356119e581611911565b600080600060608486031215611a1e57600080fd5b8335611a298161188b565b92506020840135611a398161188b565b929592945050506040919091013590565b60008060008060608587031215611a6057600080fd5b843593506020850135611a728161188b565b9250604085013567ffffffffffffffff80821115611a8f57600080fd5b818701915087601f830112611aa357600080fd5b813581811115611ab257600080fd5b886020828501011115611ac457600080fd5b95989497505060200194505050565b60008060408385031215611ae657600080fd5b8235611af18161188b565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611b8157600080fd5b83861115611b8e57600080fd5b5050820193919092039150565b8035602083101561186457600019602084900360031b1b1692915050565b600060208284031215611bcb57600080fd5b81516119e58161188b565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060208284031215611c5a57600080fd5b81516119e581611911565b60005b83811015611c80578181015183820152602001611c68565b50506000910152565b60008151808452611ca1816020860160208601611c65565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611cd990830184611c89565b949350505050565b6020815260006119e56020830184611c89565b60008060008060808587031215611d0a57600080fd5b8435611d158161188b565b93506020850135611d258161188b565b92506040850135611d358161188b565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d6c57600080fd5b813567ffffffffffffffff80821115611d8757611d87611d45565b604051601f8301601f19908116603f01168101908282118183101715611daf57611daf611d45565b81604052838152866020858801011115611dc857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611e0057600080fd5b853594506020860135611e128161188b565b9350604086013567ffffffffffffffff80821115611e2f57600080fd5b611e3b89838a01611d5b565b94506060880135915080821115611e5157600080fd5b50611e5e88828901611d5b565b925050608086013560ff8116811461190357600080fd5b6001600160a01b0385168152608060208201819052600090611e9990830186611c89565b8281036040840152611eab8186611c89565b91505060ff8316606083015295945050505050565b60008251611ed2818460208701611c65565b9190910192915050565b600060208284031215611eee57600080fd5b505191905056fea26469706673582212205618dec3166c9a39a417717e4fa60b32a5b16648711fc3252ae9981457c3d6e864736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e03660046118a0565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e561022836600461191f565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a76102833660046119c8565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b3660046119ec565b61068c565b6101e561031e366004611a09565b6106db565b6101e56103313660046119ec565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e5610385366004611a4a565b61073a565b6101e56103983660046119c8565b610b2b565b6101e56103ab366004611ad3565b610b9c565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611aff565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610bb3565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611aff565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611b23565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610bb3565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610d04565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610d1d565b6106106000610d04565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610d04565b50565b610694610d1d565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610d77565b6106ee838383610d7f565b505050565b6106fb610d1d565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b610770604051806040016040528060158152602001744368696c644552433230507265646963617465203160581b8152506110f6565b60fd546001600160a01b031633146107db5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b6108116040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901960591b8152506110f6565b60fe546001600160a01b0384811691161461087f5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b6108b5604051806040016040528060158152602001744368696c644552433230507265646963617465203360581b8152506110f6565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108e4602060008486611b71565b6108ed91611b9b565b036109e4576109286040518060400160405280601581526020017410da1a5b19115490cc8c141c99591a58d85d19480d605a1b8152506110f6565b61095e604051806040016040528060158152602001744368696c644552433230507265646963617465203560581b8152506110f6565b61097361096e8260208186611b71565b611139565b6109a96040518060400160405280601581526020017421b434b63222a9219918283932b234b1b0ba32901b60591b8152506110f6565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203760581b8152506110f6565b610b25565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610a13602060008486611b71565b610a1c91611b9b565b03610a9757610a5760405180604001604052806015815260200174086d0d2d8c88aa4866460a0e4cac8d2c6c2e8ca407605b1b8152506110f6565b610a6182826113e5565b6109df604051806040016040528060158152602001744368696c644552433230507265646963617465203960581b8152506110f6565b610ace6040518060400160405280601681526020017504368696c6445524332305072656469636174652031360541b8152506110f6565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610b33610d1d565b606580546001600160a01b0383166001600160a01b03199091168117909155610b646033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610ba4610d77565b610baf823383610d7f565b5050565b6001600160a01b03851615801590610bd357506001600160a01b03841615155b8015610be757506001600160a01b03831615155b8015610bfb57506001600160a01b03821615155b610c575760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610cfd576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b03191690556106898161155c565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b6106106115ae565b826001600160a01b03163b600003610de35760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e479190611bb9565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610e875760405162461bcd60e51b81526004016103fe90611bd6565b6001600160a01b038116610e9d57610e9d611c19565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f099190611bb9565b6001600160a01b031614610f1f57610f1f611c19565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610f4d9033908690600401611c2f565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190611c48565b610fdc5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110679391169160c401611cb5565b600060405180830381600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb2733866040516110e8929190611c2f565b60405180910390a450505050565b6106898160405160240161110a9190611ce1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526117c4565b600080808061114a85870187611cf4565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061118e5760405162461bcd60e51b81526004016103fe90611bd6565b806001600160a01b03163b6000036111a8576111a8611c19565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190611bb9565b9050856001600160a01b0316816001600160a01b03161461122f5761122f611c19565b6001600160a01b03811661124557611245611c19565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b19190611bb9565b6001600160a01b0316146112c7576112c7611c19565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112f59087908790600401611c2f565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113389190611c48565b6113845760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516113d3929190611c2f565b60405180910390a45050505050505050565b60008080806113f685870187611de8565b92975090955093509150506001600160a01b03841661141757611417611c19565b6001600160a01b0384811660009081526101006020526040902054161561144057611440611c19565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611490916001600160a01b0390911690603401604051602081830303815290604052805190602001206117cd565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee86906114e9908890889088908890600401611e75565b600060405180830381600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116b957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916116109190611ec0565b6000604051808303818686fa925050503d806000811461164c576040519150601f19603f3d011682016040523d82523d6000602084013e611651565b606091505b509150915081801561167657506000818060200190518101906116749190611edc565b115b6116b65760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916117209190611ec0565b6000604051808303818686fa925050503d806000811461175c576040519150601f19603f3d011682016040523d82523d6000602084013e611761565b606091505b50915091508180156117875750808060200190518101906117829190611edc565b600114155b610baf5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6106898161186a565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118645760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461068957600080fd5b600080600080600060a086880312156118b857600080fd5b85356118c38161188b565b945060208601356118d38161188b565b935060408601356118e38161188b565b925060608601356118f38161188b565b915060808601356119038161188b565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b03121561193c57600080fd5b88356119478161188b565b975060208901356119578161188b565b965060408901356119678161188b565b955060608901356119778161188b565b945060808901356119878161188b565b935060a089013561199781611911565b925060c08901356119a781611911565b915060e08901356119b78161188b565b809150509295985092959890939650565b6000602082840312156119da57600080fd5b81356119e58161188b565b9392505050565b6000602082840312156119fe57600080fd5b81356119e581611911565b600080600060608486031215611a1e57600080fd5b8335611a298161188b565b92506020840135611a398161188b565b929592945050506040919091013590565b60008060008060608587031215611a6057600080fd5b843593506020850135611a728161188b565b9250604085013567ffffffffffffffff80821115611a8f57600080fd5b818701915087601f830112611aa357600080fd5b813581811115611ab257600080fd5b886020828501011115611ac457600080fd5b95989497505060200194505050565b60008060408385031215611ae657600080fd5b8235611af18161188b565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611b8157600080fd5b83861115611b8e57600080fd5b5050820193919092039150565b8035602083101561186457600019602084900360031b1b1692915050565b600060208284031215611bcb57600080fd5b81516119e58161188b565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600060208284031215611c5a57600080fd5b81516119e581611911565b60005b83811015611c80578181015183820152602001611c68565b50506000910152565b60008151808452611ca1816020860160208601611c65565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611cd990830184611c89565b949350505050565b6020815260006119e56020830184611c89565b60008060008060808587031215611d0a57600080fd5b8435611d158161188b565b93506020850135611d258161188b565b92506040850135611d358161188b565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d6c57600080fd5b813567ffffffffffffffff80821115611d8757611d87611d45565b604051601f8301601f19908116603f01168101908282118183101715611daf57611daf611d45565b81604052838152866020858801011115611dc857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611e0057600080fd5b853594506020860135611e128161188b565b9350604086013567ffffffffffffffff80821115611e2f57600080fd5b611e3b89838a01611d5b565b94506060880135915080821115611e5157600080fd5b50611e5e88828901611d5b565b925050608086013560ff8116811461190357600080fd5b6001600160a01b0385168152608060208201819052600090611e9990830186611c89565b8281036040840152611eab8186611c89565b91505060ff8316606083015295945050505050565b60008251611ed2818460208701611c65565b9190910192915050565b600060208284031215611eee57600080fd5b505191905056fea26469706673582212205618dec3166c9a39a417717e4fa60b32a5b16648711fc3252ae9981457c3d6e864736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC20PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20Predicate","sourceName":"contracts/child/ChildERC20Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506114ea806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d610188366004610ff2565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f610208366004611063565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611087565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c13660046110c8565b610474565b61018d6102d4366004611151565b610648565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610657565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836107a7565b505050565b6034546001600160a01b031633146104df5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b6035546001600160a01b0384811691161461054d5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161057c60206000848661117d565b610585916111a7565b036105a45761059f61059a826020818661117d565b610b1d565b610642565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6105d360206000848661117d565b6105dc916111a7565b036105eb5761059f8282610dc8565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6106538233836107a7565b5050565b6001600160a01b0385161580159061067757506001600160a01b03841615155b801561068b57506001600160a01b03831615155b801561069f57506001600160a01b03821615155b6106fb5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156107a0576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b60000361080b5760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f91906111c5565b6001600160a01b038181166000908152603760205260409020549192508581169116146108ae5760405162461bcd60e51b8152600401610340906111e2565b6001600160a01b0381166108c4576108c4611225565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906111c5565b6001600160a01b03161461094657610946611225565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610974903390869060040161123b565b6020604051808303816000875af1158015610993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b79190611254565b610a035760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610a8e9391169160c4016112bc565b600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610b0f92919061123b565b60405180910390a450505050565b6000808080610b2e858701876112e8565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610b715760405162461bcd60e51b8152600401610340906111e2565b806001600160a01b03163b600003610b8b57610b8b611225565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef91906111c5565b9050856001600160a01b0316816001600160a01b031614610c1257610c12611225565b6001600160a01b038116610c2857610c28611225565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9491906111c5565b6001600160a01b031614610caa57610caa611225565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610cd8908790879060040161123b565b6020604051808303816000875af1158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190611254565b610d675760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd8887604051610db692919061123b565b60405180910390a45050505050505050565b6000808080610dd9858701876113dc565b92975090955093509150506001600160a01b038416610dfa57610dfa611225565b6001600160a01b038481166000908152603760205260409020541615610e2257610e22611225565b6036546040516bffffffffffffffffffffffff19606087901b166020820152600091610e72916001600160a01b039091169060340160405160208183030381529060405280519060200120610f3d565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690610eca908890889088908890600401611469565b600060405180830381600087803b158015610ee457600080fd5b505af1158015610ef8573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116610fd45760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b6001600160a01b0381168114610fef57600080fd5b50565b600080600080600060a0868803121561100a57600080fd5b853561101581610fda565b9450602086013561102581610fda565b9350604086013561103581610fda565b9250606086013561104581610fda565b9150608086013561105581610fda565b809150509295509295909350565b60006020828403121561107557600080fd5b813561108081610fda565b9392505050565b60008060006060848603121561109c57600080fd5b83356110a781610fda565b925060208401356110b781610fda565b929592945050506040919091013590565b600080600080606085870312156110de57600080fd5b8435935060208501356110f081610fda565b9250604085013567ffffffffffffffff8082111561110d57600080fd5b818701915087601f83011261112157600080fd5b81358181111561113057600080fd5b88602082850101111561114257600080fd5b95989497505060200194505050565b6000806040838503121561116457600080fd5b823561116f81610fda565b946020939093013593505050565b6000808585111561118d57600080fd5b8386111561119a57600080fd5b5050820193919092039150565b80356020831015610fd457600019602084900360031b1b1692915050565b6000602082840312156111d757600080fd5b815161108081610fda565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60006020828403121561126657600080fd5b8151801515811461108057600080fd5b6000815180845260005b8181101561129c57602081850181015186830182015201611280565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190526000906112e090830184611276565b949350505050565b600080600080608085870312156112fe57600080fd5b843561130981610fda565b9350602085013561131981610fda565b9250604085013561132981610fda565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261136057600080fd5b813567ffffffffffffffff8082111561137b5761137b611339565b604051601f8301601f19908116603f011681019082821181831017156113a3576113a3611339565b816040528381528660208588010111156113bc57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156113f457600080fd5b85359450602086013561140681610fda565b9350604086013567ffffffffffffffff8082111561142357600080fd5b61142f89838a0161134f565b9450606088013591508082111561144557600080fd5b506114528882890161134f565b925050608086013560ff8116811461105557600080fd5b6001600160a01b038516815260806020820181905260009061148d90830186611276565b828103604084015261149f8186611276565b91505060ff831660608301529594505050505056fea2646970667358221220e0f44ad7883c5cd2dbd85a60832f6c9874795bf975cefd366724cc91bbc22dcd64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637efab4f5116100b8578063c3b35a7e1161007c578063c3b35a7e14610270578063d41f177114610283578063e0563ab1146102aa578063eeb49945146102b3578063f3fef3a3146102c6578063f6451255146102d957600080fd5b80637efab4f5146101fa578063947287cf1461022357806397e5230d1461022c578063b176806514610236578063b68ad1e41461025d57600080fd5b80633b878c22116100ff5780633b878c22146101ab57806351351d53146101b457806355b01e4d146101c25780635ea5df79146101d057806371cf93b7146101e757600080fd5b806305dc2e8f1461013c57806307b3e2521461016c5780631459457a1461017a5780631bc114ba1461018f578063284017f5146101a2575b600080fd5b60345461014f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61014f6004600360981b0181565b61018d610188366004610ff2565b610300565b005b60335461014f906001600160a01b031681565b61014f61202081565b61014f61101081565b61014f6002600160a01b0381565b61014f6004600160991b0181565b6101d961138881565b604051908152602001610163565b60355461014f906001600160a01b031681565b61014f610208366004611063565b6037602052600090815260409020546001600160a01b031681565b6101d961520881565b6101d9620249f081565b6101d97f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461014f906001600160a01b031681565b61018d61027e366004611087565b610464565b6101d97f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61014f61203081565b61018d6102c13660046110c8565b610474565b61018d6102d4366004611151565b610648565b6101d97f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103495760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103695750600054600160ff909116105b806103835750303b158015610383575060005460ff166001145b6103e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610340565b6000805460ff191660011790558015610409576000805461ff0019166101001790555b6104168686868686610657565b801561045c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61046f8383836107a7565b505050565b6034546001600160a01b031633146104df5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b6064820152608401610340565b6035546001600160a01b0384811691161461054d5760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b6064820152608401610340565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161057c60206000848661117d565b610585916111a7565b036105a45761059f61059a826020818661117d565b610b1d565b610642565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6105d360206000848661117d565b6105dc916111a7565b036105eb5761059f8282610dc8565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b6064820152608401610340565b50505050565b6106538233836107a7565b5050565b6001600160a01b0385161580159061067757506001600160a01b03841615155b801561068b57506001600160a01b03831615155b801561069f57506001600160a01b03821615155b6106fb5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b6064820152608401610340565b603380546001600160a01b03199081166001600160a01b0388811691909117909255603480548216878416179055603580548216868416179055603680549091168483161790558116156107a0576001600160a01b03811660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b826001600160a01b03163b60000361080b5760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b6064820152608401610340565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f91906111c5565b6001600160a01b038181166000908152603760205260409020549192508581169116146108ae5760405162461bcd60e51b8152600401610340906111e2565b6001600160a01b0381166108c4576108c4611225565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906111c5565b6001600160a01b03161461094657610946611225565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610974903390869060040161123b565b6020604051808303816000875af1158015610993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b79190611254565b610a035760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c45446044820152606401610340565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610a8e9391169160c4016112bc565b600060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610b0f92919061123b565b60405180910390a450505050565b6000808080610b2e858701876112e8565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610b715760405162461bcd60e51b8152600401610340906111e2565b806001600160a01b03163b600003610b8b57610b8b611225565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bef91906111c5565b9050856001600160a01b0316816001600160a01b031614610c1257610c12611225565b6001600160a01b038116610c2857610c28611225565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9491906111c5565b6001600160a01b031614610caa57610caa611225565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610cd8908790879060040161123b565b6020604051808303816000875af1158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1b9190611254565b610d675760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c45446044820152606401610340565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd8887604051610db692919061123b565b60405180910390a45050505050505050565b6000808080610dd9858701876113dc565b92975090955093509150506001600160a01b038416610dfa57610dfa611225565b6001600160a01b038481166000908152603760205260409020541615610e2257610e22611225565b6036546040516bffffffffffffffffffffffff19606087901b166020820152600091610e72916001600160a01b039091169060340160405160208183030381529060405280519060200120610f3d565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690610eca908890889088908890600401611469565b600060405180830381600087803b158015610ee457600080fd5b505af1158015610ef8573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116610fd45760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610340565b92915050565b6001600160a01b0381168114610fef57600080fd5b50565b600080600080600060a0868803121561100a57600080fd5b853561101581610fda565b9450602086013561102581610fda565b9350604086013561103581610fda565b9250606086013561104581610fda565b9150608086013561105581610fda565b809150509295509295909350565b60006020828403121561107557600080fd5b813561108081610fda565b9392505050565b60008060006060848603121561109c57600080fd5b83356110a781610fda565b925060208401356110b781610fda565b929592945050506040919091013590565b600080600080606085870312156110de57600080fd5b8435935060208501356110f081610fda565b9250604085013567ffffffffffffffff8082111561110d57600080fd5b818701915087601f83011261112157600080fd5b81358181111561113057600080fd5b88602082850101111561114257600080fd5b95989497505060200194505050565b6000806040838503121561116457600080fd5b823561116f81610fda565b946020939093013593505050565b6000808585111561118d57600080fd5b8386111561119a57600080fd5b5050820193919092039150565b80356020831015610fd457600019602084900360031b1b1692915050565b6000602082840312156111d757600080fd5b815161108081610fda565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60006020828403121561126657600080fd5b8151801515811461108057600080fd5b6000815180845260005b8181101561129c57602081850181015186830182015201611280565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190526000906112e090830184611276565b949350505050565b600080600080608085870312156112fe57600080fd5b843561130981610fda565b9350602085013561131981610fda565b9250604085013561132981610fda565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261136057600080fd5b813567ffffffffffffffff8082111561137b5761137b611339565b604051601f8301601f19908116603f011681019082821181831017156113a3576113a3611339565b816040528381528660208588010111156113bc57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156113f457600080fd5b85359450602086013561140681610fda565b9350604086013567ffffffffffffffff8082111561142357600080fd5b61142f89838a0161134f565b9450606088013591508082111561144557600080fd5b506114528882890161134f565b925050608086013560ff8116811461105557600080fd5b6001600160a01b038516815260806020820181905260009061148d90830186611276565b828103604084015261149f8186611276565b91505060ff831660608301529594505050505056fea2646970667358221220e0f44ad7883c5cd2dbd85a60832f6c9874795bf975cefd366724cc91bbc22dcd64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC20PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC20PredicateAccessList","sourceName":"contracts/child/ChildERC20PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"address","name":"newNativeTokenRootAddress","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC20","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611c8e806100206000396000f3fe608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e0366004611616565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e5610228366004611695565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a761028336600461173e565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b366004611762565b61068c565b6101e561031e36600461177f565b6106db565b6101e5610331366004611762565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e56103853660046117c0565b61073a565b6101e561039836600461173e565b61090e565b6101e56103ab366004611849565b61097f565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611875565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611899565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610996565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611875565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611899565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610996565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610ae7565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610b00565b6106106000610ae7565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610ae7565b50565b610694610b00565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610b5a565b6106ee838383610b62565b505050565b6106fb610b00565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b60fe546001600160a01b038481169116146108135760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108426020600084866118e7565b61084b91611911565b0361086a5761086561086082602081866118e7565b610ed9565b610908565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108996020600084866118e7565b6108a291611911565b036108b1576108658282611185565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610916610b00565b606580546001600160a01b0383166001600160a01b031990911681179091556109476033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610987610b5a565b610992823383610b62565b5050565b6001600160a01b038516158015906109b657506001600160a01b03841615155b80156109ca57506001600160a01b03831615155b80156109de57506001600160a01b03821615155b610a3a5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610ae0576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b0319169055610689816112fc565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b61061061134e565b826001600160a01b03163b600003610bc65760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a919061192f565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610c6a5760405162461bcd60e51b81526004016103fe9061194c565b6001600160a01b038116610c8057610c8061198f565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061192f565b6001600160a01b031614610d0257610d0261198f565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610d3090339086906004016119a5565b6020604051808303816000875af1158015610d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7391906119be565b610dbf5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e4a9391169160c401611a2b565b600060405180830381600087803b158015610e6457600080fd5b505af1158015610e78573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610ecb9291906119a5565b60405180910390a450505050565b6000808080610eea85870187611a57565b6001600160a01b038085166000908152610100602052604090205494985092965090945092501680610f2e5760405162461bcd60e51b81526004016103fe9061194c565b806001600160a01b03163b600003610f4857610f4861198f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac919061192f565b9050856001600160a01b0316816001600160a01b031614610fcf57610fcf61198f565b6001600160a01b038116610fe557610fe561198f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561102d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611051919061192f565b6001600160a01b0316146110675761106761198f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061109590879087906004016119a5565b6020604051808303816000875af11580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d891906119be565b6111245760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516111739291906119a5565b60405180910390a45050505050505050565b600080808061119685870187611b4b565b92975090955093509150506001600160a01b0384166111b7576111b761198f565b6001600160a01b038481166000908152610100602052604090205416156111e0576111e061198f565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611230916001600160a01b039091169060340160405160208183030381529060405280519060200120611564565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690611289908890889088908890600401611bd8565b600060405180830381600087803b1580156112a357600080fd5b505af11580156112b7573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff161561145957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916113b09190611c23565b6000604051808303818686fa925050503d80600081146113ec576040519150601f19603f3d011682016040523d82523d6000602084013e6113f1565b606091505b509150915081801561141657506000818060200190518101906114149190611c3f565b115b6114565760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916114c09190611c23565b6000604051808303818686fa925050503d80600081146114fc576040519150601f19603f3d011682016040523d82523d6000602084013e611501565b606091505b50915091508180156115275750808060200190518101906115229190611c3f565b600114155b6109925760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115fb5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b6001600160a01b038116811461068957600080fd5b600080600080600060a0868803121561162e57600080fd5b853561163981611601565b9450602086013561164981611601565b9350604086013561165981611601565b9250606086013561166981611601565b9150608086013561167981611601565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b0312156116b257600080fd5b88356116bd81611601565b975060208901356116cd81611601565b965060408901356116dd81611601565b955060608901356116ed81611601565b945060808901356116fd81611601565b935060a089013561170d81611687565b925060c089013561171d81611687565b915060e089013561172d81611601565b809150509295985092959890939650565b60006020828403121561175057600080fd5b813561175b81611601565b9392505050565b60006020828403121561177457600080fd5b813561175b81611687565b60008060006060848603121561179457600080fd5b833561179f81611601565b925060208401356117af81611601565b929592945050506040919091013590565b600080600080606085870312156117d657600080fd5b8435935060208501356117e881611601565b9250604085013567ffffffffffffffff8082111561180557600080fd5b818701915087601f83011261181957600080fd5b81358181111561182857600080fd5b88602082850101111561183a57600080fd5b95989497505060200194505050565b6000806040838503121561185c57600080fd5b823561186781611601565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156118f757600080fd5b8386111561190457600080fd5b5050820193919092039150565b803560208310156115fb57600019602084900360031b1b1692915050565b60006020828403121561194157600080fd5b815161175b81611601565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156119d057600080fd5b815161175b81611687565b60005b838110156119f65781810151838201526020016119de565b50506000910152565b60008151808452611a178160208601602086016119db565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611a4f908301846119ff565b949350505050565b60008060008060808587031215611a6d57600080fd5b8435611a7881611601565b93506020850135611a8881611601565b92506040850135611a9881611601565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611acf57600080fd5b813567ffffffffffffffff80821115611aea57611aea611aa8565b604051601f8301601f19908116603f01168101908282118183101715611b1257611b12611aa8565b81604052838152866020858801011115611b2b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611b6357600080fd5b853594506020860135611b7581611601565b9350604086013567ffffffffffffffff80821115611b9257600080fd5b611b9e89838a01611abe565b94506060880135915080821115611bb457600080fd5b50611bc188828901611abe565b925050608086013560ff8116811461167957600080fd5b6001600160a01b0385168152608060208201819052600090611bfc908301866119ff565b8281036040840152611c0e81866119ff565b91505060ff8316606083015295945050505050565b60008251611c358184602087016119db565b9190910192915050565b600060208284031215611c5157600080fd5b505191905056fea26469706673582212206ea7447ee1c5e059d53f0d5e7f2241d867a55a3968ed1a50039de2f2d55b996664736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061018f5760003560e01c80638da5cb5b116100e4578063c5e4683a11610092578063c5e4683a14610323578063d41f177114610336578063e0563ab11461035d578063e30c397814610366578063eeb4994514610377578063f2fde38b1461038a578063f3fef3a31461039d578063f6451255146103b057600080fd5b80638da5cb5b1461029f578063947287cf146102b057806397e5230d146102b9578063b1768065146102c3578063b68ad1e4146102ea578063c1225a20146102fd578063c3b35a7e1461031057600080fd5b806354f8abad1161014157806354f8abad1461021a57806355b01e4d1461022d5780635ea5df791461023b578063715018a61461025257806371cf93b71461025a57806379ba50971461026d5780637efab4f51461027557600080fd5b806305dc2e8f1461019457806307b3e252146101c45780631459457a146101d25780631bc114ba146101e7578063284017f5146101fa5780633b878c221461020357806351351d531461020c575b600080fd5b60fd546101a7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a76004600360981b0181565b6101e56101e0366004611616565b6103d7565b005b60fc546101a7906001600160a01b031681565b6101a761202081565b6101a761101081565b6101a76002600160a01b0381565b6101e5610228366004611695565b6104db565b6101a76004600160991b0181565b61024461138881565b6040519081526020016101bb565b6101e56105fe565b60fe546101a7906001600160a01b031681565b6101e5610612565b6101a761028336600461173e565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101a7565b61024461520881565b610244620249f081565b6102447f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101a7906001600160a01b031681565b6101e561030b366004611762565b61068c565b6101e561031e36600461177f565b6106db565b6101e5610331366004611762565b6106f3565b6102447f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101a761203081565b6065546001600160a01b03166101a7565b6101e56103853660046117c0565b61073a565b6101e561039836600461173e565b61090e565b6101e56103ab366004611849565b61097f565b6102447f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146104075760405163973d02cb60e01b81526004016103fe90611875565b60405180910390fd5b600054610100900460ff16158080156104275750600054600160ff909116105b806104415750303b158015610441575060005460ff166001145b61045d5760405162461bcd60e51b81526004016103fe90611899565b6000805460ff191660011790558015610480576000805461ff0019166101001790555b61048d8686868686610996565b80156104d3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b336002600160a01b03146105025760405163973d02cb60e01b81526004016103fe90611875565b600054610100900460ff16158080156105225750600054600160ff909116105b8061053c5750303b15801561053c575060005460ff166001145b6105585760405162461bcd60e51b81526004016103fe90611899565b6000805460ff19166001179055801561057b576000805461ff0019166101001790555b6105888989898989610996565b60c9805461ffff191685151561ff00191617610100851515021790556105ad82610ae7565b80156105f3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b610606610b00565b6106106000610ae7565b565b60655433906001600160a01b031681146106805760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016103fe565b61068981610ae7565b50565b610694610b00565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6106e3610b5a565b6106ee838383610b62565b505050565b6106fb610b00565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016103fe565b60fe546001600160a01b038481169116146108135760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016103fe565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108426020600084866118e7565b61084b91611911565b0361086a5761086561086082602081866118e7565b610ed9565b610908565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108996020600084866118e7565b6108a291611911565b036108b1576108658282611185565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016103fe565b50505050565b610916610b00565b606580546001600160a01b0383166001600160a01b031990911681179091556109476033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610987610b5a565b610992823383610b62565b5050565b6001600160a01b038516158015906109b657506001600160a01b03841615155b80156109ca57506001600160a01b03831615155b80156109de57506001600160a01b03821615155b610a3a5760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016103fe565b60fc80546001600160a01b03199081166001600160a01b038881169190911790925560fd8054821687841617905560fe8054821686841617905560ff8054909116848316179055811615610ae0576001600160a01b0381166000818152610100602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b5050505050565b606580546001600160a01b0319169055610689816112fc565b6033546001600160a01b031633146106105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103fe565b61061061134e565b826001600160a01b03163b600003610bc65760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016103fe565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a919061192f565b6001600160a01b0381811660009081526101006020526040902054919250858116911614610c6a5760405162461bcd60e51b81526004016103fe9061194c565b6001600160a01b038116610c8057610c8061198f565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061192f565b6001600160a01b031614610d0257610d0261198f565b604051632770a7eb60e21b81526001600160a01b03851690639dc29fac90610d3090339086906004016119a5565b6020604051808303816000875af1158015610d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7391906119be565b610dbf5760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016103fe565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e4a9391169160c401611a2b565b600060405180830381600087803b158015610e6457600080fd5b505af1158015610e78573d6000803e3d6000fd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb273386604051610ecb9291906119a5565b60405180910390a450505050565b6000808080610eea85870187611a57565b6001600160a01b038085166000908152610100602052604090205494985092965090945092501680610f2e5760405162461bcd60e51b81526004016103fe9061194c565b806001600160a01b03163b600003610f4857610f4861198f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac919061192f565b9050856001600160a01b0316816001600160a01b031614610fcf57610fcf61198f565b6001600160a01b038116610fe557610fe561198f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561102d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611051919061192f565b6001600160a01b0316146110675761106761198f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061109590879087906004016119a5565b6020604051808303816000875af11580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d891906119be565b6111245760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016103fe565b836001600160a01b0316826001600160a01b0316876001600160a01b03167fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd88876040516111739291906119a5565b60405180910390a45050505050505050565b600080808061119685870187611b4b565b92975090955093509150506001600160a01b0384166111b7576111b761198f565b6001600160a01b038481166000908152610100602052604090205416156111e0576111e061198f565b60ff546040516bffffffffffffffffffffffff19606087901b166020820152600091611230916001600160a01b039091169060340160405160208183030381529060405280519060200120611564565b6001600160a01b03868116600090815261010060205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690611289908890889088908890600401611bd8565b600060405180830381600087803b1580156112a357600080fd5b505af11580156112b7573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff161561145957604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b0191611388916113b09190611c23565b6000604051808303818686fa925050503d80600081146113ec576040519150601f19603f3d011682016040523d82523d6000602084013e6113f1565b606091505b509150915081801561141657506000818060200190518101906114149190611c3f565b115b6114565760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016103fe565b50505b60c954610100900460ff161561061057604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b0191611388916114c09190611c23565b6000604051808303818686fa925050503d80600081146114fc576040519150601f19603f3d011682016040523d82523d6000602084013e611501565b606091505b50915091508180156115275750808060200190518101906115229190611c3f565b600114155b6109925760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016103fe565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115fb5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103fe565b92915050565b6001600160a01b038116811461068957600080fd5b600080600080600060a0868803121561162e57600080fd5b853561163981611601565b9450602086013561164981611601565b9350604086013561165981611601565b9250606086013561166981611601565b9150608086013561167981611601565b809150509295509295909350565b801515811461068957600080fd5b600080600080600080600080610100898b0312156116b257600080fd5b88356116bd81611601565b975060208901356116cd81611601565b965060408901356116dd81611601565b955060608901356116ed81611601565b945060808901356116fd81611601565b935060a089013561170d81611687565b925060c089013561171d81611687565b915060e089013561172d81611601565b809150509295985092959890939650565b60006020828403121561175057600080fd5b813561175b81611601565b9392505050565b60006020828403121561177457600080fd5b813561175b81611687565b60008060006060848603121561179457600080fd5b833561179f81611601565b925060208401356117af81611601565b929592945050506040919091013590565b600080600080606085870312156117d657600080fd5b8435935060208501356117e881611601565b9250604085013567ffffffffffffffff8082111561180557600080fd5b818701915087601f83011261181957600080fd5b81358181111561182857600080fd5b88602082850101111561183a57600080fd5b95989497505060200194505050565b6000806040838503121561185c57600080fd5b823561186781611601565b946020939093013593505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156118f757600080fd5b8386111561190457600080fd5b5050820193919092039150565b803560208310156115fb57600019602084900360031b1b1692915050565b60006020828403121561194157600080fd5b815161175b81611601565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b6000602082840312156119d057600080fd5b815161175b81611687565b60005b838110156119f65781810151838201526020016119de565b50506000910152565b60008151808452611a178160208601602086016119db565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611a4f908301846119ff565b949350505050565b60008060008060808587031215611a6d57600080fd5b8435611a7881611601565b93506020850135611a8881611601565b92506040850135611a9881611601565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611acf57600080fd5b813567ffffffffffffffff80821115611aea57611aea611aa8565b604051601f8301601f19908116603f01168101908282118183101715611b1257611b12611aa8565b81604052838152866020858801011115611b2b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611b6357600080fd5b853594506020860135611b7581611601565b9350604086013567ffffffffffffffff80821115611b9257600080fd5b611b9e89838a01611abe565b94506060880135915080821115611bb457600080fd5b50611bc188828901611abe565b925050608086013560ff8116811461167957600080fd5b6001600160a01b0385168152608060208201819052600090611bfc908301866119ff565b8281036040840152611c0e81866119ff565b91505060ff8316606083015295945050505050565b60008251611c358184602087016119db565b9190910192915050565b600060208284031215611c5157600080fd5b505191905056fea26469706673582212206ea7447ee1c5e059d53f0d5e7f2241d867a55a3968ed1a50039de2f2d55b996664736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC20PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC20Predicate","sourceName":"contracts/child/RootMintableERC20Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061149f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806397e5230d116100b8578063e0563ab11161007c578063e0563ab1146102a2578063eeb49945146102ab578063f213159c146102be578063f4a120f7146102d1578063f6451255146102e4578063f8c8765e1461030b57600080fd5b806397e5230d14610224578063b17680651461022e578063b68ad1e414610255578063d41f177114610268578063d57184e41461028f57600080fd5b806347e7ef241161010a57806347e7ef24146101aa57806351351d53146101bf57806355b01e4d146101cd5780635ea5df79146101db5780637efab4f5146101f2578063947287cf1461021b57600080fd5b806305dc2e8f1461014757806307b3e252146101775780631bc114ba14610185578063284017f5146101985780633b878c22146101a1575b600080fd5b60345461015a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015a6004600360981b0181565b60335461015a906001600160a01b031681565b61015a61202081565b61015a61101081565b6101bd6101b8366004611038565b61031e565b005b61015a6002600160a01b0381565b61015a6004600160991b0181565b6101e461138881565b60405190815260200161016e565b61015a610200366004611064565b6037602052600090815260409020546001600160a01b031681565b6101e461520881565b6101e4620249f081565b6101e47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461015a906001600160a01b031681565b6101e47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60355461015a906001600160a01b031681565b61015a61203081565b6101bd6102b9366004611088565b61032d565b6101bd6102cc366004611111565b6104d5565b61015a6102df366004611064565b6104e5565b6101e47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6101bd610319366004611152565b6108b1565b610329823383610a0e565b5050565b6034546001600160a01b031633146103a45760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461041a5760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b606482015260840161039b565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696104496020600084866111ae565b610452916111d8565b036104715761046c61046782602081866111ae565b610b7e565b6104cf565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b606482015260840161039b565b50505050565b6104e0838383610a0e565b505050565b60006001600160a01b03821661054f5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b606482015260840161039b565b6001600160a01b0382811660009081526037602052604090205416156105ca5760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b606482015260840161039b565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261067892911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610710573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107389190810190611231565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610776573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261079e9190810190611231565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080091906112d3565b604051602001610814959493929190611322565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610840929190611374565b600060405180830381600087803b15801561085a57600080fd5b505af115801561086e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b03146108f55760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161039b565b600054610100900460ff16158080156109155750600054600160ff909116105b8061092f5750303b15801561092f575060005460ff166001145b6109925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161039b565b6000805460ff1916600117905580156109b5576000805461ff0019166101001790555b6109c185858585610c36565b8015610a07576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6001600160a01b038084166000908152603760205260409020541680610a3a57610a37846104e5565b90505b6001600160a01b038116610a5057610a50611398565b610a656001600160a01b038516333085610d31565b603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610af09391169160c401611374565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610b719291906113ae565b60405180910390a46104cf565b6000808080610b8f858701876113c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610bc257610bc2611398565b610bd66001600160a01b0386168484610d9c565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee88786604051610c259291906113ae565b60405180910390a450505050505050565b6001600160a01b03841615801590610c5657506001600160a01b03831615155b8015610c6a57506001600160a01b03821615155b8015610c7e57506001600160a01b03811615155b610ce15760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b606482015260840161039b565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6040516001600160a01b03808516602483015283166044820152606481018290526104cf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610dbb565b6104e08363a9059cbb60e01b8484604051602401610d659291906113ae565b6000610e10826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e909092919063ffffffff16565b9050805160001480610e31575080806020019051810190610e319190611418565b6104e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161039b565b6060610e9f8484600085610ea7565b949350505050565b606082471015610f085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161039b565b600080866001600160a01b03168587604051610f24919061143a565b60006040518083038185875af1925050503d8060008114610f61576040519150601f19603f3d011682016040523d82523d6000602084013e610f66565b606091505b5091509150610f7787838387610f82565b979650505050505050565b60608315610ff1578251600003610fea576001600160a01b0385163b610fea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161039b565b5081610e9f565b610e9f83838151156110065781518083602001fd5b8060405162461bcd60e51b815260040161039b9190611456565b6001600160a01b038116811461103557600080fd5b50565b6000806040838503121561104b57600080fd5b823561105681611020565b946020939093013593505050565b60006020828403121561107657600080fd5b813561108181611020565b9392505050565b6000806000806060858703121561109e57600080fd5b8435935060208501356110b081611020565b9250604085013567ffffffffffffffff808211156110cd57600080fd5b818701915087601f8301126110e157600080fd5b8135818111156110f057600080fd5b88602082850101111561110257600080fd5b95989497505060200194505050565b60008060006060848603121561112657600080fd5b833561113181611020565b9250602084013561114181611020565b929592945050506040919091013590565b6000806000806080858703121561116857600080fd5b843561117381611020565b9350602085013561118381611020565b9250604085013561119381611020565b915060608501356111a381611020565b939692955090935050565b600080858511156111be57600080fd5b838611156111cb57600080fd5b5050820193919092039150565b803560208310156111f157600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611228578181015183820152602001611210565b50506000910152565b60006020828403121561124357600080fd5b815167ffffffffffffffff8082111561125b57600080fd5b818401915084601f83011261126f57600080fd5b815181811115611281576112816111f7565b604051601f8201601f19908116603f011681019083821181831017156112a9576112a96111f7565b816040528281528760208487010111156112c257600080fd5b610f7783602083016020880161120d565b6000602082840312156112e557600080fd5b815160ff8116811461108157600080fd5b6000815180845261130e81602086016020860161120d565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a06040820181905260009061134c908301866112f6565b828103606084015261135e81866112f6565b91505060ff831660808301529695505050505050565b6001600160a01b0383168152604060208201819052600090610e9f908301846112f6565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156113dd57600080fd5b84356113e881611020565b935060208501356113f881611020565b9250604085013561140881611020565b9396929550929360600135925050565b60006020828403121561142a57600080fd5b8151801515811461108157600080fd5b6000825161144c81846020870161120d565b9190910192915050565b60208152600061108160208301846112f656fea264697066735822122084ec8ad36f0d03abcfc5bde4447836ff970764edfea496ff308f22046530682b64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101425760003560e01c806397e5230d116100b8578063e0563ab11161007c578063e0563ab1146102a2578063eeb49945146102ab578063f213159c146102be578063f4a120f7146102d1578063f6451255146102e4578063f8c8765e1461030b57600080fd5b806397e5230d14610224578063b17680651461022e578063b68ad1e414610255578063d41f177114610268578063d57184e41461028f57600080fd5b806347e7ef241161010a57806347e7ef24146101aa57806351351d53146101bf57806355b01e4d146101cd5780635ea5df79146101db5780637efab4f5146101f2578063947287cf1461021b57600080fd5b806305dc2e8f1461014757806307b3e252146101775780631bc114ba14610185578063284017f5146101985780633b878c22146101a1575b600080fd5b60345461015a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015a6004600360981b0181565b60335461015a906001600160a01b031681565b61015a61202081565b61015a61101081565b6101bd6101b8366004611038565b61031e565b005b61015a6002600160a01b0381565b61015a6004600160991b0181565b6101e461138881565b60405190815260200161016e565b61015a610200366004611064565b6037602052600090815260409020546001600160a01b031681565b6101e461520881565b6101e4620249f081565b6101e47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461015a906001600160a01b031681565b6101e47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60355461015a906001600160a01b031681565b61015a61203081565b6101bd6102b9366004611088565b61032d565b6101bd6102cc366004611111565b6104d5565b61015a6102df366004611064565b6104e5565b6101e47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6101bd610319366004611152565b6108b1565b610329823383610a0e565b5050565b6034546001600160a01b031633146103a45760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461041a5760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b606482015260840161039b565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696104496020600084866111ae565b610452916111d8565b036104715761046c61046782602081866111ae565b610b7e565b6104cf565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b606482015260840161039b565b50505050565b6104e0838383610a0e565b505050565b60006001600160a01b03821661054f5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b606482015260840161039b565b6001600160a01b0382811660009081526037602052604090205416156105ca5760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b606482015260840161039b565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261067892911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610710573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107389190810190611231565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610776573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261079e9190810190611231565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080091906112d3565b604051602001610814959493929190611322565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610840929190611374565b600060405180830381600087803b15801561085a57600080fd5b505af115801561086e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b03146108f55760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161039b565b600054610100900460ff16158080156109155750600054600160ff909116105b8061092f5750303b15801561092f575060005460ff166001145b6109925760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161039b565b6000805460ff1916600117905580156109b5576000805461ff0019166101001790555b6109c185858585610c36565b8015610a07576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6001600160a01b038084166000908152603760205260409020541680610a3a57610a37846104e5565b90505b6001600160a01b038116610a5057610a50611398565b610a656001600160a01b038516333085610d31565b603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610af09391169160c401611374565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610b719291906113ae565b60405180910390a46104cf565b6000808080610b8f858701876113c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610bc257610bc2611398565b610bd66001600160a01b0386168484610d9c565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee88786604051610c259291906113ae565b60405180910390a450505050505050565b6001600160a01b03841615801590610c5657506001600160a01b03831615155b8015610c6a57506001600160a01b03821615155b8015610c7e57506001600160a01b03811615155b610ce15760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b606482015260840161039b565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6040516001600160a01b03808516602483015283166044820152606481018290526104cf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610dbb565b6104e08363a9059cbb60e01b8484604051602401610d659291906113ae565b6000610e10826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e909092919063ffffffff16565b9050805160001480610e31575080806020019051810190610e319190611418565b6104e05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161039b565b6060610e9f8484600085610ea7565b949350505050565b606082471015610f085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161039b565b600080866001600160a01b03168587604051610f24919061143a565b60006040518083038185875af1925050503d8060008114610f61576040519150601f19603f3d011682016040523d82523d6000602084013e610f66565b606091505b5091509150610f7787838387610f82565b979650505050505050565b60608315610ff1578251600003610fea576001600160a01b0385163b610fea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161039b565b5081610e9f565b610e9f83838151156110065781518083602001fd5b8060405162461bcd60e51b815260040161039b9190611456565b6001600160a01b038116811461103557600080fd5b50565b6000806040838503121561104b57600080fd5b823561105681611020565b946020939093013593505050565b60006020828403121561107657600080fd5b813561108181611020565b9392505050565b6000806000806060858703121561109e57600080fd5b8435935060208501356110b081611020565b9250604085013567ffffffffffffffff808211156110cd57600080fd5b818701915087601f8301126110e157600080fd5b8135818111156110f057600080fd5b88602082850101111561110257600080fd5b95989497505060200194505050565b60008060006060848603121561112657600080fd5b833561113181611020565b9250602084013561114181611020565b929592945050506040919091013590565b6000806000806080858703121561116857600080fd5b843561117381611020565b9350602085013561118381611020565b9250604085013561119381611020565b915060608501356111a381611020565b939692955090935050565b600080858511156111be57600080fd5b838611156111cb57600080fd5b5050820193919092039150565b803560208310156111f157600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611228578181015183820152602001611210565b50506000910152565b60006020828403121561124357600080fd5b815167ffffffffffffffff8082111561125b57600080fd5b818401915084601f83011261126f57600080fd5b815181811115611281576112816111f7565b604051601f8201601f19908116603f011681019083821181831017156112a9576112a96111f7565b816040528281528760208487010111156112c257600080fd5b610f7783602083016020880161120d565b6000602082840312156112e557600080fd5b815160ff8116811461108157600080fd5b6000815180845261130e81602086016020860161120d565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a06040820181905260009061134c908301866112f6565b828103606084015261135e81866112f6565b91505060ff831660808301529695505050505050565b6001600160a01b0383168152604060208201819052600090610e9f908301846112f6565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156113dd57600080fd5b84356113e881611020565b935060208501356113f881611020565b9250604085013561140881611020565b9396929550929360600135925050565b60006020828403121561142a57600080fd5b8151801515811461108157600080fd5b6000825161144c81846020870161120d565b9190910192915050565b60208152600061108160208301846112f656fea264697066735822122084ec8ad36f0d03abcfc5bde4447836ff970764edfea496ff308f22046530682b64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC20PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC20PredicateAccessList","sourceName":"contracts/child/RootMintableERC20PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC20Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childERC20Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC20Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611bfb806100206000396000f3fe608060405234801561001057600080fd5b506004361061019a5760003560e01c8063b1768065116100e4578063e0563ab111610092578063e0563ab114610355578063e30c39781461035e578063eeb499451461036f578063f213159c14610382578063f2fde38b14610395578063f4a120f7146103a8578063f6451255146103bb578063f8c8765e146103e257600080fd5b8063b1768065146102a8578063b68ad1e4146102cf578063c1225a20146102e2578063c5e4683a146102f5578063d41f177114610308578063d57184e41461032f578063d8dd17731461034257600080fd5b806355b01e4d1161014c57806355b01e4d146102255780635ea5df7914610233578063715018a61461024a57806379ba5097146102525780637efab4f51461025a5780638da5cb5b14610284578063947287cf1461029557806397e5230d1461029e57600080fd5b806305dc2e8f1461019f57806307b3e252146101cf5780631bc114ba146101dd578063284017f5146101f05780633b878c22146101f957806347e7ef241461020257806351351d5314610217575b600080fd5b60fd546101b2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101b26004600360981b0181565b60fc546101b2906001600160a01b031681565b6101b261202081565b6101b261101081565b61021561021036600461164d565b6103f5565b005b6101b26002600160a01b0381565b6101b26004600160991b0181565b61023c61138881565b6040519081526020016101c6565b610215610404565b610215610418565b6101b2610268366004611679565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101b2565b61023c61520881565b61023c620249f081565b61023c7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101b2906001600160a01b031681565b6102156102f03660046116ab565b610497565b6102156103033660046116ab565b6104e6565b61023c7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60fe546101b2906001600160a01b031681565b6102156103503660046116c8565b61052d565b6101b261203081565b6065546001600160a01b03166101b2565b61021561037d36600461175e565b61064e565b6102156103903660046117e7565b6107f1565b6102156103a3366004611679565b610801565b6101b26103b6366004611679565b610872565b61023c7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102156103f0366004611828565b610c40565b610400823383610d39565b5050565b61040c610eb2565b6104166000610f0c565b565b60655433906001600160a01b0316811461048b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61049481610f0c565b50565b61049f610eb2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6104ee610eb2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105545760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff16158080156105745750600054600160ff909116105b8061058e5750303b15801561058e575060005460ff166001145b6105aa5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff1916600117905580156105cd576000805461ff0019166101001790555b6105d988888888610f25565b60c9805461ffff191685151561ff00191617610100851515021790556105fe82610f0c565b8015610644576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146106c05760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b6064820152608401610482565b60fe546001600160a01b038481169116146107365760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b6064820152608401610482565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696107656020600084866118f6565b61076e91611920565b0361078d5761078861078382602081866118f6565b611020565b6107eb565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b6064820152608401610482565b50505050565b6107fc838383610d39565b505050565b610809610eb2565b606580546001600160a01b0383166001600160a01b0319909116811790915561083a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166108dc5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b6064820152608401610482565b6001600160a01b038281166000908152610100602052604090205416156109585760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b6064820152608401610482565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610a0692911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610a9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ac79190810190611979565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b05573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b2d9190810190611979565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f9190611a1b565b604051602001610ba3959493929190611a6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bcf929190611abc565b600060405180830381600087803b158015610be957600080fd5b505af1158015610bfd573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610c675760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff1615808015610c875750600054600160ff909116105b80610ca15750303b158015610ca1575060005460ff166001145b610cbd5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff191660011790558015610ce0576000805461ff0019166101001790555b610cec85858585610f25565b8015610d32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610d416110d9565b6001600160a01b03808416600090815261010060205260409020541680610d6e57610d6b84610872565b90505b6001600160a01b038116610d8457610d84611ae0565b610d996001600160a01b0385163330856110e1565b60fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e249391169160c401611abc565b600060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610ea5929190611af6565b60405180910390a46107eb565b6033546001600160a01b031633146104165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610482565b606580546001600160a01b03191690556104948161114c565b6001600160a01b03841615801590610f4557506001600160a01b03831615155b8015610f5957506001600160a01b03821615155b8015610f6d57506001600160a01b03811615155b610fd05760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b6064820152608401610482565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061103185870187611b0f565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061106557611065611ae0565b6110796001600160a01b038616848461119e565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee887866040516110c8929190611af6565b60405180910390a450505050505050565b6104166111bd565b6040516001600160a01b03808516602483015283166044820152606481018290526107eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526113d3565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107fc8363a9059cbb60e01b8484604051602401611115929190611af6565b60c95460ff16156112c857604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161121f9190611b60565b6000604051808303818686fa925050503d806000811461125b576040519150601f19603f3d011682016040523d82523d6000602084013e611260565b606091505b509150915081801561128557506000818060200190518101906112839190611b7c565b115b6112c55760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610482565b50505b60c954610100900460ff161561041657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161132f9190611b60565b6000604051808303818686fa925050503d806000811461136b576040519150601f19603f3d011682016040523d82523d6000602084013e611370565b606091505b50915091508180156113965750808060200190518101906113919190611b7c565b600114155b6104005760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610482565b6000611428826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114a89092919063ffffffff16565b90508051600014806114495750808060200190518101906114499190611b95565b6107fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610482565b60606114b784846000856114bf565b949350505050565b6060824710156115205760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610482565b600080866001600160a01b0316858760405161153c9190611b60565b60006040518083038185875af1925050503d8060008114611579576040519150601f19603f3d011682016040523d82523d6000602084013e61157e565b606091505b509150915061158f8783838761159a565b979650505050505050565b60608315611609578251600003611602576001600160a01b0385163b6116025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610482565b50816114b7565b6114b7838381511561161e5781518083602001fd5b8060405162461bcd60e51b81526004016104829190611bb2565b6001600160a01b038116811461049457600080fd5b6000806040838503121561166057600080fd5b823561166b81611638565b946020939093013593505050565b60006020828403121561168b57600080fd5b813561169681611638565b9392505050565b801515811461049457600080fd5b6000602082840312156116bd57600080fd5b81356116968161169d565b600080600080600080600060e0888a0312156116e357600080fd5b87356116ee81611638565b965060208801356116fe81611638565b9550604088013561170e81611638565b9450606088013561171e81611638565b9350608088013561172e8161169d565b925060a088013561173e8161169d565b915060c088013561174e81611638565b8091505092959891949750929550565b6000806000806060858703121561177457600080fd5b84359350602085013561178681611638565b9250604085013567ffffffffffffffff808211156117a357600080fd5b818701915087601f8301126117b757600080fd5b8135818111156117c657600080fd5b8860208285010111156117d857600080fd5b95989497505060200194505050565b6000806000606084860312156117fc57600080fd5b833561180781611638565b9250602084013561181781611638565b929592945050506040919091013590565b6000806000806080858703121561183e57600080fd5b843561184981611638565b9350602085013561185981611638565b9250604085013561186981611638565b9150606085013561187981611638565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561190657600080fd5b8386111561191357600080fd5b5050820193919092039150565b8035602083101561193957600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611970578181015183820152602001611958565b50506000910152565b60006020828403121561198b57600080fd5b815167ffffffffffffffff808211156119a357600080fd5b818401915084601f8301126119b757600080fd5b8151818111156119c9576119c961193f565b604051601f8201601f19908116603f011681019083821181831017156119f1576119f161193f565b81604052828152876020848701011115611a0a57600080fd5b61158f836020830160208801611955565b600060208284031215611a2d57600080fd5b815160ff8116811461169657600080fd5b60008151808452611a56816020860160208601611955565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a060408201819052600090611a9490830186611a3e565b8281036060840152611aa68186611a3e565b91505060ff831660808301529695505050505050565b6001600160a01b03831681526040602082018190526000906114b790830184611a3e565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b2557600080fd5b8435611b3081611638565b93506020850135611b4081611638565b92506040850135611b5081611638565b9396929550929360600135925050565b60008251611b72818460208701611955565b9190910192915050565b600060208284031215611b8e57600080fd5b5051919050565b600060208284031215611ba757600080fd5b81516116968161169d565b6020815260006116966020830184611a3e56fea2646970667358221220176d1307d83cd6036f83b91e4ae24d7832bdefc3a6d526f5cfd719424ef4671864736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061019a5760003560e01c8063b1768065116100e4578063e0563ab111610092578063e0563ab114610355578063e30c39781461035e578063eeb499451461036f578063f213159c14610382578063f2fde38b14610395578063f4a120f7146103a8578063f6451255146103bb578063f8c8765e146103e257600080fd5b8063b1768065146102a8578063b68ad1e4146102cf578063c1225a20146102e2578063c5e4683a146102f5578063d41f177114610308578063d57184e41461032f578063d8dd17731461034257600080fd5b806355b01e4d1161014c57806355b01e4d146102255780635ea5df7914610233578063715018a61461024a57806379ba5097146102525780637efab4f51461025a5780638da5cb5b14610284578063947287cf1461029557806397e5230d1461029e57600080fd5b806305dc2e8f1461019f57806307b3e252146101cf5780631bc114ba146101dd578063284017f5146101f05780633b878c22146101f957806347e7ef241461020257806351351d5314610217575b600080fd5b60fd546101b2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101b26004600360981b0181565b60fc546101b2906001600160a01b031681565b6101b261202081565b6101b261101081565b61021561021036600461164d565b6103f5565b005b6101b26002600160a01b0381565b6101b26004600160991b0181565b61023c61138881565b6040519081526020016101c6565b610215610404565b610215610418565b6101b2610268366004611679565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101b2565b61023c61520881565b61023c620249f081565b61023c7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101b2906001600160a01b031681565b6102156102f03660046116ab565b610497565b6102156103033660046116ab565b6104e6565b61023c7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60fe546101b2906001600160a01b031681565b6102156103503660046116c8565b61052d565b6101b261203081565b6065546001600160a01b03166101b2565b61021561037d36600461175e565b61064e565b6102156103903660046117e7565b6107f1565b6102156103a3366004611679565b610801565b6101b26103b6366004611679565b610872565b61023c7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102156103f0366004611828565b610c40565b610400823383610d39565b5050565b61040c610eb2565b6104166000610f0c565b565b60655433906001600160a01b0316811461048b5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61049481610f0c565b50565b61049f610eb2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6104ee610eb2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105545760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff16158080156105745750600054600160ff909116105b8061058e5750303b15801561058e575060005460ff166001145b6105aa5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff1916600117905580156105cd576000805461ff0019166101001790555b6105d988888888610f25565b60c9805461ffff191685151561ff00191617610100851515021790556105fe82610f0c565b8015610644576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146106c05760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526e2fa9aa20aa22afa922a1a2a4ab22a960891b6064820152608401610482565b60fe546001600160a01b038481169116146107365760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c6545524332305072656469636174653a204f4e4c5960448201526f5f4348494c445f50524544494341544560801b6064820152608401610482565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696107656020600084866118f6565b61076e91611920565b0361078d5761078861078382602081866118f6565b611020565b6107eb565b60405162461bcd60e51b815260206004820152602d60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e564160448201526c4c49445f5349474e415455524560981b6064820152608401610482565b50505050565b6107fc838383610d39565b505050565b610809610eb2565b606580546001600160a01b0383166001600160a01b0319909116811790915561083a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166108dc5760405162461bcd60e51b815260206004820152602960248201527f526f6f744d696e7461626c6545524332305072656469636174653a20494e56416044820152682624a22faa27a5a2a760b91b6064820152608401610482565b6001600160a01b038281166000908152610100602052604090205416156109585760405162461bcd60e51b815260206004820152602a60248201527f526f6f744d696e7461626c6545524332305072656469636174653a20414c524560448201526910511657d3505414115160b21b6064820152608401610482565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610a0692911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610a9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ac79190810190611979565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610b05573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b2d9190810190611979565b8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f9190611a1b565b604051602001610ba3959493929190611a6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bcf929190611abc565b600060405180830381600087803b158015610be957600080fd5b505af1158015610bfd573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610c675760405163973d02cb60e01b815260040161048290611884565b600054610100900460ff1615808015610c875750600054600160ff909116105b80610ca15750303b158015610ca1575060005460ff166001145b610cbd5760405162461bcd60e51b8152600401610482906118a8565b6000805460ff191660011790558015610ce0576000805461ff0019166101001790555b610cec85858585610f25565b8015610d32576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610d416110d9565b6001600160a01b03808416600090815261010060205260409020541680610d6e57610d6b84610872565b90505b6001600160a01b038116610d8457610d84611ae0565b610d996001600160a01b0385163330856110e1565b60fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610e249391169160c401611abc565b600060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b50505050826001600160a01b0316816001600160a01b0316856001600160a01b03167f1666a3f7b8a7494f2ebcebe646a5187ae55b1db3a068097377d90cd64a258ce93386604051610ea5929190611af6565b60405180910390a46107eb565b6033546001600160a01b031633146104165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610482565b606580546001600160a01b03191690556104948161114c565b6001600160a01b03841615801590610f4557506001600160a01b03831615155b8015610f5957506001600160a01b03821615155b8015610f6d57506001600160a01b03811615155b610fd05760405162461bcd60e51b815260206004820152602e60248201527f526f6f744d696e7461626c6545524332305072656469636174653a204241445f60448201526d24a724aa24a0a624ad20aa24a7a760911b6064820152608401610482565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061103185870187611b0f565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061106557611065611ae0565b6110796001600160a01b038616848461119e565b826001600160a01b0316816001600160a01b0316866001600160a01b03167fb9f935478aae5b1da868de596dafe0a2b41eeb61311fdd60c6dbbe46a1debee887866040516110c8929190611af6565b60405180910390a450505050505050565b6104166111bd565b6040516001600160a01b03808516602483015283166044820152606481018290526107eb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526113d3565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107fc8363a9059cbb60e01b8484604051602401611115929190611af6565b60c95460ff16156112c857604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161121f9190611b60565b6000604051808303818686fa925050503d806000811461125b576040519150601f19603f3d011682016040523d82523d6000602084013e611260565b606091505b509150915081801561128557506000818060200190518101906112839190611b7c565b115b6112c55760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610482565b50505b60c954610100900460ff161561041657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161132f9190611b60565b6000604051808303818686fa925050503d806000811461136b576040519150601f19603f3d011682016040523d82523d6000602084013e611370565b606091505b50915091508180156113965750808060200190518101906113919190611b7c565b600114155b6104005760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610482565b6000611428826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114a89092919063ffffffff16565b90508051600014806114495750808060200190518101906114499190611b95565b6107fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610482565b60606114b784846000856114bf565b949350505050565b6060824710156115205760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610482565b600080866001600160a01b0316858760405161153c9190611b60565b60006040518083038185875af1925050503d8060008114611579576040519150601f19603f3d011682016040523d82523d6000602084013e61157e565b606091505b509150915061158f8783838761159a565b979650505050505050565b60608315611609578251600003611602576001600160a01b0385163b6116025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610482565b50816114b7565b6114b7838381511561161e5781518083602001fd5b8060405162461bcd60e51b81526004016104829190611bb2565b6001600160a01b038116811461049457600080fd5b6000806040838503121561166057600080fd5b823561166b81611638565b946020939093013593505050565b60006020828403121561168b57600080fd5b813561169681611638565b9392505050565b801515811461049457600080fd5b6000602082840312156116bd57600080fd5b81356116968161169d565b600080600080600080600060e0888a0312156116e357600080fd5b87356116ee81611638565b965060208801356116fe81611638565b9550604088013561170e81611638565b9450606088013561171e81611638565b9350608088013561172e8161169d565b925060a088013561173e8161169d565b915060c088013561174e81611638565b8091505092959891949750929550565b6000806000806060858703121561177457600080fd5b84359350602085013561178681611638565b9250604085013567ffffffffffffffff808211156117a357600080fd5b818701915087601f8301126117b757600080fd5b8135818111156117c657600080fd5b8860208285010111156117d857600080fd5b95989497505060200194505050565b6000806000606084860312156117fc57600080fd5b833561180781611638565b9250602084013561181781611638565b929592945050506040919091013590565b6000806000806080858703121561183e57600080fd5b843561184981611638565b9350602085013561185981611638565b9250604085013561186981611638565b9150606085013561187981611638565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561190657600080fd5b8386111561191357600080fd5b5050820193919092039150565b8035602083101561193957600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015611970578181015183820152602001611958565b50506000910152565b60006020828403121561198b57600080fd5b815167ffffffffffffffff808211156119a357600080fd5b818401915084601f8301126119b757600080fd5b8151818111156119c9576119c961193f565b604051601f8201601f19908116603f011681019083821181831017156119f1576119f161193f565b81604052828152876020848701011115611a0a57600080fd5b61158f836020830160208801611955565b600060208284031215611a2d57600080fd5b815160ff8116811461169657600080fd5b60008151808452611a56816020860160208601611955565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a060408201819052600090611a9490830186611a3e565b8281036060840152611aa68186611a3e565b91505060ff831660808301529695505050505050565b6001600160a01b03831681526040602082018190526000906114b790830184611a3e565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b2557600080fd5b8435611b3081611638565b93506020850135611b4081611638565b92506040850135611b5081611638565b9396929550929360600135925050565b60008251611b72818460208701611955565b9190910192915050565b600060208284031215611b8e57600080fd5b5051919050565b600060208284031215611ba757600080fd5b81516116968161169d565b6020815260006116966020830184611a3e56fea2646970667358221220176d1307d83cd6036f83b91e4ae24d7832bdefc3a6d526f5cfd719424ef4671864736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var ChildERC721Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721","sourceName":"contracts/child/ChildERC721.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"invalidateNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612488806100206000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a22cb4651161007c578063a22cb465146102de578063b2dc5dc3146102f1578063b88d4fde14610304578063c87b56dd14610317578063e61987051461032a578063e985e9c51461033c57600080fd5b806370a08231146102775780637c88e3d91461028a578063906571471461029d57806395d89b41146102b05780639b77ef11146102b85780639dc29fac146102cb57600080fd5b80631f2d0065116101155780631f2d0065146101e257806323b872dd146101f45780632d0335ab1461020757806340c10f191461023e57806342842e0e146102515780636352211e1461026457600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba5780630c53c51c146101cf575b600080fd5b610165610160366004611a73565b61034f565b60405190151581526020015b60405180910390f35b6101826103a1565b6040516101719190611ae0565b6101a261019d366004611af3565b610433565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611b28565b61045a565b005b6101826101dd366004611b9a565b610586565b610103546001600160a01b03166101a2565b6101cd610202366004611c19565b610864565b610230610215366004611c55565b6001600160a01b031660009081526038602052604090205490565b604051908152602001610171565b61016561024c366004611b28565b61089c565b6101cd61025f366004611c19565b6108dd565b6101a2610272366004611af3565b6108f8565b610230610285366004611c55565b61092d565b610165610298366004611cb4565b6109b3565b6101cd6102ab366004611d1f565b610a9b565b610182610d0b565b6101cd6102c6366004611af3565b610d1a565b6101656102d9366004611b28565b610d41565b6101cd6102ec366004611d9f565b610db1565b6101656102ff366004611ddb565b610dc7565b6101cd610312366004611e43565b610e75565b610182610325366004611af3565b610eb4565b610102546001600160a01b03166101a2565b61016561034a366004611f1e565b610f28565b60006001600160e01b031982166380ac58cd60e01b148061038057506001600160e01b03198216635b5e139f60e01b145b8061039b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060d080546103b090611f51565b80601f01602080910402602001604051908101604052809291908181526020018280546103dc90611f51565b80156104295780601f106103fe57610100808354040283529160200191610429565b820191906000526020600020905b81548152906001019060200180831161040c57829003601f168201915b5050505050905090565b600061043e82610f56565b50600090815260d460205260409020546001600160a01b031690565b6000610465826108f8565b9050806001600160a01b0316836001600160a01b0316036104d75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b806001600160a01b03166104e9610f7e565b6001600160a01b0316148061050557506105058161034a610f7e565b6105775760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ce565b6105818383610f8d565b505050565b606060006105c987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ffb92505050565b90506001600160e01b031960003581169082160361064f5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084016104ce565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506106c08982888888611016565b6107165760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016104ce565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161076b93929190611f8b565b60408051601f198184030181529082905261078591611fb1565b6000604051808303816000865af19150503d80600081146107c2576040519150601f19603f3d011682016040523d82523d6000602084013e6107c7565b606091505b5091509150816108195760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016104ce565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161084e9493929190611fcd565b60405180910390a19a9950505050505050505050565b61087561086f610f7e565b826110f2565b6108915760405162461bcd60e51b81526004016104ce90612019565b610581838383611150565b610102546000906001600160a01b031633146108ca5760405162461bcd60e51b81526004016104ce90612066565b6108d483836112a2565b50600192915050565b61058183838360405180602001604052806000815250610e75565b600081815260d260205260408120546001600160a01b03168061039b5760405162461bcd60e51b81526004016104ce906120aa565b60006001600160a01b0382166109975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ce565b506001600160a01b0316600090815260d3602052604090205490565b610102546000906001600160a01b031633146109e15760405162461bcd60e51b81526004016104ce90612066565b83828114610a315760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a204172726179206c656e206d69736d617463680060448201526064016104ce565b60005b81811015610a8c57610a84878783818110610a5157610a516120dc565b9050602002016020810190610a669190611c55565b868684818110610a7857610a786120dc565b905060200201356112a2565b600101610a34565b5060019150505b949350505050565b606b54610100900460ff1615808015610abb5750606b54600160ff909116105b80610ad55750303b158015610ad55750606b5460ff166001145b610b385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104ce565b606b805460ff191660011790558015610b5b57606b805461ff0019166101001790555b6001600160a01b03861615801590610b7257508315155b8015610b7d57508115155b610bc95760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a2042616420696e697469616c697a6174696f6e0060448201526064016104ce565b61010380546001600160a01b0388166001600160a01b031991821617909155610102805490911633179055604080516020601f8701819004810282018101909252858152610c6591879087908190840183828082843760009201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284376000920191909152506112bc92505050565b610cbd85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b602082015291506112ed9050565b8015610d0357606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606060d180546103b090611f51565b3360009081526038602052604081208054839290610d399084906120f2565b909155505050565b610102546000906001600160a01b03163314610d6f5760405162461bcd60e51b81526004016104ce90612066565b610d78826108f8565b6001600160a01b0316836001600160a01b031614610da85760405162461bcd60e51b81526004016104ce90612113565b6108d482611359565b610dc3610dbc610f7e565b83836113dc565b5050565b610102546000906001600160a01b03163314610df55760405162461bcd60e51b81526004016104ce90612066565b8160005b81811015610e69576000858583818110610e1557610e156120dc565b905060200201359050610e27816108f8565b6001600160a01b0316876001600160a01b031614610e575760405162461bcd60e51b81526004016104ce90612113565b610e6081611359565b50600101610df9565b50600195945050505050565b610e86610e80610f7e565b836110f2565b610ea25760405162461bcd60e51b81526004016104ce90612019565b610eae848484846114a6565b50505050565b6060610ebf82610f56565b6000610ed660408051602081019091526000815290565b90506000815111610ef65760405180602001604052806000815250610f21565b80610f00846114d9565b604051602001610f11929190612148565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260d56020908152604080832093909416825291909152205460ff1690565b610f5f8161156b565b610f7b5760405162461bcd60e51b81526004016104ce906120aa565b50565b6000610f88611588565b905090565b600081815260d46020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fc2826108f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815160000361100e57506000919050565b506020015190565b600080600161102c611027886115e4565b611661565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa15801561107a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110d15760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016104ce565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000806110fe836108f8565b9050806001600160a01b0316846001600160a01b0316148061112557506111258185610f28565b80610a935750836001600160a01b031661113e84610433565b6001600160a01b031614949350505050565b826001600160a01b0316611163826108f8565b6001600160a01b0316146111895760405162461bcd60e51b81526004016104ce90612177565b6001600160a01b0382166111eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ce565b826001600160a01b03166111fe826108f8565b6001600160a01b0316146112245760405162461bcd60e51b81526004016104ce90612177565b600081815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260d3855283862080546000190190559087168086528386208054600101905586865260d2909452828520805490921684179091559051849360008051602061243383398151915291a4505050565b610dc382826040518060200160405280600081525061168e565b606b54610100900460ff166112e35760405162461bcd60e51b81526004016104ce906121bc565b610dc382826116c1565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61133b818484611701565b600055600280546001600160a01b0319163017905560055550505050565b6000611364826108f8565b905061136f826108f8565b600083815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b03851680855260d38452828520805460001901905587855260d290935281842080549091169055519293508492600080516020612433833981519152908390a45050565b816001600160a01b0316836001600160a01b0316036114395760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104ce565b6001600160a01b03838116600081815260d56020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114b1848484611150565b6114bd8484848461174a565b610eae5760405162461bcd60e51b81526004016104ce90612207565b606060006114e68361184f565b60010190506000816001600160401b0381111561150557611505611e2d565b6040519080825280601f01601f19166020018201604052801561152f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461153957509392505050565b600090815260d260205260409020546001600160a01b0316151590565b60003033036115de57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506115e19050565b50335b90565b60006040518060800160405280604381526020016123f06043913980516020918201208351848301516040808701518051908601209051611644950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039b61166e611927565b8360405161190160f01b8152600281019290925260228201526042902090565b6116988383611962565b6116a5600084848461174a565b6105815760405162461bcd60e51b81526004016104ce90612207565b606b54610100900460ff166116e85760405162461bcd60e51b81526004016104ce906121bc565b60d06116f4838261229f565b5060d1610581828261229f565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b60006001600160a01b0384163b1561184757836001600160a01b031663150b7a02611773610f7e565b8786866040518563ffffffff1660e01b8152600401611795949392919061235e565b6020604051808303816000875af19250505080156117d0575060408051601f3d908101601f191682019092526117cd9181019061239b565b60015b61182d573d8080156117fe576040519150601f19603f3d011682016040523d82523d6000602084013e611803565b606091505b5080516000036118255760405162461bcd60e51b81526004016104ce90612207565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a93565b506001610a93565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061188e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118ba576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106118d857662386f26fc10000830492506010015b6305f5e10083106118f0576305f5e100830492506008015b612710831061190457612710830492506004015b60648310611916576064830492506002015b600a831061039b5760010192915050565b6002546000906001600160a01b031630148015611945575060015446145b15611951575060005490565b610f88600554600354600454611701565b6001600160a01b0382166119b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ce565b6119c18161156b565b156119de5760405162461bcd60e51b81526004016104ce906123b8565b6119e78161156b565b15611a045760405162461bcd60e51b81526004016104ce906123b8565b6001600160a01b038216600081815260d3602090815260408083208054600101905584835260d290915280822080546001600160a01b031916841790555183929190600080516020612433833981519152908290a45050565b6001600160e01b031981168114610f7b57600080fd5b600060208284031215611a8557600080fd5b8135610f2181611a5d565b60005b83811015611aab578181015183820152602001611a93565b50506000910152565b60008151808452611acc816020860160208601611a90565b601f01601f19169290920160200192915050565b602081526000610f216020830184611ab4565b600060208284031215611b0557600080fd5b5035919050565b80356001600160a01b0381168114611b2357600080fd5b919050565b60008060408385031215611b3b57600080fd5b611b4483611b0c565b946020939093013593505050565b60008083601f840112611b6457600080fd5b5081356001600160401b03811115611b7b57600080fd5b602083019150836020828501011115611b9357600080fd5b9250929050565b60008060008060008060a08789031215611bb357600080fd5b611bbc87611b0c565b955060208701356001600160401b03811115611bd757600080fd5b611be389828a01611b52565b9096509450506040870135925060608701359150608087013560ff81168114611c0b57600080fd5b809150509295509295509295565b600080600060608486031215611c2e57600080fd5b611c3784611b0c565b9250611c4560208501611b0c565b9150604084013590509250925092565b600060208284031215611c6757600080fd5b610f2182611b0c565b60008083601f840112611c8257600080fd5b5081356001600160401b03811115611c9957600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b60008060008060408587031215611cca57600080fd5b84356001600160401b0380821115611ce157600080fd5b611ced88838901611c70565b90965094506020870135915080821115611d0657600080fd5b50611d1387828801611c70565b95989497509550505050565b600080600080600060608688031215611d3757600080fd5b611d4086611b0c565b945060208601356001600160401b0380821115611d5c57600080fd5b611d6889838a01611b52565b90965094506040880135915080821115611d8157600080fd5b50611d8e88828901611b52565b969995985093965092949392505050565b60008060408385031215611db257600080fd5b611dbb83611b0c565b915060208301358015158114611dd057600080fd5b809150509250929050565b600080600060408486031215611df057600080fd5b611df984611b0c565b925060208401356001600160401b03811115611e1457600080fd5b611e2086828701611c70565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611e5957600080fd5b611e6285611b0c565b9350611e7060208601611b0c565b92506040850135915060608501356001600160401b0380821115611e9357600080fd5b818701915087601f830112611ea757600080fd5b813581811115611eb957611eb9611e2d565b604051601f8201601f19908116603f01168101908382118183101715611ee157611ee1611e2d565b816040528281528a6020848701011115611efa57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611f3157600080fd5b611f3a83611b0c565b9150611f4860208401611b0c565b90509250929050565b600181811c90821680611f6557607f821691505b602082108103611f8557634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251611fc3818460208701611a90565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526024908201527f4368696c644552433732313a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561039b57634e487b7160e01b600052601160045260246000fd5b6020808252818101527f4368696c644552433732313a204f6e6c79206f776e65722063616e206275726e604082015260600190565b6000835161215a818460208801611a90565b83519083019061216e818360208801611a90565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b601f82111561058157600081815260208120601f850160051c810160208610156122805750805b601f850160051c820191505b81811015610d035782815560010161228c565b81516001600160401b038111156122b8576122b8611e2d565b6122cc816122c68454611f51565b84612259565b602080601f83116001811461230157600084156122e95750858301515b600019600386901b1c1916600185901b178555610d03565b600085815260208120601f198616915b8281101561233057888601518255948401946001909101908401612311565b508582101561234e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239190830184611ab4565b9695505050505050565b6000602082840312156123ad57600080fd5b8151610f2181611a5d565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bd40f4c587cb7d8ae1bc3b96cf69daefceacb0a939f4075b779cabc6e8e56d3964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a22cb4651161007c578063a22cb465146102de578063b2dc5dc3146102f1578063b88d4fde14610304578063c87b56dd14610317578063e61987051461032a578063e985e9c51461033c57600080fd5b806370a08231146102775780637c88e3d91461028a578063906571471461029d57806395d89b41146102b05780639b77ef11146102b85780639dc29fac146102cb57600080fd5b80631f2d0065116101155780631f2d0065146101e257806323b872dd146101f45780632d0335ab1461020757806340c10f191461023e57806342842e0e146102515780636352211e1461026457600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba5780630c53c51c146101cf575b600080fd5b610165610160366004611a73565b61034f565b60405190151581526020015b60405180910390f35b6101826103a1565b6040516101719190611ae0565b6101a261019d366004611af3565b610433565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611b28565b61045a565b005b6101826101dd366004611b9a565b610586565b610103546001600160a01b03166101a2565b6101cd610202366004611c19565b610864565b610230610215366004611c55565b6001600160a01b031660009081526038602052604090205490565b604051908152602001610171565b61016561024c366004611b28565b61089c565b6101cd61025f366004611c19565b6108dd565b6101a2610272366004611af3565b6108f8565b610230610285366004611c55565b61092d565b610165610298366004611cb4565b6109b3565b6101cd6102ab366004611d1f565b610a9b565b610182610d0b565b6101cd6102c6366004611af3565b610d1a565b6101656102d9366004611b28565b610d41565b6101cd6102ec366004611d9f565b610db1565b6101656102ff366004611ddb565b610dc7565b6101cd610312366004611e43565b610e75565b610182610325366004611af3565b610eb4565b610102546001600160a01b03166101a2565b61016561034a366004611f1e565b610f28565b60006001600160e01b031982166380ac58cd60e01b148061038057506001600160e01b03198216635b5e139f60e01b145b8061039b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060d080546103b090611f51565b80601f01602080910402602001604051908101604052809291908181526020018280546103dc90611f51565b80156104295780601f106103fe57610100808354040283529160200191610429565b820191906000526020600020905b81548152906001019060200180831161040c57829003601f168201915b5050505050905090565b600061043e82610f56565b50600090815260d460205260409020546001600160a01b031690565b6000610465826108f8565b9050806001600160a01b0316836001600160a01b0316036104d75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b806001600160a01b03166104e9610f7e565b6001600160a01b0316148061050557506105058161034a610f7e565b6105775760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ce565b6105818383610f8d565b505050565b606060006105c987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ffb92505050565b90506001600160e01b031960003581169082160361064f5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084016104ce565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506106c08982888888611016565b6107165760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016104ce565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161076b93929190611f8b565b60408051601f198184030181529082905261078591611fb1565b6000604051808303816000865af19150503d80600081146107c2576040519150601f19603f3d011682016040523d82523d6000602084013e6107c7565b606091505b5091509150816108195760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016104ce565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161084e9493929190611fcd565b60405180910390a19a9950505050505050505050565b61087561086f610f7e565b826110f2565b6108915760405162461bcd60e51b81526004016104ce90612019565b610581838383611150565b610102546000906001600160a01b031633146108ca5760405162461bcd60e51b81526004016104ce90612066565b6108d483836112a2565b50600192915050565b61058183838360405180602001604052806000815250610e75565b600081815260d260205260408120546001600160a01b03168061039b5760405162461bcd60e51b81526004016104ce906120aa565b60006001600160a01b0382166109975760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ce565b506001600160a01b0316600090815260d3602052604090205490565b610102546000906001600160a01b031633146109e15760405162461bcd60e51b81526004016104ce90612066565b83828114610a315760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a204172726179206c656e206d69736d617463680060448201526064016104ce565b60005b81811015610a8c57610a84878783818110610a5157610a516120dc565b9050602002016020810190610a669190611c55565b868684818110610a7857610a786120dc565b905060200201356112a2565b600101610a34565b5060019150505b949350505050565b606b54610100900460ff1615808015610abb5750606b54600160ff909116105b80610ad55750303b158015610ad55750606b5460ff166001145b610b385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104ce565b606b805460ff191660011790558015610b5b57606b805461ff0019166101001790555b6001600160a01b03861615801590610b7257508315155b8015610b7d57508115155b610bc95760405162461bcd60e51b815260206004820152601f60248201527f4368696c644552433732313a2042616420696e697469616c697a6174696f6e0060448201526064016104ce565b61010380546001600160a01b0388166001600160a01b031991821617909155610102805490911633179055604080516020601f8701819004810282018101909252858152610c6591879087908190840183828082843760009201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284376000920191909152506112bc92505050565b610cbd85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b602082015291506112ed9050565b8015610d0357606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b606060d180546103b090611f51565b3360009081526038602052604081208054839290610d399084906120f2565b909155505050565b610102546000906001600160a01b03163314610d6f5760405162461bcd60e51b81526004016104ce90612066565b610d78826108f8565b6001600160a01b0316836001600160a01b031614610da85760405162461bcd60e51b81526004016104ce90612113565b6108d482611359565b610dc3610dbc610f7e565b83836113dc565b5050565b610102546000906001600160a01b03163314610df55760405162461bcd60e51b81526004016104ce90612066565b8160005b81811015610e69576000858583818110610e1557610e156120dc565b905060200201359050610e27816108f8565b6001600160a01b0316876001600160a01b031614610e575760405162461bcd60e51b81526004016104ce90612113565b610e6081611359565b50600101610df9565b50600195945050505050565b610e86610e80610f7e565b836110f2565b610ea25760405162461bcd60e51b81526004016104ce90612019565b610eae848484846114a6565b50505050565b6060610ebf82610f56565b6000610ed660408051602081019091526000815290565b90506000815111610ef65760405180602001604052806000815250610f21565b80610f00846114d9565b604051602001610f11929190612148565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260d56020908152604080832093909416825291909152205460ff1690565b610f5f8161156b565b610f7b5760405162461bcd60e51b81526004016104ce906120aa565b50565b6000610f88611588565b905090565b600081815260d46020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610fc2826108f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815160000361100e57506000919050565b506020015190565b600080600161102c611027886115e4565b611661565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa15801561107a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110d15760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b60448201526064016104ce565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000806110fe836108f8565b9050806001600160a01b0316846001600160a01b0316148061112557506111258185610f28565b80610a935750836001600160a01b031661113e84610433565b6001600160a01b031614949350505050565b826001600160a01b0316611163826108f8565b6001600160a01b0316146111895760405162461bcd60e51b81526004016104ce90612177565b6001600160a01b0382166111eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ce565b826001600160a01b03166111fe826108f8565b6001600160a01b0316146112245760405162461bcd60e51b81526004016104ce90612177565b600081815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260d3855283862080546000190190559087168086528386208054600101905586865260d2909452828520805490921684179091559051849360008051602061243383398151915291a4505050565b610dc382826040518060200160405280600081525061168e565b606b54610100900460ff166112e35760405162461bcd60e51b81526004016104ce906121bc565b610dc382826116c1565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61133b818484611701565b600055600280546001600160a01b0319163017905560055550505050565b6000611364826108f8565b905061136f826108f8565b600083815260d46020908152604080832080546001600160a01b03199081169091556001600160a01b03851680855260d38452828520805460001901905587855260d290935281842080549091169055519293508492600080516020612433833981519152908390a45050565b816001600160a01b0316836001600160a01b0316036114395760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104ce565b6001600160a01b03838116600081815260d56020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114b1848484611150565b6114bd8484848461174a565b610eae5760405162461bcd60e51b81526004016104ce90612207565b606060006114e68361184f565b60010190506000816001600160401b0381111561150557611505611e2d565b6040519080825280601f01601f19166020018201604052801561152f576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461153957509392505050565b600090815260d260205260409020546001600160a01b0316151590565b60003033036115de57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506115e19050565b50335b90565b60006040518060800160405280604381526020016123f06043913980516020918201208351848301516040808701518051908601209051611644950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039b61166e611927565b8360405161190160f01b8152600281019290925260228201526042902090565b6116988383611962565b6116a5600084848461174a565b6105815760405162461bcd60e51b81526004016104ce90612207565b606b54610100900460ff166116e85760405162461bcd60e51b81526004016104ce906121bc565b60d06116f4838261229f565b5060d1610581828261229f565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b60006001600160a01b0384163b1561184757836001600160a01b031663150b7a02611773610f7e565b8786866040518563ffffffff1660e01b8152600401611795949392919061235e565b6020604051808303816000875af19250505080156117d0575060408051601f3d908101601f191682019092526117cd9181019061239b565b60015b61182d573d8080156117fe576040519150601f19603f3d011682016040523d82523d6000602084013e611803565b606091505b5080516000036118255760405162461bcd60e51b81526004016104ce90612207565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a93565b506001610a93565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061188e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118ba576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106118d857662386f26fc10000830492506010015b6305f5e10083106118f0576305f5e100830492506008015b612710831061190457612710830492506004015b60648310611916576064830492506002015b600a831061039b5760010192915050565b6002546000906001600160a01b031630148015611945575060015446145b15611951575060005490565b610f88600554600354600454611701565b6001600160a01b0382166119b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ce565b6119c18161156b565b156119de5760405162461bcd60e51b81526004016104ce906123b8565b6119e78161156b565b15611a045760405162461bcd60e51b81526004016104ce906123b8565b6001600160a01b038216600081815260d3602090815260408083208054600101905584835260d290915280822080546001600160a01b031916841790555183929190600080516020612433833981519152908290a45050565b6001600160e01b031981168114610f7b57600080fd5b600060208284031215611a8557600080fd5b8135610f2181611a5d565b60005b83811015611aab578181015183820152602001611a93565b50506000910152565b60008151808452611acc816020860160208601611a90565b601f01601f19169290920160200192915050565b602081526000610f216020830184611ab4565b600060208284031215611b0557600080fd5b5035919050565b80356001600160a01b0381168114611b2357600080fd5b919050565b60008060408385031215611b3b57600080fd5b611b4483611b0c565b946020939093013593505050565b60008083601f840112611b6457600080fd5b5081356001600160401b03811115611b7b57600080fd5b602083019150836020828501011115611b9357600080fd5b9250929050565b60008060008060008060a08789031215611bb357600080fd5b611bbc87611b0c565b955060208701356001600160401b03811115611bd757600080fd5b611be389828a01611b52565b9096509450506040870135925060608701359150608087013560ff81168114611c0b57600080fd5b809150509295509295509295565b600080600060608486031215611c2e57600080fd5b611c3784611b0c565b9250611c4560208501611b0c565b9150604084013590509250925092565b600060208284031215611c6757600080fd5b610f2182611b0c565b60008083601f840112611c8257600080fd5b5081356001600160401b03811115611c9957600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b60008060008060408587031215611cca57600080fd5b84356001600160401b0380821115611ce157600080fd5b611ced88838901611c70565b90965094506020870135915080821115611d0657600080fd5b50611d1387828801611c70565b95989497509550505050565b600080600080600060608688031215611d3757600080fd5b611d4086611b0c565b945060208601356001600160401b0380821115611d5c57600080fd5b611d6889838a01611b52565b90965094506040880135915080821115611d8157600080fd5b50611d8e88828901611b52565b969995985093965092949392505050565b60008060408385031215611db257600080fd5b611dbb83611b0c565b915060208301358015158114611dd057600080fd5b809150509250929050565b600080600060408486031215611df057600080fd5b611df984611b0c565b925060208401356001600160401b03811115611e1457600080fd5b611e2086828701611c70565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611e5957600080fd5b611e6285611b0c565b9350611e7060208601611b0c565b92506040850135915060608501356001600160401b0380821115611e9357600080fd5b818701915087601f830112611ea757600080fd5b813581811115611eb957611eb9611e2d565b604051601f8201601f19908116603f01168101908382118183101715611ee157611ee1611e2d565b816040528281528a6020848701011115611efa57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611f3157600080fd5b611f3a83611b0c565b9150611f4860208401611b0c565b90509250929050565b600181811c90821680611f6557607f821691505b602082108103611f8557634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251611fc3818460208701611a90565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526024908201527f4368696c644552433732313a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561039b57634e487b7160e01b600052601160045260246000fd5b6020808252818101527f4368696c644552433732313a204f6e6c79206f776e65722063616e206275726e604082015260600190565b6000835161215a818460208801611a90565b83519083019061216e818360208801611a90565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b601f82111561058157600081815260208120601f850160051c810160208610156122805750805b601f850160051c820191505b81811015610d035782815560010161228c565b81516001600160401b038111156122b8576122b8611e2d565b6122cc816122c68454611f51565b84612259565b602080601f83116001811461230157600084156122e95750858301515b600019600386901b1c1916600185901b178555610d03565b600085815260208120601f198616915b8281101561233057888601518255948401946001909101908401612311565b508582101561234e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239190830184611ab4565b9695505050505050565b6000602082840312156123ad57600080fd5b8151610f2181611a5d565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bd40f4c587cb7d8ae1bc3b96cf69daefceacb0a939f4075b779cabc6e8e56d3964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC721PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721Predicate","sourceName":"contracts/child/ChildERC721Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061234b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b6102066102013660046119e3565b610382565b005b610170610216366004611a65565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611a89565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611aca565b6103a6565b610206610330366004611b52565b6108d0565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d366004611b7e565b6108df565b61038f8585858585610a3b565b5050505050565b6103a1838383610d9f565b505050565b6103dd604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b8152506110a8565b6034546001600160a01b0316331461044e5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6104856040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b8152506110a8565b6035546001600160a01b038481169116146104f45760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b6064820152608401610445565b61052b604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b8152506110a8565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161055a602060008486611bda565b61056391611c04565b0361065e5761059f6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b8152506110a8565b6105d6604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b8152506110a8565b6105eb6105e68260208186611bda565b6110ee565b6106226040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b8152506110a8565b610659604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b8152506110a8565b6108ca565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861068d602060008486611bda565b61069691611c04565b03610783576106d260405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b8152506110a8565b610709604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b8152506110a8565b6107138282611364565b61074b6040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b8152506110a8565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b8152506110a8565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107b2602060008486611bda565b6107bb91611c04565b0361083a576107f86040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b8152506110a8565b61080282826115ca565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b8152506110a8565b6108726040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b8152506110a8565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b6064820152608401610445565b50505050565b6108db823383610d9f565b5050565b336002600160a01b03146109235760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610445565b600054610100900460ff16158080156109435750600054600160ff909116105b8061095d5750303b15801561095d575060005460ff166001145b6109c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b6000805460ff1916600117905580156109e3576000805461ff0019166101001790555b6109ef85858585611738565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b84610a458161182d565b610a615760405162461bcd60e51b815260040161044590611c22565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190611c64565b6001600160a01b03818116600090815260376020526040902054919250888116911614610b045760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610b1a57610b1a611cc5565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b869190611c64565b6001600160a01b031614610b9c57610b9c611cc5565b848314610bf75760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b6064820152608401610445565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c2790339088908890600401611d0d565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611d3b565b610c865760405162461bcd60e51b815260040161044590611d5d565b6033546035546040516001600160a01b03928316926316f19831921690610cdd907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611de7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d09929190611e81565b600060405180830381600087803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610d8e9493929190611ead565b60405180910390a450505050505050565b82610da98161182d565b610dc55760405162461bcd60e51b815260040161044590611c22565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611c64565b6001600160a01b03818116600090815260376020526040902054919250868116911614610e685760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610e7e57610e7e611cc5565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190611c64565b6001600160a01b031614610f0057610f00611cc5565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610f2e9033908790600401611edf565b6020604051808303816000875af1158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190611d3b565b610f8d5760405162461bcd60e51b815260040161044590611d5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110189391169160c401611e81565b600060405180830381600087803b15801561103257600080fd5b505af1158015611046573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051611099929190611edf565b60405180910390a45050505050565b6110eb816040516024016110bc9190611ef8565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118c2565b50565b60008080806110ff85870187611f0b565b6001600160a01b03808516600090815260376020526040902054949850929650909450925016806111425760405162461bcd60e51b815260040161044590611c81565b61114b8161182d565b61115757611157611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bb9190611c64565b9050856001600160a01b0316816001600160a01b0316146111de576111de611cc5565b6001600160a01b0381166111f4576111f4611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112609190611c64565b6001600160a01b03161461127657611276611cc5565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112a49087908790600401611edf565b6020604051808303816000875af11580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e79190611d3b565b6113035760405162461bcd60e51b815260040161044590611f5c565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611352929190611edf565b60405180910390a45050505050505050565b600080808061137585870187612071565b6001600160a01b038085166000908152603760205260409020549499509297509095509350169050806113ba5760405162461bcd60e51b815260040161044590611c81565b6113c38161182d565b6113cf576113cf611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190611c64565b9050856001600160a01b0316816001600160a01b03161461145657611456611cc5565b6001600160a01b03811661146c5761146c611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190611c64565b6001600160a01b0316146114ee576114ee611cc5565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d99061151c9087908790600401612163565b6020604051808303816000875af115801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190611d3b565b61157b5760405162461bcd60e51b815260040161044590611f5c565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611352929190612163565b600080806115da84860186612256565b91955093509150506001600160a01b0383166115f8576115f8611cc5565b6001600160a01b03838116600090815260376020526040902054161561162057611620611cc5565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611670916001600160a01b0390911690603401604051602081830303815290604052805190602001206118cb565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b8152919250906390657147906116c6908790879087906004016122d5565b600060405180830381600087803b1580156116e057600080fd5b505af11580156116f4573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061175857506001600160a01b03831615155b801561176c57506001600160a01b03821615155b801561178057506001600160a01b03811615155b6117dd5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b6064820152608401610445565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361184957506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118b0575060408051601f3d908101601f191682019092526118ad91810190611d3b565b60015b6118bc57506000919050565b92915050565b6110eb81611962565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118bc5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610445565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146110eb57600080fd5b60008083601f8401126119aa57600080fd5b5081356001600160401b038111156119c157600080fd5b6020830191508360208260051b85010111156119dc57600080fd5b9250929050565b6000806000806000606086880312156119fb57600080fd5b8535611a0681611983565b945060208601356001600160401b0380821115611a2257600080fd5b611a2e89838a01611998565b90965094506040880135915080821115611a4757600080fd5b50611a5488828901611998565b969995985093965092949392505050565b600060208284031215611a7757600080fd5b8135611a8281611983565b9392505050565b600080600060608486031215611a9e57600080fd5b8335611aa981611983565b92506020840135611ab981611983565b929592945050506040919091013590565b60008060008060608587031215611ae057600080fd5b843593506020850135611af281611983565b925060408501356001600160401b0380821115611b0e57600080fd5b818701915087601f830112611b2257600080fd5b813581811115611b3157600080fd5b886020828501011115611b4357600080fd5b95989497505060200194505050565b60008060408385031215611b6557600080fd5b8235611b7081611983565b946020939093013593505050565b60008060008060808587031215611b9457600080fd5b8435611b9f81611983565b93506020850135611baf81611983565b92506040850135611bbf81611983565b91506060850135611bcf81611983565b939692955090935050565b60008085851115611bea57600080fd5b83861115611bf757600080fd5b5050820193919092039150565b803560208310156118bc57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b600060208284031215611c7657600080fd5b8151611a8281611983565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611cf457600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0384168152604060208201819052600090611d329083018486611cdb565b95945050505050565b600060208284031215611d4d57600080fd5b81518015158114611a8257600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611ddc578135611dc181611983565b6001600160a01b031687529582019590820190600101611dae565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611e1a9083018688611d9e565b8281036080840152611e2d818587611cdb565b9a9950505050505050505050565b6000815180845260005b81811015611e6157602081850181015186830182015201611e45565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611ea590830184611e3b565b949350505050565b604081526000611ec1604083018688611d9e565b8281036020840152611ed4818587611cdb565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b602081526000611a826020830184611e3b565b60008060008060808587031215611f2157600080fd5b8435611f2c81611983565b93506020850135611f3c81611983565b92506040850135611f4c81611983565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fdb57611fdb611f9d565b604052919050565b60006001600160401b03821115611ffc57611ffc611f9d565b5060051b60200190565b600082601f83011261201757600080fd5b8135602061202c61202783611fe3565b611fb3565b82815260059290921b8401810191818101908684111561204b57600080fd5b8286015b84811015612066578035835291830191830161204f565b509695505050505050565b600080600080600060a0868803121561208957600080fd5b8535945060208087013561209c81611983565b945060408701356120ac81611983565b935060608701356001600160401b03808211156120c857600080fd5b818901915089601f8301126120dc57600080fd5b81356120ea61202782611fe3565b81815260059190911b8301840190848101908c83111561210957600080fd5b938501935b8285101561213057843561212181611983565b8252938501939085019061210e565b96505050608089013592508083111561214857600080fd5b505061215688828901612006565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156121a55781516001600160a01b031684529284019290840190600101612180565b5050508381038285015284518082528583019183019060005b818110156121da578351835292840192918401916001016121be565b5090979650505050505050565b600082601f8301126121f857600080fd5b81356001600160401b0381111561221157612211611f9d565b612224601f8201601f1916602001611fb3565b81815284602083860101111561223957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561226c57600080fd5b84359350602085013561227e81611983565b925060408501356001600160401b038082111561229a57600080fd5b6122a6888389016121e7565b935060608701359150808211156122bc57600080fd5b506122c9878288016121e7565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906122f990830185611e3b565b828103604084015261230b8185611e3b565b969550505050505056fea2646970667358221220741155e0346f92320f8a88455bb9a1d38fea5128fee6f0019f35598b488bdb2264736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b6102066102013660046119e3565b610382565b005b610170610216366004611a65565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611a89565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611aca565b6103a6565b610206610330366004611b52565b6108d0565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d366004611b7e565b6108df565b61038f8585858585610a3b565b5050505050565b6103a1838383610d9f565b505050565b6103dd604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b8152506110a8565b6034546001600160a01b0316331461044e5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6104856040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b8152506110a8565b6035546001600160a01b038481169116146104f45760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b6064820152608401610445565b61052b604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b8152506110a8565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82161055a602060008486611bda565b61056391611c04565b0361065e5761059f6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b8152506110a8565b6105d6604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b8152506110a8565b6105eb6105e68260208186611bda565b6110ee565b6106226040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b8152506110a8565b610659604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b8152506110a8565b6108ca565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861068d602060008486611bda565b61069691611c04565b03610783576106d260405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b8152506110a8565b610709604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b8152506110a8565b6107138282611364565b61074b6040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b8152506110a8565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b8152506110a8565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107b2602060008486611bda565b6107bb91611c04565b0361083a576107f86040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b8152506110a8565b61080282826115ca565b610659604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b8152506110a8565b6108726040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b8152506110a8565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b6064820152608401610445565b50505050565b6108db823383610d9f565b5050565b336002600160a01b03146109235760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610445565b600054610100900460ff16158080156109435750600054600160ff909116105b8061095d5750303b15801561095d575060005460ff166001145b6109c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b6000805460ff1916600117905580156109e3576000805461ff0019166101001790555b6109ef85858585611738565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b84610a458161182d565b610a615760405162461bcd60e51b815260040161044590611c22565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac59190611c64565b6001600160a01b03818116600090815260376020526040902054919250888116911614610b045760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610b1a57610b1a611cc5565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b869190611c64565b6001600160a01b031614610b9c57610b9c611cc5565b848314610bf75760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b6064820152608401610445565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c2790339088908890600401611d0d565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611d3b565b610c865760405162461bcd60e51b815260040161044590611d5d565b6033546035546040516001600160a01b03928316926316f19831921690610cdd907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611de7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d09929190611e81565b600060405180830381600087803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610d8e9493929190611ead565b60405180910390a450505050505050565b82610da98161182d565b610dc55760405162461bcd60e51b815260040161044590611c22565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611c64565b6001600160a01b03818116600090815260376020526040902054919250868116911614610e685760405162461bcd60e51b815260040161044590611c81565b6001600160a01b038116610e7e57610e7e611cc5565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190611c64565b6001600160a01b031614610f0057610f00611cc5565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610f2e9033908790600401611edf565b6020604051808303816000875af1158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190611d3b565b610f8d5760405162461bcd60e51b815260040161044590611d5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110189391169160c401611e81565b600060405180830381600087803b15801561103257600080fd5b505af1158015611046573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051611099929190611edf565b60405180910390a45050505050565b6110eb816040516024016110bc9190611ef8565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118c2565b50565b60008080806110ff85870187611f0b565b6001600160a01b03808516600090815260376020526040902054949850929650909450925016806111425760405162461bcd60e51b815260040161044590611c81565b61114b8161182d565b61115757611157611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bb9190611c64565b9050856001600160a01b0316816001600160a01b0316146111de576111de611cc5565b6001600160a01b0381166111f4576111f4611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561123c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112609190611c64565b6001600160a01b03161461127657611276611cc5565b6040516340c10f1960e01b81526001600160a01b038316906340c10f19906112a49087908790600401611edf565b6020604051808303816000875af11580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e79190611d3b565b6113035760405162461bcd60e51b815260040161044590611f5c565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611352929190611edf565b60405180910390a45050505050505050565b600080808061137585870187612071565b6001600160a01b038085166000908152603760205260409020549499509297509095509350169050806113ba5760405162461bcd60e51b815260040161044590611c81565b6113c38161182d565b6113cf576113cf611cc5565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190611c64565b9050856001600160a01b0316816001600160a01b03161461145657611456611cc5565b6001600160a01b03811661146c5761146c611cc5565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d89190611c64565b6001600160a01b0316146114ee576114ee611cc5565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d99061151c9087908790600401612163565b6020604051808303816000875af115801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190611d3b565b61157b5760405162461bcd60e51b815260040161044590611f5c565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611352929190612163565b600080806115da84860186612256565b91955093509150506001600160a01b0383166115f8576115f8611cc5565b6001600160a01b03838116600090815260376020526040902054161561162057611620611cc5565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611670916001600160a01b0390911690603401604051602081830303815290604052805190602001206118cb565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b8152919250906390657147906116c6908790879087906004016122d5565b600060405180830381600087803b1580156116e057600080fd5b505af11580156116f4573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061175857506001600160a01b03831615155b801561176c57506001600160a01b03821615155b801561178057506001600160a01b03811615155b6117dd5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b6064820152608401610445565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361184957506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118b0575060408051601f3d908101601f191682019092526118ad91810190611d3b565b60015b6118bc57506000919050565b92915050565b6110eb81611962565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118bc5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610445565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146110eb57600080fd5b60008083601f8401126119aa57600080fd5b5081356001600160401b038111156119c157600080fd5b6020830191508360208260051b85010111156119dc57600080fd5b9250929050565b6000806000806000606086880312156119fb57600080fd5b8535611a0681611983565b945060208601356001600160401b0380821115611a2257600080fd5b611a2e89838a01611998565b90965094506040880135915080821115611a4757600080fd5b50611a5488828901611998565b969995985093965092949392505050565b600060208284031215611a7757600080fd5b8135611a8281611983565b9392505050565b600080600060608486031215611a9e57600080fd5b8335611aa981611983565b92506020840135611ab981611983565b929592945050506040919091013590565b60008060008060608587031215611ae057600080fd5b843593506020850135611af281611983565b925060408501356001600160401b0380821115611b0e57600080fd5b818701915087601f830112611b2257600080fd5b813581811115611b3157600080fd5b886020828501011115611b4357600080fd5b95989497505060200194505050565b60008060408385031215611b6557600080fd5b8235611b7081611983565b946020939093013593505050565b60008060008060808587031215611b9457600080fd5b8435611b9f81611983565b93506020850135611baf81611983565b92506040850135611bbf81611983565b91506060850135611bcf81611983565b939692955090935050565b60008085851115611bea57600080fd5b83861115611bf757600080fd5b5050820193919092039150565b803560208310156118bc57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b600060208284031215611c7657600080fd5b8151611a8281611983565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611cf457600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0384168152604060208201819052600090611d329083018486611cdb565b95945050505050565b600060208284031215611d4d57600080fd5b81518015158114611a8257600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611ddc578135611dc181611983565b6001600160a01b031687529582019590820190600101611dae565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611e1a9083018688611d9e565b8281036080840152611e2d818587611cdb565b9a9950505050505050505050565b6000815180845260005b81811015611e6157602081850181015186830182015201611e45565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611ea590830184611e3b565b949350505050565b604081526000611ec1604083018688611d9e565b8281036020840152611ed4818587611cdb565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b602081526000611a826020830184611e3b565b60008060008060808587031215611f2157600080fd5b8435611f2c81611983565b93506020850135611f3c81611983565b92506040850135611f4c81611983565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fdb57611fdb611f9d565b604052919050565b60006001600160401b03821115611ffc57611ffc611f9d565b5060051b60200190565b600082601f83011261201757600080fd5b8135602061202c61202783611fe3565b611fb3565b82815260059290921b8401810191818101908684111561204b57600080fd5b8286015b84811015612066578035835291830191830161204f565b509695505050505050565b600080600080600060a0868803121561208957600080fd5b8535945060208087013561209c81611983565b945060408701356120ac81611983565b935060608701356001600160401b03808211156120c857600080fd5b818901915089601f8301126120dc57600080fd5b81356120ea61202782611fe3565b81815260059190911b8301840190848101908c83111561210957600080fd5b938501935b8285101561213057843561212181611983565b8252938501939085019061210e565b96505050608089013592508083111561214857600080fd5b505061215688828901612006565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156121a55781516001600160a01b031684529284019290840190600101612180565b5050508381038285015284518082528583019183019060005b818110156121da578351835292840192918401916001016121be565b5090979650505050505050565b600082601f8301126121f857600080fd5b81356001600160401b0381111561221157612211611f9d565b612224601f8201601f1916602001611fb3565b81815284602083860101111561223957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561226c57600080fd5b84359350602085013561227e81611983565b925060408501356001600160401b038082111561229a57600080fd5b6122a6888389016121e7565b935060608701359150808211156122bc57600080fd5b506122c9878288016121e7565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906122f990830185611e3b565b828103604084015261230b8185611e3b565b969550505050505056fea2646970667358221220741155e0346f92320f8a88455bb9a1d38fea5128fee6f0019f35598b488bdb2264736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC721PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721PredicateAccessList","sourceName":"contracts/child/ChildERC721PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612adf806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e61025936600461200a565b610459565b005b61025e610475565b61025e610489565b6101c861027e36600461208c565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e6103063660046120be565b610508565b61025e6103193660046120db565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e6103533660046120be565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b436600461211c565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e13660046121b2565b6106d7565b61025e6103f436600461208c565b610bfc565b61025e61040736600461223a565b610c6d565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004612266565b610c84565b610461610d7c565b61046e8585858585610d84565b5050505050565b61047d6110e9565b6104876000611143565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581611143565b50565b6105106110e9565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610d7c565b61056a83838361115c565b505050565b6105776110e9565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b61066288888888611466565b60c9805461ffff191685151561ff001916176101008515150217905561068782611143565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61070e604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b81525061155b565b60fd546001600160a01b0316331461077a5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b6107b16040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b81525061155b565b60fe546001600160a01b038481169116146108205760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b610857604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b81525061155b565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610886602060008486612334565b61088f9161235e565b0361098a576108cb6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b81525061155b565b610902604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b81525061155b565b6109176109128260208186612334565b61159e565b61094e6040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b81525061155b565b610985604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b81525061155b565b610bf6565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109b9602060008486612334565b6109c29161235e565b03610aaf576109fe60405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b81525061155b565b610a35604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b81525061155b565b610a3f8282611815565b610a776040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b81525061155b565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b81525061155b565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610ade602060008486612334565b610ae79161235e565b03610b6657610b246040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b81525061155b565b610b2e8282611a7c565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b81525061155b565b610b9e6040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b81525061155b565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b610c046110e9565b606580546001600160a01b0383166001600160a01b03199091168117909155610c356033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610c75610d7c565b610c8082338361115c565b5050565b336002600160a01b0314610cab5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff1615808015610ccb5750600054600160ff909116105b80610ce55750303b158015610ce5575060005460ff166001145b610d015760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610d24576000805461ff0019166101001790555b610d3085858585611466565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b610487611bec565b84610d8e81611e02565b610daa5760405162461bcd60e51b81526004016104f39061237c565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906123be565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610e4e5760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b038116610e6457610e6461241f565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed091906123be565b6001600160a01b031614610ee657610ee661241f565b848314610f415760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610f7190339088908890600401612467565b6020604051808303816000875af1158015610f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb49190612495565b610fd05760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe546040516001600160a01b03928316926316f19831921690611027907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d9060200161253c565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110539291906125e0565b600060405180830381600087803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f522898989896040516110d8949392919061260c565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611e97565b8261116681611e02565b6111825760405162461bcd60e51b81526004016104f39061237c565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906123be565b6001600160a01b03818116600090815261010060205260409020549192508681169116146112265760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b03811661123c5761123c61241f565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906123be565b6001600160a01b0316146112be576112be61241f565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac906112ec903390879060040161263e565b6020604051808303816000875af115801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132f9190612495565b61134b5760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936113d69391169160c4016125e0565b600060405180830381600087803b1580156113f057600080fd5b505af1158015611404573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b013338760405161145792919061263e565b60405180910390a45050505050565b6001600160a01b0384161580159061148657506001600160a01b03831615155b801561149a57506001600160a01b03821615155b80156114ae57506001600160a01b03811615155b61150b5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6105058160405160240161156f9190612657565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611ee9565b60008080806115af8587018761266a565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806115f35760405162461bcd60e51b81526004016104f3906123db565b6115fc81611e02565b6116085761160861241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906123be565b9050856001600160a01b0316816001600160a01b03161461168f5761168f61241f565b6001600160a01b0381166116a5576116a561241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171191906123be565b6001600160a01b0316146117275761172761241f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611755908790879060040161263e565b6020604051808303816000875af1158015611774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117989190612495565b6117b45760405162461bcd60e51b81526004016104f3906126bb565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b1611888760405161180392919061263e565b60405180910390a45050505050505050565b6000808080611826858701876127d0565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061186c5760405162461bcd60e51b81526004016104f3906123db565b61187581611e02565b6118815761188161241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906123be565b9050856001600160a01b0316816001600160a01b0316146119085761190861241f565b6001600160a01b03811661191e5761191e61241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a91906123be565b6001600160a01b0316146119a0576119a061241f565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906119ce90879087906004016128c2565b6020604051808303816000875af11580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a119190612495565b611a2d5760405162461bcd60e51b81526004016104f3906126bb565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516118039291906128c2565b60008080611a8c848601866129b5565b91955093509150506001600160a01b038316611aaa57611aaa61241f565b6001600160a01b03838116600090815261010060205260409020541615611ad357611ad361241f565b60ff546040516bffffffffffffffffffffffff19606086901b166020820152600091611b23916001600160a01b039091169060340160405160208183030381529060405280519060200120611ef2565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611b7a90879087908790600401612a34565b600060405180830381600087803b158015611b9457600080fd5b505af1158015611ba8573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff1615611cf757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611c4e9190612a74565b6000604051808303818686fa925050503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091509150818015611cb45750600081806020019051810190611cb29190612a90565b115b611cf45760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611d5e9190612a74565b6000604051808303818686fa925050503d8060008114611d9a576040519150601f19603f3d011682016040523d82523d6000602084013e611d9f565b606091505b5091509150818015611dc5575080806020019051810190611dc09190612a90565b600114155b610c805760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611e1e57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611e85575060408051601f3d908101601f19168201909252611e8291810190612495565b60015b611e9157506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61050581611f89565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611e915760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461050557600080fd5b60008083601f840112611fd157600080fd5b5081356001600160401b03811115611fe857600080fd5b6020830191508360208260051b850101111561200357600080fd5b9250929050565b60008060008060006060868803121561202257600080fd5b853561202d81611faa565b945060208601356001600160401b038082111561204957600080fd5b61205589838a01611fbf565b9096509450604088013591508082111561206e57600080fd5b5061207b88828901611fbf565b969995985093965092949392505050565b60006020828403121561209e57600080fd5b81356120a981611faa565b9392505050565b801515811461050557600080fd5b6000602082840312156120d057600080fd5b81356120a9816120b0565b6000806000606084860312156120f057600080fd5b83356120fb81611faa565b9250602084013561210b81611faa565b929592945050506040919091013590565b600080600080600080600060e0888a03121561213757600080fd5b873561214281611faa565b9650602088013561215281611faa565b9550604088013561216281611faa565b9450606088013561217281611faa565b93506080880135612182816120b0565b925060a0880135612192816120b0565b915060c08801356121a281611faa565b8091505092959891949750929550565b600080600080606085870312156121c857600080fd5b8435935060208501356121da81611faa565b925060408501356001600160401b03808211156121f657600080fd5b818701915087601f83011261220a57600080fd5b81358181111561221957600080fd5b88602082850101111561222b57600080fd5b95989497505060200194505050565b6000806040838503121561224d57600080fd5b823561225881611faa565b946020939093013593505050565b6000806000806080858703121561227c57600080fd5b843561228781611faa565b9350602085013561229781611faa565b925060408501356122a781611faa565b915060608501356122b781611faa565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561234457600080fd5b8386111561235157600080fd5b5050820193919092039150565b80356020831015611e9157600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b6000602082840312156123d057600080fd5b81516120a981611faa565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561244e57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061248c9083018486612435565b95945050505050565b6000602082840312156124a757600080fd5b81516120a9816120b0565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b8581101561253157813561251681611faa565b6001600160a01b031687529582019590820190600101612503565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061256f90830186886124f3565b8281036080840152612582818587612435565b9a9950505050505050505050565b60005b838110156125ab578181015183820152602001612593565b50506000910152565b600081518084526125cc816020860160208601612590565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612604908301846125b4565b949350505050565b6040815260006126206040830186886124f3565b8281036020840152612633818587612435565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006120a960208301846125b4565b6000806000806080858703121561268057600080fd5b843561268b81611faa565b9350602085013561269b81611faa565b925060408501356126ab81611faa565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561273a5761273a6126fc565b604052919050565b60006001600160401b0382111561275b5761275b6126fc565b5060051b60200190565b600082601f83011261277657600080fd5b8135602061278b61278683612742565b612712565b82815260059290921b840181019181810190868411156127aa57600080fd5b8286015b848110156127c557803583529183019183016127ae565b509695505050505050565b600080600080600060a086880312156127e857600080fd5b853594506020808701356127fb81611faa565b9450604087013561280b81611faa565b935060608701356001600160401b038082111561282757600080fd5b818901915089601f83011261283b57600080fd5b813561284961278682612742565b81815260059190911b8301840190848101908c83111561286857600080fd5b938501935b8285101561288f57843561288081611faa565b8252938501939085019061286d565b9650505060808901359250808311156128a757600080fd5b50506128b588828901612765565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156129045781516001600160a01b0316845292840192908401906001016128df565b5050508381038285015284518082528583019183019060005b818110156129395783518352928401929184019160010161291d565b5090979650505050505050565b600082601f83011261295757600080fd5b81356001600160401b03811115612970576129706126fc565b612983601f8201601f1916602001612712565b81815284602083860101111561299857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156129cb57600080fd5b8435935060208501356129dd81611faa565b925060408501356001600160401b03808211156129f957600080fd5b612a0588838901612946565b93506060870135915080821115612a1b57600080fd5b50612a2887828801612946565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090612a58908301856125b4565b8281036040840152612a6a81856125b4565b9695505050505050565b60008251612a86818460208701612590565b9190910192915050565b600060208284031215612aa257600080fd5b505191905056fea264697066735822122044644a695e67b11faad02d8e6c3e64baa59733d7beceae5d135f4b7db90089db64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e61025936600461200a565b610459565b005b61025e610475565b61025e610489565b6101c861027e36600461208c565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e6103063660046120be565b610508565b61025e6103193660046120db565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e6103533660046120be565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b436600461211c565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e13660046121b2565b6106d7565b61025e6103f436600461208c565b610bfc565b61025e61040736600461223a565b610c6d565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004612266565b610c84565b610461610d7c565b61046e8585858585610d84565b5050505050565b61047d6110e9565b6104876000611143565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581611143565b50565b6105106110e9565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610d7c565b61056a83838361115c565b505050565b6105776110e9565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b61066288888888611466565b60c9805461ffff191685151561ff001916176101008515150217905561068782611143565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61070e604051806040016040528060168152602001754368696c64455243373231507265646963617465203160501b81525061155b565b60fd546001600160a01b0316331461077a5760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b6107b16040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901960511b81525061155b565b60fe546001600160a01b038481169116146108205760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b610857604051806040016040528060168152602001754368696c64455243373231507265646963617465203360501b81525061155b565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610886602060008486612334565b61088f9161235e565b0361098a576108cb6040518060400160405280601681526020017510da1a5b19115490cdcc8c541c99591a58d85d19480d60521b81525061155b565b610902604051806040016040528060168152602001754368696c64455243373231507265646963617465203560501b81525061155b565b6109176109128260208186612334565b61159e565b61094e6040518060400160405280601681526020017521b434b63222a9219b9918a83932b234b1b0ba32901b60511b81525061155b565b610985604051806040016040528060168152602001754368696c64455243373231507265646963617465203760501b81525061155b565b610bf6565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109b9602060008486612334565b6109c29161235e565b03610aaf576109fe60405180604001604052806016815260200175086d0d2d8c88aa4866e6462a0e4cac8d2c6c2e8ca40760531b81525061155b565b610a35604051806040016040528060168152602001754368696c64455243373231507265646963617465203960501b81525061155b565b610a3f8282611815565b610a776040518060400160405280601781526020017604368696c6445524337323150726564696361746520313604c1b81525061155b565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313160481b81525061155b565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610ade602060008486612334565b610ae79161235e565b03610b6657610b246040518060400160405280601781526020017621b434b63222a9219b9918a83932b234b1b0ba3290189960491b81525061155b565b610b2e8282611a7c565b610985604051806040016040528060178152602001764368696c6445524337323150726564696361746520313360481b81525061155b565b610b9e6040518060400160405280601781526020017610da1a5b19115490cdcc8c541c99591a58d85d19480c4d604a1b81525061155b565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b610c046110e9565b606580546001600160a01b0383166001600160a01b03199091168117909155610c356033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610c75610d7c565b610c8082338361115c565b5050565b336002600160a01b0314610cab5760405163973d02cb60e01b81526004016104f3906122c2565b600054610100900460ff1615808015610ccb5750600054600160ff909116105b80610ce55750303b158015610ce5575060005460ff166001145b610d015760405162461bcd60e51b81526004016104f3906122e6565b6000805460ff191660011790558015610d24576000805461ff0019166101001790555b610d3085858585611466565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b610487611bec565b84610d8e81611e02565b610daa5760405162461bcd60e51b81526004016104f39061237c565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906123be565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610e4e5760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b038116610e6457610e6461241f565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed091906123be565b6001600160a01b031614610ee657610ee661241f565b848314610f415760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610f7190339088908890600401612467565b6020604051808303816000875af1158015610f90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb49190612495565b610fd05760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe546040516001600160a01b03928316926316f19831921690611027907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d9060200161253c565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110539291906125e0565b600060405180830381600087803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f522898989896040516110d8949392919061260c565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611e97565b8261116681611e02565b6111825760405162461bcd60e51b81526004016104f39061237c565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906123be565b6001600160a01b03818116600090815261010060205260409020549192508681169116146112265760405162461bcd60e51b81526004016104f3906123db565b6001600160a01b03811661123c5761123c61241f565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906123be565b6001600160a01b0316146112be576112be61241f565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac906112ec903390879060040161263e565b6020604051808303816000875af115801561130b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132f9190612495565b61134b5760405162461bcd60e51b81526004016104f3906124b2565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936113d69391169160c4016125e0565b600060405180830381600087803b1580156113f057600080fd5b505af1158015611404573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b013338760405161145792919061263e565b60405180910390a45050505050565b6001600160a01b0384161580159061148657506001600160a01b03831615155b801561149a57506001600160a01b03821615155b80156114ae57506001600160a01b03811615155b61150b5760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6105058160405160240161156f9190612657565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611ee9565b60008080806115af8587018761266a565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806115f35760405162461bcd60e51b81526004016104f3906123db565b6115fc81611e02565b6116085761160861241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166c91906123be565b9050856001600160a01b0316816001600160a01b03161461168f5761168f61241f565b6001600160a01b0381166116a5576116a561241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171191906123be565b6001600160a01b0316146117275761172761241f565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611755908790879060040161263e565b6020604051808303816000875af1158015611774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117989190612495565b6117b45760405162461bcd60e51b81526004016104f3906126bb565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b1611888760405161180392919061263e565b60405180910390a45050505050505050565b6000808080611826858701876127d0565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061186c5760405162461bcd60e51b81526004016104f3906123db565b61187581611e02565b6118815761188161241f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e591906123be565b9050856001600160a01b0316816001600160a01b0316146119085761190861241f565b6001600160a01b03811661191e5761191e61241f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198a91906123be565b6001600160a01b0316146119a0576119a061241f565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906119ce90879087906004016128c2565b6020604051808303816000875af11580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a119190612495565b611a2d5760405162461bcd60e51b81526004016104f3906126bb565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516118039291906128c2565b60008080611a8c848601866129b5565b91955093509150506001600160a01b038316611aaa57611aaa61241f565b6001600160a01b03838116600090815261010060205260409020541615611ad357611ad361241f565b60ff546040516bffffffffffffffffffffffff19606086901b166020820152600091611b23916001600160a01b039091169060340160405160208183030381529060405280519060200120611ef2565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611b7a90879087908790600401612a34565b600060405180830381600087803b158015611b9457600080fd5b505af1158015611ba8573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff1615611cf757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611c4e9190612a74565b6000604051808303818686fa925050503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b5091509150818015611cb45750600081806020019051810190611cb29190612a90565b115b611cf45760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611d5e9190612a74565b6000604051808303818686fa925050503d8060008114611d9a576040519150601f19603f3d011682016040523d82523d6000602084013e611d9f565b606091505b5091509150818015611dc5575080806020019051810190611dc09190612a90565b600114155b610c805760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611e1e57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611e85575060408051601f3d908101601f19168201909252611e8291810190612495565b60015b611e9157506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61050581611f89565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611e915760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461050557600080fd5b60008083601f840112611fd157600080fd5b5081356001600160401b03811115611fe857600080fd5b6020830191508360208260051b850101111561200357600080fd5b9250929050565b60008060008060006060868803121561202257600080fd5b853561202d81611faa565b945060208601356001600160401b038082111561204957600080fd5b61205589838a01611fbf565b9096509450604088013591508082111561206e57600080fd5b5061207b88828901611fbf565b969995985093965092949392505050565b60006020828403121561209e57600080fd5b81356120a981611faa565b9392505050565b801515811461050557600080fd5b6000602082840312156120d057600080fd5b81356120a9816120b0565b6000806000606084860312156120f057600080fd5b83356120fb81611faa565b9250602084013561210b81611faa565b929592945050506040919091013590565b600080600080600080600060e0888a03121561213757600080fd5b873561214281611faa565b9650602088013561215281611faa565b9550604088013561216281611faa565b9450606088013561217281611faa565b93506080880135612182816120b0565b925060a0880135612192816120b0565b915060c08801356121a281611faa565b8091505092959891949750929550565b600080600080606085870312156121c857600080fd5b8435935060208501356121da81611faa565b925060408501356001600160401b03808211156121f657600080fd5b818701915087601f83011261220a57600080fd5b81358181111561221957600080fd5b88602082850101111561222b57600080fd5b95989497505060200194505050565b6000806040838503121561224d57600080fd5b823561225881611faa565b946020939093013593505050565b6000806000806080858703121561227c57600080fd5b843561228781611faa565b9350602085013561229781611faa565b925060408501356122a781611faa565b915060608501356122b781611faa565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561234457600080fd5b8386111561235157600080fd5b5050820193919092039150565b80356020831015611e9157600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b6000602082840312156123d057600080fd5b81516120a981611faa565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561244e57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061248c9083018486612435565b95945050505050565b6000602082840312156124a757600080fd5b81516120a9816120b0565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b8581101561253157813561251681611faa565b6001600160a01b031687529582019590820190600101612503565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061256f90830186886124f3565b8281036080840152612582818587612435565b9a9950505050505050505050565b60005b838110156125ab578181015183820152602001612593565b50506000910152565b600081518084526125cc816020860160208601612590565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612604908301846125b4565b949350505050565b6040815260006126206040830186886124f3565b8281036020840152612633818587612435565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006120a960208301846125b4565b6000806000806080858703121561268057600080fd5b843561268b81611faa565b9350602085013561269b81611faa565b925060408501356126ab81611faa565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561273a5761273a6126fc565b604052919050565b60006001600160401b0382111561275b5761275b6126fc565b5060051b60200190565b600082601f83011261277657600080fd5b8135602061278b61278683612742565b612712565b82815260059290921b840181019181810190868411156127aa57600080fd5b8286015b848110156127c557803583529183019183016127ae565b509695505050505050565b600080600080600060a086880312156127e857600080fd5b853594506020808701356127fb81611faa565b9450604087013561280b81611faa565b935060608701356001600160401b038082111561282757600080fd5b818901915089601f83011261283b57600080fd5b813561284961278682612742565b81815260059190911b8301840190848101908c83111561286857600080fd5b938501935b8285101561288f57843561288081611faa565b8252938501939085019061286d565b9650505060808901359250808311156128a757600080fd5b50506128b588828901612765565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156129045781516001600160a01b0316845292840192908401906001016128df565b5050508381038285015284518082528583019183019060005b818110156129395783518352928401929184019160010161291d565b5090979650505050505050565b600082601f83011261295757600080fd5b81356001600160401b03811115612970576129706126fc565b612983601f8201601f1916602001612712565b81815284602083860101111561299857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156129cb57600080fd5b8435935060208501356129dd81611faa565b925060408501356001600160401b03808211156129f957600080fd5b612a0588838901612946565b93506060870135915080821115612a1b57600080fd5b50612a2887828801612946565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090612a58908301856125b4565b8281036040840152612a6a81856125b4565b9695505050505050565b60008251612a86818460208701612590565b9190910192915050565b600060208284031215612aa257600080fd5b505191905056fea264697066735822122044644a695e67b11faad02d8e6c3e64baa59733d7beceae5d135f4b7db90089db64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC721PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721Predicate","sourceName":"contracts/child/ChildERC721Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611fc4806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b61020661020136600461166f565b610382565b005b6101706102163660046116f1565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611715565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611756565b6103a6565b6102066103303660046117de565b6105c9565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d36600461180a565b6105d8565b61038f8585858585610734565b5050505050565b6103a1838383610a98565b505050565b6034546001600160a01b031633146104175760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104865760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b606482015260840161040e565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104b5602060008486611866565b6104be91611890565b036104dd576104d86104d38260208186611866565b610da1565b6105c3565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861050c602060008486611866565b61051591611890565b03610524576104d88282611017565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610553602060008486611866565b61055c91611890565b0361056b576104d8828261127d565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b606482015260840161040e565b50505050565b6105d4823383610a98565b5050565b336002600160a01b031461061c5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161040e565b600054610100900460ff161580801561063c5750600054600160ff909116105b806106565750303b158015610656575060005460ff166001145b6106b95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161040e565b6000805460ff1916600117905580156106dc576000805461ff0019166101001790555b6106e8858585856113eb565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b8461073e816114e0565b61075a5760405162461bcd60e51b815260040161040e906118ae565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be91906118f0565b6001600160a01b038181166000908152603760205260409020549192508881169116146107fd5760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b03811661081357610813611951565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f91906118f0565b6001600160a01b03161461089557610895611951565b8483146108f05760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b606482015260840161040e565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc39061092090339088908890600401611999565b6020604051808303816000875af115801561093f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096391906119c7565b61097f5760405162461bcd60e51b815260040161040e906119e9565b6033546035546040516001600160a01b03928316926316f198319216906109d6907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611a73565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a02929190611b0d565b600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610a879493929190611b39565b60405180910390a450505050505050565b82610aa2816114e0565b610abe5760405162461bcd60e51b815260040161040e906118ae565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2291906118f0565b6001600160a01b03818116600090815260376020526040902054919250868116911614610b615760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b038116610b7757610b77611951565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be391906118f0565b6001600160a01b031614610bf957610bf9611951565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610c279033908790600401611b6b565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a91906119c7565b610c865760405162461bcd60e51b815260040161040e906119e9565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610d119391169160c401611b0d565b600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051610d92929190611b6b565b60405180910390a45050505050565b6000808080610db285870187611b84565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610df55760405162461bcd60e51b815260040161040e9061190d565b610dfe816114e0565b610e0a57610e0a611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6e91906118f0565b9050856001600160a01b0316816001600160a01b031614610e9157610e91611951565b6001600160a01b038116610ea757610ea7611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906118f0565b6001600160a01b031614610f2957610f29611951565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f579087908790600401611b6b565b6020604051808303816000875af1158015610f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9a91906119c7565b610fb65760405162461bcd60e51b815260040161040e90611bd5565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611005929190611b6b565b60405180910390a45050505050505050565b600080808061102885870187611cea565b6001600160a01b0380851660009081526037602052604090205494995092975090955093501690508061106d5760405162461bcd60e51b815260040161040e9061190d565b611076816114e0565b61108257611082611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e691906118f0565b9050856001600160a01b0316816001600160a01b03161461110957611109611951565b6001600160a01b03811661111f5761111f611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b91906118f0565b6001600160a01b0316146111a1576111a1611951565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906111cf9087908790600401611ddc565b6020604051808303816000875af11580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121291906119c7565b61122e5760405162461bcd60e51b815260040161040e90611bd5565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611005929190611ddc565b6000808061128d84860186611ecf565b91955093509150506001600160a01b0383166112ab576112ab611951565b6001600160a01b0383811660009081526037602052604090205416156112d3576112d3611951565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611323916001600160a01b039091169060340160405160208183030381529060405280519060200120611575565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b81529192509063906571479061137990879087908790600401611f4e565b600060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061140b57506001600160a01b03831615155b801561141f57506001600160a01b03821615155b801561143357506001600160a01b03811615155b6114905760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b606482015260840161040e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b6000036114fc57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611563575060408051601f3d908101601f19168201909252611560918101906119c7565b60015b61156f57506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661156f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161040e565b6001600160a01b038116811461162157600080fd5b50565b60008083601f84011261163657600080fd5b5081356001600160401b0381111561164d57600080fd5b6020830191508360208260051b850101111561166857600080fd5b9250929050565b60008060008060006060868803121561168757600080fd5b85356116928161160c565b945060208601356001600160401b03808211156116ae57600080fd5b6116ba89838a01611624565b909650945060408801359150808211156116d357600080fd5b506116e088828901611624565b969995985093965092949392505050565b60006020828403121561170357600080fd5b813561170e8161160c565b9392505050565b60008060006060848603121561172a57600080fd5b83356117358161160c565b925060208401356117458161160c565b929592945050506040919091013590565b6000806000806060858703121561176c57600080fd5b84359350602085013561177e8161160c565b925060408501356001600160401b038082111561179a57600080fd5b818701915087601f8301126117ae57600080fd5b8135818111156117bd57600080fd5b8860208285010111156117cf57600080fd5b95989497505060200194505050565b600080604083850312156117f157600080fd5b82356117fc8161160c565b946020939093013593505050565b6000806000806080858703121561182057600080fd5b843561182b8161160c565b9350602085013561183b8161160c565b9250604085013561184b8161160c565b9150606085013561185b8161160c565b939692955090935050565b6000808585111561187657600080fd5b8386111561188357600080fd5b5050820193919092039150565b8035602083101561156f57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561190257600080fd5b815161170e8161160c565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561198057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03841681526040602082018190526000906119be9083018486611967565b95945050505050565b6000602082840312156119d957600080fd5b8151801515811461170e57600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611a68578135611a4d8161160c565b6001600160a01b031687529582019590820190600101611a3a565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611aa69083018688611a2a565b8281036080840152611ab9818587611967565b9a9950505050505050505050565b6000815180845260005b81811015611aed57602081850181015186830182015201611ad1565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611b3190830184611ac7565b949350505050565b604081526000611b4d604083018688611a2a565b8281036020840152611b60818587611967565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b9a57600080fd5b8435611ba58161160c565b93506020850135611bb58161160c565b92506040850135611bc58161160c565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c5457611c54611c16565b604052919050565b60006001600160401b03821115611c7557611c75611c16565b5060051b60200190565b600082601f830112611c9057600080fd5b81356020611ca5611ca083611c5c565b611c2c565b82815260059290921b84018101918181019086841115611cc457600080fd5b8286015b84811015611cdf5780358352918301918301611cc8565b509695505050505050565b600080600080600060a08688031215611d0257600080fd5b85359450602080870135611d158161160c565b94506040870135611d258161160c565b935060608701356001600160401b0380821115611d4157600080fd5b818901915089601f830112611d5557600080fd5b8135611d63611ca082611c5c565b81815260059190911b8301840190848101908c831115611d8257600080fd5b938501935b82851015611da9578435611d9a8161160c565b82529385019390850190611d87565b965050506080890135925080831115611dc157600080fd5b5050611dcf88828901611c7f565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b82811015611e1e5781516001600160a01b031684529284019290840190600101611df9565b5050508381038285015284518082528583019183019060005b81811015611e5357835183529284019291840191600101611e37565b5090979650505050505050565b600082601f830112611e7157600080fd5b81356001600160401b03811115611e8a57611e8a611c16565b611e9d601f8201601f1916602001611c2c565b818152846020838601011115611eb257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611ee557600080fd5b843593506020850135611ef78161160c565b925060408501356001600160401b0380821115611f1357600080fd5b611f1f88838901611e60565b93506060870135915080821115611f3557600080fd5b50611f4287828801611e60565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090611f7290830185611ac7565b8281036040840152611f848185611ac7565b969550505050505056fea264697066735822122081e46b99b49bcb8dea5f01175766e4aca327da04a0662d01672b6f776a5e701164736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063b1768065116100c3578063e0563ab11161007c578063e0563ab114610306578063eeb499451461030f578063f3fef3a314610322578063f645125514610335578063f691325c1461035c578063f8c8765e1461036f57600080fd5b8063b176806514610244578063b68ad1e41461026b578063c3b35a7e1461027e578063c5ac2b1c14610291578063d41f1771146102b8578063d7c9e3ec146102df57600080fd5b806355b01e4d1161011557806355b01e4d146101ce5780635ea5df79146101dc5780636f33e695146101f35780637efab4f514610208578063947287cf1461023157806397e5230d1461023a57600080fd5b806305dc2e8f1461015d57806307b3e2521461018d5780631bc114ba1461019b578063284017f5146101ae5780633b878c22146101b757806351351d53146101c0575b600080fd5b603454610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101e561138881565b604051908152602001610184565b61020661020136600461166f565b610382565b005b6101706102163660046116f1565b6037602052600090815260409020546001600160a01b031681565b6101e561520881565b6101e5620249f081565b6101e57f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610170906001600160a01b031681565b61020661028c366004611715565b610396565b6101e57faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101e57f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101e57f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b61020661031d366004611756565b6103a6565b6102066103303660046117de565b6105c9565b6101e57f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b603554610170906001600160a01b031681565b61020661037d36600461180a565b6105d8565b61038f8585858585610734565b5050505050565b6103a1838383610a98565b505050565b6034546001600160a01b031633146104175760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104865760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b606482015260840161040e565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104b5602060008486611866565b6104be91611890565b036104dd576104d86104d38260208186611866565b610da1565b6105c3565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1861050c602060008486611866565b61051591611890565b03610524576104d88282611017565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610553602060008486611866565b61055c91611890565b0361056b576104d8828261127d565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b606482015260840161040e565b50505050565b6105d4823383610a98565b5050565b336002600160a01b031461061c5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161040e565b600054610100900460ff161580801561063c5750600054600160ff909116105b806106565750303b158015610656575060005460ff166001145b6106b95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161040e565b6000805460ff1916600117905580156106dc576000805461ff0019166101001790555b6106e8858585856113eb565b801561038f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b8461073e816114e0565b61075a5760405162461bcd60e51b815260040161040e906118ae565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be91906118f0565b6001600160a01b038181166000908152603760205260409020549192508881169116146107fd5760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b03811661081357610813611951565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f91906118f0565b6001600160a01b03161461089557610895611951565b8483146108f05760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b606482015260840161040e565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc39061092090339088908890600401611999565b6020604051808303816000875af115801561093f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096391906119c7565b61097f5760405162461bcd60e51b815260040161040e906119e9565b6033546035546040516001600160a01b03928316926316f198319216906109d6907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d90602001611a73565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a02929190611b0d565b600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610a879493929190611b39565b60405180910390a450505050505050565b82610aa2816114e0565b610abe5760405162461bcd60e51b815260040161040e906118ae565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2291906118f0565b6001600160a01b03818116600090815260376020526040902054919250868116911614610b615760405162461bcd60e51b815260040161040e9061190d565b6001600160a01b038116610b7757610b77611951565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be391906118f0565b6001600160a01b031614610bf957610bf9611951565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610c279033908790600401611b6b565b6020604051808303816000875af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a91906119c7565b610c865760405162461bcd60e51b815260040161040e906119e9565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610d119391169160c401611b0d565b600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b0133387604051610d92929190611b6b565b60405180910390a45050505050565b6000808080610db285870187611b84565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610df55760405162461bcd60e51b815260040161040e9061190d565b610dfe816114e0565b610e0a57610e0a611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6e91906118f0565b9050856001600160a01b0316816001600160a01b031614610e9157610e91611951565b6001600160a01b038116610ea757610ea7611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906118f0565b6001600160a01b031614610f2957610f29611951565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990610f579087908790600401611b6b565b6020604051808303816000875af1158015610f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9a91906119c7565b610fb65760405162461bcd60e51b815260040161040e90611bd5565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b16118887604051611005929190611b6b565b60405180910390a45050505050505050565b600080808061102885870187611cea565b6001600160a01b0380851660009081526037602052604090205494995092975090955093501690508061106d5760405162461bcd60e51b815260040161040e9061190d565b611076816114e0565b61108257611082611951565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e691906118f0565b9050856001600160a01b0316816001600160a01b03161461110957611109611951565b6001600160a01b03811661111f5761111f611951565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b91906118f0565b6001600160a01b0316146111a1576111a1611951565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d9906111cf9087908790600401611ddc565b6020604051808303816000875af11580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121291906119c7565b61122e5760405162461bcd60e51b815260040161040e90611bd5565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed4758787604051611005929190611ddc565b6000808061128d84860186611ecf565b91955093509150506001600160a01b0383166112ab576112ab611951565b6001600160a01b0383811660009081526037602052604090205416156112d3576112d3611951565b6036546040516bffffffffffffffffffffffff19606086901b166020820152600091611323916001600160a01b039091169060340160405160208183030381529060405280519060200120611575565b6001600160a01b038581166000908152603760205260409081902080546001600160a01b031916928416928317905551639065714760e01b81529192509063906571479061137990879087908790600401611f4e565b600060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b6001600160a01b0384161580159061140b57506001600160a01b03831615155b801561141f57506001600160a01b03821615155b801561143357506001600160a01b03811615155b6114905760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b606482015260840161040e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b6000036114fc57506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611563575060408051601f3d908101601f19168201909252611560918101906119c7565b60015b61156f57506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661156f5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161040e565b6001600160a01b038116811461162157600080fd5b50565b60008083601f84011261163657600080fd5b5081356001600160401b0381111561164d57600080fd5b6020830191508360208260051b850101111561166857600080fd5b9250929050565b60008060008060006060868803121561168757600080fd5b85356116928161160c565b945060208601356001600160401b03808211156116ae57600080fd5b6116ba89838a01611624565b909650945060408801359150808211156116d357600080fd5b506116e088828901611624565b969995985093965092949392505050565b60006020828403121561170357600080fd5b813561170e8161160c565b9392505050565b60008060006060848603121561172a57600080fd5b83356117358161160c565b925060208401356117458161160c565b929592945050506040919091013590565b6000806000806060858703121561176c57600080fd5b84359350602085013561177e8161160c565b925060408501356001600160401b038082111561179a57600080fd5b818701915087601f8301126117ae57600080fd5b8135818111156117bd57600080fd5b8860208285010111156117cf57600080fd5b95989497505060200194505050565b600080604083850312156117f157600080fd5b82356117fc8161160c565b946020939093013593505050565b6000806000806080858703121561182057600080fd5b843561182b8161160c565b9350602085013561183b8161160c565b9250604085013561184b8161160c565b9150606085013561185b8161160c565b939692955090935050565b6000808585111561187657600080fd5b8386111561188357600080fd5b5050820193919092039150565b8035602083101561156f57600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561190257600080fd5b815161170e8161160c565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561198057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03841681526040602082018190526000906119be9083018486611967565b95945050505050565b6000602082840312156119d957600080fd5b8151801515811461170e57600080fd5b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b85811015611a68578135611a4d8161160c565b6001600160a01b031687529582019590820190600101611a3a565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a060608201819052600090611aa69083018688611a2a565b8281036080840152611ab9818587611967565b9a9950505050505050505050565b6000815180845260005b81811015611aed57602081850181015186830182015201611ad1565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611b3190830184611ac7565b949350505050565b604081526000611b4d604083018688611a2a565b8281036020840152611b60818587611967565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215611b9a57600080fd5b8435611ba58161160c565b93506020850135611bb58161160c565b92506040850135611bc58161160c565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611c5457611c54611c16565b604052919050565b60006001600160401b03821115611c7557611c75611c16565b5060051b60200190565b600082601f830112611c9057600080fd5b81356020611ca5611ca083611c5c565b611c2c565b82815260059290921b84018101918181019086841115611cc457600080fd5b8286015b84811015611cdf5780358352918301918301611cc8565b509695505050505050565b600080600080600060a08688031215611d0257600080fd5b85359450602080870135611d158161160c565b94506040870135611d258161160c565b935060608701356001600160401b0380821115611d4157600080fd5b818901915089601f830112611d5557600080fd5b8135611d63611ca082611c5c565b81815260059190911b8301840190848101908c831115611d8257600080fd5b938501935b82851015611da9578435611d9a8161160c565b82529385019390850190611d87565b965050506080890135925080831115611dc157600080fd5b5050611dcf88828901611c7f565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b82811015611e1e5781516001600160a01b031684529284019290840190600101611df9565b5050508381038285015284518082528583019183019060005b81811015611e5357835183529284019291840191600101611e37565b5090979650505050505050565b600082601f830112611e7157600080fd5b81356001600160401b03811115611e8a57611e8a611c16565b611e9d601f8201601f1916602001611c2c565b818152846020838601011115611eb257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611ee557600080fd5b843593506020850135611ef78161160c565b925060408501356001600160401b0380821115611f1357600080fd5b611f1f88838901611e60565b93506060870135915080821115611f3557600080fd5b50611f4287828801611e60565b91505092959194509250565b6001600160a01b0384168152606060208201819052600090611f7290830185611ac7565b8281036040840152611f848185611ac7565b969550505050505056fea264697066735822122081e46b99b49bcb8dea5f01175766e4aca327da04a0662d01672b6f776a5e701164736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC721PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC721PredicateAccessList","sourceName":"contracts/child/ChildERC721PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2ERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2ERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC721","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612758806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e610259366004611c96565b610459565b005b61025e610475565b61025e610489565b6101c861027e366004611d18565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e610306366004611d4a565b610508565b61025e610319366004611d67565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e610353366004611d4a565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b4366004611da8565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e1366004611e3e565b6106d7565b61025e6103f4366004611d18565b6108f5565b61025e610407366004611ec6565b610966565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004611ef2565b61097d565b610461610a75565b61046e8585858585610a7d565b5050505050565b61047d610de2565b6104876000610e3c565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581610e3c565b50565b610510610de2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610a75565b61056a838383610e55565b505050565b610577610de2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b6106628888888861115f565b60c9805461ffff191685151561ff001916176101008515150217905561068782610e3c565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107435760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b60fe546001600160a01b038481169116146107b25760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216107e1602060008486611fc0565b6107ea91611fea565b03610809576108046107ff8260208186611fc0565b611254565b6108ef565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610838602060008486611fc0565b61084191611fea565b036108505761080482826114cb565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61087f602060008486611fc0565b61088891611fea565b03610897576108048282611732565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b6108fd610de2565b606580546001600160a01b0383166001600160a01b0319909116811790915561092e6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61096e610a75565b610979823383610e55565b5050565b336002600160a01b03146109a45760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156109c45750600054600160ff909116105b806109de5750303b1580156109de575060005460ff166001145b6109fa5760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610a1d576000805461ff0019166101001790555b610a298585858561115f565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6104876118a2565b84610a8781611ab8565b610aa35760405162461bcd60e51b81526004016104f390612008565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b07919061204a565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610b475760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610b5d57610b5d6120ab565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc9919061204a565b6001600160a01b031614610bdf57610bdf6120ab565b848314610c3a5760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c6a903390889088906004016120f3565b6020604051808303816000875af1158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190612121565b610cc95760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe546040516001600160a01b03928316926316f19831921690610d20907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d906020016121c8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d4c92919061226c565b600060405180830381600087803b158015610d6657600080fd5b505af1158015610d7a573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610dd19493929190612298565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611b4d565b82610e5f81611ab8565b610e7b5760405162461bcd60e51b81526004016104f390612008565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf919061204a565b6001600160a01b0381811660009081526101006020526040902054919250868116911614610f1f5760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610f3557610f356120ab565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa1919061204a565b6001600160a01b031614610fb757610fb76120ab565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610fe590339087906004016122ca565b6020604051808303816000875af1158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612121565b6110445760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110cf9391169160c40161226c565b600060405180830381600087803b1580156110e957600080fd5b505af11580156110fd573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b01333876040516111509291906122ca565b60405180910390a45050505050565b6001600160a01b0384161580159061117f57506001600160a01b03831615155b801561119357506001600160a01b03821615155b80156111a757506001600160a01b03811615155b6112045760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080611265858701876122e3565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806112a95760405162461bcd60e51b81526004016104f390612067565b6112b281611ab8565b6112be576112be6120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611322919061204a565b9050856001600160a01b0316816001600160a01b031614611345576113456120ab565b6001600160a01b03811661135b5761135b6120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c7919061204a565b6001600160a01b0316146113dd576113dd6120ab565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061140b90879087906004016122ca565b6020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190612121565b61146a5760405162461bcd60e51b81526004016104f390612334565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b161188876040516114b99291906122ca565b60405180910390a45050505050505050565b60008080806114dc85870187612449565b6001600160a01b03808516600090815261010060205260409020549499509297509095509350169050806115225760405162461bcd60e51b81526004016104f390612067565b61152b81611ab8565b611537576115376120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b919061204a565b9050856001600160a01b0316816001600160a01b0316146115be576115be6120ab565b6001600160a01b0381166115d4576115d46120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611640919061204a565b6001600160a01b031614611656576116566120ab565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d990611684908790879060040161253b565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190612121565b6116e35760405162461bcd60e51b81526004016104f390612334565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516114b992919061253b565b600080806117428486018661262e565b91955093509150506001600160a01b038316611760576117606120ab565b6001600160a01b03838116600090815261010060205260409020541615611789576117896120ab565b60ff546040516bffffffffffffffffffffffff19606086901b1660208201526000916117d9916001600160a01b039091169060340160405160208183030381529060405280519060200120611b9f565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611830908790879087906004016126ad565b600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff16156119ad57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161190491906126ed565b6000604051808303818686fa925050503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b509150915081801561196a57506000818060200190518101906119689190612709565b115b6119aa5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a1491906126ed565b6000604051808303818686fa925050503d8060008114611a50576040519150601f19603f3d011682016040523d82523d6000602084013e611a55565b606091505b5091509150818015611a7b575080806020019051810190611a769190612709565b600114155b6109795760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611ad457506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611b3b575060408051601f3d908101601f19168201909252611b3891810190612121565b60015b611b4757506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611b475760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b6001600160a01b038116811461050557600080fd5b60008083601f840112611c5d57600080fd5b5081356001600160401b03811115611c7457600080fd5b6020830191508360208260051b8501011115611c8f57600080fd5b9250929050565b600080600080600060608688031215611cae57600080fd5b8535611cb981611c36565b945060208601356001600160401b0380821115611cd557600080fd5b611ce189838a01611c4b565b90965094506040880135915080821115611cfa57600080fd5b50611d0788828901611c4b565b969995985093965092949392505050565b600060208284031215611d2a57600080fd5b8135611d3581611c36565b9392505050565b801515811461050557600080fd5b600060208284031215611d5c57600080fd5b8135611d3581611d3c565b600080600060608486031215611d7c57600080fd5b8335611d8781611c36565b92506020840135611d9781611c36565b929592945050506040919091013590565b600080600080600080600060e0888a031215611dc357600080fd5b8735611dce81611c36565b96506020880135611dde81611c36565b95506040880135611dee81611c36565b94506060880135611dfe81611c36565b93506080880135611e0e81611d3c565b925060a0880135611e1e81611d3c565b915060c0880135611e2e81611c36565b8091505092959891949750929550565b60008060008060608587031215611e5457600080fd5b843593506020850135611e6681611c36565b925060408501356001600160401b0380821115611e8257600080fd5b818701915087601f830112611e9657600080fd5b813581811115611ea557600080fd5b886020828501011115611eb757600080fd5b95989497505060200194505050565b60008060408385031215611ed957600080fd5b8235611ee481611c36565b946020939093013593505050565b60008060008060808587031215611f0857600080fd5b8435611f1381611c36565b93506020850135611f2381611c36565b92506040850135611f3381611c36565b91506060850135611f4381611c36565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611fd057600080fd5b83861115611fdd57600080fd5b5050820193919092039150565b80356020831015611b4757600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561205c57600080fd5b8151611d3581611c36565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156120da57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061211890830184866120c1565b95945050505050565b60006020828403121561213357600080fd5b8151611d3581611d3c565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b858110156121bd5781356121a281611c36565b6001600160a01b03168752958201959082019060010161218f565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906121fb908301868861217f565b828103608084015261220e8185876120c1565b9a9950505050505050505050565b60005b8381101561223757818101518382015260200161221f565b50506000910152565b6000815180845261225881602086016020860161221c565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061229090830184612240565b949350505050565b6040815260006122ac60408301868861217f565b82810360208401526122bf8185876120c1565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156122f957600080fd5b843561230481611c36565b9350602085013561231481611c36565b9250604085013561232481611c36565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156123b3576123b3612375565b604052919050565b60006001600160401b038211156123d4576123d4612375565b5060051b60200190565b600082601f8301126123ef57600080fd5b813560206124046123ff836123bb565b61238b565b82815260059290921b8401810191818101908684111561242357600080fd5b8286015b8481101561243e5780358352918301918301612427565b509695505050505050565b600080600080600060a0868803121561246157600080fd5b8535945060208087013561247481611c36565b9450604087013561248481611c36565b935060608701356001600160401b03808211156124a057600080fd5b818901915089601f8301126124b457600080fd5b81356124c26123ff826123bb565b81815260059190911b8301840190848101908c8311156124e157600080fd5b938501935b828510156125085784356124f981611c36565b825293850193908501906124e6565b96505050608089013592508083111561252057600080fd5b505061252e888289016123de565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b8281101561257d5781516001600160a01b031684529284019290840190600101612558565b5050508381038285015284518082528583019183019060005b818110156125b257835183529284019291840191600101612596565b5090979650505050505050565b600082601f8301126125d057600080fd5b81356001600160401b038111156125e9576125e9612375565b6125fc601f8201601f191660200161238b565b81815284602083860101111561261157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561264457600080fd5b84359350602085013561265681611c36565b925060408501356001600160401b038082111561267257600080fd5b61267e888389016125bf565b9350606087013591508082111561269457600080fd5b506126a1878288016125bf565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906126d190830185612240565b82810360408401526126e38185612240565b9695505050505050565b600082516126ff81846020870161221c565b9190910192915050565b60006020828403121561271b57600080fd5b505191905056fea2646970667358221220d293b100fc5adddbb8fd0cb4e134ee7114418d77a3e89fc4f80cf959061a6cfc64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b68ad1e4116100ef578063e0563ab111610092578063e0563ab1146103b9578063e30c3978146103c2578063eeb49945146103d3578063f2fde38b146103e6578063f3fef3a3146103f9578063f64512551461040c578063f691325c14610433578063f8c8765e1461044657600080fd5b8063b68ad1e4146102e5578063c1225a20146102f8578063c3b35a7e1461030b578063c5ac2b1c1461031e578063c5e4683a14610345578063d41f177114610358578063d7c9e3ec1461037f578063d8dd1773146103a657600080fd5b80636f33e695116101575780636f33e6951461024b578063715018a61461026057806379ba5097146102685780637efab4f5146102705780638da5cb5b1461029a578063947287cf146102ab57806397e5230d146102b4578063b1768065146102be57600080fd5b806305dc2e8f146101b557806307b3e252146101e55780631bc114ba146101f3578063284017f5146102065780633b878c221461020f57806351351d531461021857806355b01e4d146102265780635ea5df7914610234575b600080fd5b60fd546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61023d61138881565b6040519081526020016101dc565b61025e610259366004611c96565b610459565b005b61025e610475565b61025e610489565b6101c861027e366004611d18565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101c8565b61023d61520881565b61023d620249f081565b61023d7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101c8906001600160a01b031681565b61025e610306366004611d4a565b610508565b61025e610319366004611d67565b610557565b61023d7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025e610353366004611d4a565b61056f565b61023d7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61023d7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61025e6103b4366004611da8565b6105b6565b6101c861203081565b6065546001600160a01b03166101c8565b61025e6103e1366004611e3e565b6106d7565b61025e6103f4366004611d18565b6108f5565b61025e610407366004611ec6565b610966565b61023d7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60fe546101c8906001600160a01b031681565b61025e610454366004611ef2565b61097d565b610461610a75565b61046e8585858585610a7d565b5050505050565b61047d610de2565b6104876000610e3c565b565b60655433906001600160a01b031681146104fc5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61050581610e3c565b50565b610510610de2565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61055f610a75565b61056a838383610e55565b505050565b610577610de2565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105dd5760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156105fd5750600054600160ff909116105b806106175750303b158015610617575060005460ff166001145b6106335760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610656576000805461ff0019166101001790555b6106628888888861115f565b60c9805461ffff191685151561ff001916176101008515150217905561068782610e3c565b80156106cd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107435760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f53544154456044820152682fa922a1a2a4ab22a960b91b60648201526084016104f3565b60fe546001600160a01b038481169116146107b25760405162461bcd60e51b815260206004820152602960248201527f4368696c644552433732315072656469636174653a204f4e4c595f524f4f545f60448201526850524544494341544560b81b60648201526084016104f3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216107e1602060008486611fc0565b6107ea91611fea565b03610809576108046107ff8260208186611fc0565b611254565b6108ef565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610838602060008486611fc0565b61084191611fea565b036108505761080482826114cb565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61087f602060008486611fc0565b61088891611fea565b03610897576108048282611732565b60405162461bcd60e51b815260206004820152602760248201527f4368696c644552433732315072656469636174653a20494e56414c49445f5349604482015266474e415455524560c81b60648201526084016104f3565b50505050565b6108fd610de2565b606580546001600160a01b0383166001600160a01b0319909116811790915561092e6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61096e610a75565b610979823383610e55565b5050565b336002600160a01b03146109a45760405163973d02cb60e01b81526004016104f390611f4e565b600054610100900460ff16158080156109c45750600054600160ff909116105b806109de5750303b1580156109de575060005460ff166001145b6109fa5760405162461bcd60e51b81526004016104f390611f72565b6000805460ff191660011790558015610a1d576000805461ff0019166101001790555b610a298585858561115f565b801561046e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6104876118a2565b84610a8781611ab8565b610aa35760405162461bcd60e51b81526004016104f390612008565b6000866001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b07919061204a565b6001600160a01b0381811660009081526101006020526040902054919250888116911614610b475760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610b5d57610b5d6120ab565b306001600160a01b0316876001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc9919061204a565b6001600160a01b031614610bdf57610bdf6120ab565b848314610c3a5760405162461bcd60e51b8152602060048201526024808201527f4368696c644552433732315072656469636174653a20494e56414c49445f4c4560448201526309c8ea8960e31b60648201526084016104f3565b60405163b2dc5dc360e01b81526001600160a01b0388169063b2dc5dc390610c6a903390889088906004016120f3565b6020604051808303816000875af1158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190612121565b610cc95760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe546040516001600160a01b03928316926316f19831921690610d20907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908d908d908d908d906020016121c8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d4c92919061226c565b600060405180830381600087803b158015610d6657600080fd5b505af1158015610d7a573d6000803e3d6000fd5b50505050336001600160a01b0316876001600160a01b0316826001600160a01b03167fa80bc76d6e1849a9088a9c00a2aeaa54eeb78f15565a18da3e8873438976f52289898989604051610dd19493929190612298565b60405180910390a450505050505050565b6033546001600160a01b031633146104875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b606580546001600160a01b031916905561050581611b4d565b82610e5f81611ab8565b610e7b5760405162461bcd60e51b81526004016104f390612008565b6000846001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf919061204a565b6001600160a01b0381811660009081526101006020526040902054919250868116911614610f1f5760405162461bcd60e51b81526004016104f390612067565b6001600160a01b038116610f3557610f356120ab565b306001600160a01b0316856001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa1919061204a565b6001600160a01b031614610fb757610fb76120ab565b604051632770a7eb60e21b81526001600160a01b03861690639dc29fac90610fe590339087906004016122ca565b6020604051808303816000875af1158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612121565b6110445760405162461bcd60e51b81526004016104f39061213e565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152888116608083015260a08083018990528351808403909101815260c08301938490526316f1983160e01b909352938416936316f19831936110cf9391169160c40161226c565b600060405180830381600087803b1580156110e957600080fd5b505af11580156110fd573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b0316826001600160a01b03167f1e0ef6131232b1090efc3ec1cf7b53aa17f4b7cd8a4f9e033b49ee237379b01333876040516111509291906122ca565b60405180910390a45050505050565b6001600160a01b0384161580159061117f57506001600160a01b03831615155b801561119357506001600160a01b03821615155b80156111a757506001600160a01b03811615155b6112045760405162461bcd60e51b815260206004820152602860248201527f4368696c644552433732315072656469636174653a204241445f494e495449416044820152672624ad20aa24a7a760c11b60648201526084016104f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080611265858701876122e3565b6001600160a01b0380851660009081526101006020526040902054949850929650909450925016806112a95760405162461bcd60e51b81526004016104f390612067565b6112b281611ab8565b6112be576112be6120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611322919061204a565b9050856001600160a01b0316816001600160a01b031614611345576113456120ab565b6001600160a01b03811661135b5761135b6120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c7919061204a565b6001600160a01b0316146113dd576113dd6120ab565b6040516340c10f1960e01b81526001600160a01b038316906340c10f199061140b90879087906004016122ca565b6020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190612121565b61146a5760405162461bcd60e51b81526004016104f390612334565b836001600160a01b0316826001600160a01b0316876001600160a01b03167f37589fd8c906c19ea68eeb7e6b3e03efc06ff8aa4b1830588eba75f4375b161188876040516114b99291906122ca565b60405180910390a45050505050505050565b60008080806114dc85870187612449565b6001600160a01b03808516600090815261010060205260409020549499509297509095509350169050806115225760405162461bcd60e51b81526004016104f390612067565b61152b81611ab8565b611537576115376120ab565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b919061204a565b9050856001600160a01b0316816001600160a01b0316146115be576115be6120ab565b6001600160a01b0381166115d4576115d46120ab565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611640919061204a565b6001600160a01b031614611656576116566120ab565b604051637c88e3d960e01b81526001600160a01b03831690637c88e3d990611684908790879060040161253b565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190612121565b6116e35760405162461bcd60e51b81526004016104f390612334565b846001600160a01b0316826001600160a01b0316876001600160a01b03167fc1b1a5c1b97cc8e5ac82b47496f5ebdadf9c7d119b30a116e2bdafd56f6ed47587876040516114b992919061253b565b600080806117428486018661262e565b91955093509150506001600160a01b038316611760576117606120ab565b6001600160a01b03838116600090815261010060205260409020541615611789576117896120ab565b60ff546040516bffffffffffffffffffffffff19606086901b1660208201526000916117d9916001600160a01b039091169060340160405160208183030381529060405280519060200120611b9f565b6001600160a01b03858116600090815261010060205260409081902080546001600160a01b031916928416928317905551639065714760e01b815291925090639065714790611830908790879087906004016126ad565b600060405180830381600087803b15801561184a57600080fd5b505af115801561185e573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a3505050505050565b60c95460ff16156119ad57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161190491906126ed565b6000604051808303818686fa925050503d8060008114611940576040519150601f19603f3d011682016040523d82523d6000602084013e611945565b606091505b509150915081801561196a57506000818060200190518101906119689190612709565b115b6119aa5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104f3565b50505b60c954610100900460ff161561048757604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a1491906126ed565b6000604051808303818686fa925050503d8060008114611a50576040519150601f19603f3d011682016040523d82523d6000602084013e611a55565b606091505b5091509150818015611a7b575080806020019051810190611a769190612709565b600114155b6109795760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104f3565b6000816001600160a01b03163b600003611ad457506000919050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611b3b575060408051601f3d908101601f19168201909252611b3891810190612121565b60015b611b4757506000919050565b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611b475760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104f3565b6001600160a01b038116811461050557600080fd5b60008083601f840112611c5d57600080fd5b5081356001600160401b03811115611c7457600080fd5b6020830191508360208260051b8501011115611c8f57600080fd5b9250929050565b600080600080600060608688031215611cae57600080fd5b8535611cb981611c36565b945060208601356001600160401b0380821115611cd557600080fd5b611ce189838a01611c4b565b90965094506040880135915080821115611cfa57600080fd5b50611d0788828901611c4b565b969995985093965092949392505050565b600060208284031215611d2a57600080fd5b8135611d3581611c36565b9392505050565b801515811461050557600080fd5b600060208284031215611d5c57600080fd5b8135611d3581611d3c565b600080600060608486031215611d7c57600080fd5b8335611d8781611c36565b92506020840135611d9781611c36565b929592945050506040919091013590565b600080600080600080600060e0888a031215611dc357600080fd5b8735611dce81611c36565b96506020880135611dde81611c36565b95506040880135611dee81611c36565b94506060880135611dfe81611c36565b93506080880135611e0e81611d3c565b925060a0880135611e1e81611d3c565b915060c0880135611e2e81611c36565b8091505092959891949750929550565b60008060008060608587031215611e5457600080fd5b843593506020850135611e6681611c36565b925060408501356001600160401b0380821115611e8257600080fd5b818701915087601f830112611e9657600080fd5b813581811115611ea557600080fd5b886020828501011115611eb757600080fd5b95989497505060200194505050565b60008060408385031215611ed957600080fd5b8235611ee481611c36565b946020939093013593505050565b60008060008060808587031215611f0857600080fd5b8435611f1381611c36565b93506020850135611f2381611c36565b92506040850135611f3381611c36565b91506060850135611f4381611c36565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611fd057600080fd5b83861115611fdd57600080fd5b5050820193919092039150565b80356020831015611b4757600019602084900360031b1b1692915050565b60208082526022908201527f4368696c644552433732315072656469636174653a204e4f545f434f4e54524160408201526110d560f21b606082015260800190565b60006020828403121561205c57600080fd5b8151611d3581611c36565b60208082526024908201527f4368696c644552433732315072656469636174653a20554e4d41505045445f5460408201526327a5a2a760e11b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156120da57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038416815260406020820181905260009061211890830184866120c1565b95945050505050565b60006020828403121561213357600080fd5b8151611d3581611d3c565b60208082526021908201527f4368696c644552433732315072656469636174653a204255524e5f4641494c456040820152601160fa1b606082015260800190565b8183526000602080850194508260005b858110156121bd5781356121a281611c36565b6001600160a01b03168752958201959082019060010161218f565b509495945050505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906121fb908301868861217f565b828103608084015261220e8185876120c1565b9a9950505050505050505050565b60005b8381101561223757818101518382015260200161221f565b50506000910152565b6000815180845261225881602086016020860161221c565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061229090830184612240565b949350505050565b6040815260006122ac60408301868861217f565b82810360208401526122bf8185876120c1565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b600080600080608085870312156122f957600080fd5b843561230481611c36565b9350602085013561231481611c36565b9250604085013561232481611c36565b9396929550929360600135925050565b60208082526021908201527f4368696c644552433732315072656469636174653a204d494e545f4641494c456040820152601160fa1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156123b3576123b3612375565b604052919050565b60006001600160401b038211156123d4576123d4612375565b5060051b60200190565b600082601f8301126123ef57600080fd5b813560206124046123ff836123bb565b61238b565b82815260059290921b8401810191818101908684111561242357600080fd5b8286015b8481101561243e5780358352918301918301612427565b509695505050505050565b600080600080600060a0868803121561246157600080fd5b8535945060208087013561247481611c36565b9450604087013561248481611c36565b935060608701356001600160401b03808211156124a057600080fd5b818901915089601f8301126124b457600080fd5b81356124c26123ff826123bb565b81815260059190911b8301840190848101908c8311156124e157600080fd5b938501935b828510156125085784356124f981611c36565b825293850193908501906124e6565b96505050608089013592508083111561252057600080fd5b505061252e888289016123de565b9150509295509295909350565b604080825283519082018190526000906020906060840190828701845b8281101561257d5781516001600160a01b031684529284019290840190600101612558565b5050508381038285015284518082528583019183019060005b818110156125b257835183529284019291840191600101612596565b5090979650505050505050565b600082601f8301126125d057600080fd5b81356001600160401b038111156125e9576125e9612375565b6125fc601f8201601f191660200161238b565b81815284602083860101111561261157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561264457600080fd5b84359350602085013561265681611c36565b925060408501356001600160401b038082111561267257600080fd5b61267e888389016125bf565b9350606087013591508082111561269457600080fd5b506126a1878288016125bf565b91505092959194509250565b6001600160a01b03841681526060602082018190526000906126d190830185612240565b82810360408401526126e38185612240565b9695505050505050565b600082516126ff81846020870161221c565b9190910192915050565b60006020828403121561271b57600080fd5b505191905056fea2646970667358221220d293b100fc5adddbb8fd0cb4e134ee7114418d77a3e89fc4f80cf959061a6cfc64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC721PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC721Predicate","sourceName":"contracts/child/RootMintableERC721Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611a8f806100206000396000f3fe608060405234801561001057600080fd5b506004361061016e5760003560e01c806397e5230d116100ce578063e0563ab111610087578063e0563ab114610353578063eeb499451461035c578063f213159c1461036f578063f4a120f714610382578063f645125514610395578063f8c8765e146103bc578063ff6f870c146103cf57600080fd5b806397e5230d1461029a578063b1768065146102a4578063b68ad1e4146102cb578063c5ac2b1c146102de578063d41f177114610305578063d7c9e3ec1461032c57600080fd5b806347e7ef241161012b57806347e7ef241461020d5780634fdca69d1461022257806351351d531461023557806355b01e4d146102435780635ea5df79146102515780637efab4f514610268578063947287cf1461029157600080fd5b806305dc2e8f1461017357806307b3e252146101a3578063150b7a02146101b15780631bc114ba146101e8578063284017f5146101fb5780633b878c2214610204575b600080fd5b603454610186906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101866004600360981b0181565b6101cf6101bf366004611231565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161019a565b603354610186906001600160a01b031681565b61018661202081565b61018661101081565b61022061021b3660046112df565b6103e2565b005b603554610186906001600160a01b031681565b6101866002600160a01b0381565b6101866004600160991b0181565b61025a61138881565b60405190815260200161019a565b61018661027636600461130b565b6037602052600090815260409020546001600160a01b031681565b61025a61520881565b61025a620249f081565b61025a7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610186906001600160a01b031681565b61025a7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025a7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61025a7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018661203081565b61022061036a36600461132f565b6103f1565b61022061037d3660046113b7565b6105d1565b61018661039036600461130b565b6105e1565b61025a7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102206103ca3660046113f8565b61093a565b6102206103dd36600461149f565b610a97565b6103ed823383610af5565b5050565b6034546001600160a01b031633146104695760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104e05760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610460565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961050f602060008486611521565b6105189161154b565b036105375761053261052d8260208186611521565b610c74565b6105cb565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed2610566602060008486611521565b61056f9161154b565b0361057e576105328282610d72565b60405162461bcd60e51b815260206004820152602e6024820152600080516020611a3a83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610460565b50505050565b6105dc838383610af5565b505050565b60006001600160a01b03821661063a5760405162461bcd60e51b815260206004820152602a6024820152600080516020611a3a83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610460565b6001600160a01b0382811660009081526037602052604090205416156106b65760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610460565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261076492911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa1580156107fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610824919081019061158e565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610862573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261088a919081019061158e565b60405160200161089d9493929190611630565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108c9929190611677565b600060405180830381600087803b1580156108e357600080fd5b505af11580156108f7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b031461097e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610460565b600054610100900460ff161580801561099e5750600054600160ff909116105b806109b85750303b1580156109b8575060005460ff166001145b610a1b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610460565b6000805460ff191660011790558015610a3e576000805461ff0019166101001790555b610a4a85858585610eb3565b8015610a90576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610ae85760405162461bcd60e51b815260206004820152602b6024820152600080516020611a3a83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610460565b610a908585858585610faf565b6000610b0084611165565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610b33903390309087906004016116a3565b600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b5050603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610bf1939092169160c401611677565b600060405180830381600087803b158015610c0b57600080fd5b505af1158015610c1f573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a46105cb565b6000808080610c85858701876116c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610cb857610cb8611718565b604051632142170760e11b81526001600160a01b038616906342842e0e90610ce8903090879087906004016116a3565b600060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b6000808080610d83858701876117b7565b6001600160a01b03808516600090815260376020526040902054949950929750909550935016905080610db857610db8611718565b60005b8251811015610e6357856001600160a01b03166342842e0e30868481518110610de657610de66118a9565b6020026020010151868581518110610e0057610e006118a9565b60200260200101516040518463ffffffff1660e01b8152600401610e26939291906116a3565b600060405180830381600087803b158015610e4057600080fd5b505af1158015610e54573d6000803e3d6000fd5b50505050806001019050610dbb565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b8686604051610d619291906118bf565b6001600160a01b03841615801590610ed357506001600160a01b03831615155b8015610ee757506001600160a01b03821615155b8015610efb57506001600160a01b03811615155b610f5f5760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610460565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000610fba86611165565b905060005b8281101561104c57866001600160a01b03166342842e0e3330878786818110610fea57610fea6118a9565b905060200201356040518463ffffffff1660e01b815260040161100f939291906116a3565b600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b50505050806001019050610fbf565b506033546035546040516001600160a01b03928316926316f198319216906110a4907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c906020016119be565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110d0929190611677565b600060405180830381600087803b1580156110ea57600080fd5b505af11580156110fe573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c5888888886040516111559493929190611a12565b60405180910390a4505050505050565b6001600160a01b0380821660009081526037602052604090205416806111915761118e826105e1565b90505b6001600160a01b0381166111a7576111a7611718565b919050565b6001600160a01b03811681146111c157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611202576112026111c4565b604052919050565b60006001600160401b03821115611223576112236111c4565b50601f01601f191660200190565b6000806000806080858703121561124757600080fd5b8435611252816111ac565b93506020850135611262816111ac565b92506040850135915060608501356001600160401b0381111561128457600080fd5b8501601f8101871361129557600080fd5b80356112a86112a38261120a565b6111da565b8181528860208385010111156112bd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156112f257600080fd5b82356112fd816111ac565b946020939093013593505050565b60006020828403121561131d57600080fd5b8135611328816111ac565b9392505050565b6000806000806060858703121561134557600080fd5b843593506020850135611357816111ac565b925060408501356001600160401b038082111561137357600080fd5b818701915087601f83011261138757600080fd5b81358181111561139657600080fd5b8860208285010111156113a857600080fd5b95989497505060200194505050565b6000806000606084860312156113cc57600080fd5b83356113d7816111ac565b925060208401356113e7816111ac565b929592945050506040919091013590565b6000806000806080858703121561140e57600080fd5b8435611419816111ac565b93506020850135611429816111ac565b92506040850135611439816111ac565b91506060850135611449816111ac565b939692955090935050565b60008083601f84011261146657600080fd5b5081356001600160401b0381111561147d57600080fd5b6020830191508360208260051b850101111561149857600080fd5b9250929050565b6000806000806000606086880312156114b757600080fd5b85356114c2816111ac565b945060208601356001600160401b03808211156114de57600080fd5b6114ea89838a01611454565b9096509450604088013591508082111561150357600080fd5b5061151088828901611454565b969995985093965092949392505050565b6000808585111561153157600080fd5b8386111561153e57600080fd5b5050820193919092039150565b8035602083101561156457600019602084900360031b1b165b92915050565b60005b8381101561158557818101518382015260200161156d565b50506000910152565b6000602082840312156115a057600080fd5b81516001600160401b038111156115b657600080fd5b8201601f810184136115c757600080fd5b80516115d56112a38261120a565b8181528560208385010111156115ea57600080fd5b6115fb82602083016020860161156a565b95945050505050565b6000815180845261161c81602086016020860161156a565b601f01601f19169290920160200192915050565b8481526001600160a01b038416602082015260806040820181905260009061165a90830185611604565b828103606084015261166c8185611604565b979650505050505050565b6001600160a01b038316815260406020820181905260009061169b90830184611604565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600080600080608085870312156116dd57600080fd5b84356116e8816111ac565b935060208501356116f8816111ac565b92506040850135611708816111ac565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611747576117476111c4565b5060051b60200190565b600082601f83011261176257600080fd5b813560206117726112a38361172e565b82815260059290921b8401810191818101908684111561179157600080fd5b8286015b848110156117ac5780358352918301918301611795565b509695505050505050565b600080600080600060a086880312156117cf57600080fd5b853594506020808701356117e2816111ac565b945060408701356117f2816111ac565b935060608701356001600160401b038082111561180e57600080fd5b818901915089601f83011261182257600080fd5b81356118306112a38261172e565b81815260059190911b8301840190848101908c83111561184f57600080fd5b938501935b82851015611876578435611867816111ac565b82529385019390850190611854565b96505050608089013592508083111561188e57600080fd5b505061189c88828901611751565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b828110156119015781516001600160a01b0316845292840192908401906001016118dc565b5050508381038285015284518082528583019183019060005b818110156119365783518352928401929184019160010161191a565b5090979650505050505050565b8183526000602080850194508260005b85811015611981578135611966816111ac565b6001600160a01b031687529582019590820190600101611953565b509495945050505050565b81835260006001600160fb1b038311156119a557600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906119f19083018688611943565b8281036080840152611a0481858761198c565b9a9950505050505050505050565b604081526000611a26604083018688611943565b828103602084015261166c81858761198c56fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a2646970667358221220d56687504a65fbdf30d6fa40bc1481712f630a02ef2aa4dc136cf9be78742d2364736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061016e5760003560e01c806397e5230d116100ce578063e0563ab111610087578063e0563ab114610353578063eeb499451461035c578063f213159c1461036f578063f4a120f714610382578063f645125514610395578063f8c8765e146103bc578063ff6f870c146103cf57600080fd5b806397e5230d1461029a578063b1768065146102a4578063b68ad1e4146102cb578063c5ac2b1c146102de578063d41f177114610305578063d7c9e3ec1461032c57600080fd5b806347e7ef241161012b57806347e7ef241461020d5780634fdca69d1461022257806351351d531461023557806355b01e4d146102435780635ea5df79146102515780637efab4f514610268578063947287cf1461029157600080fd5b806305dc2e8f1461017357806307b3e252146101a3578063150b7a02146101b15780631bc114ba146101e8578063284017f5146101fb5780633b878c2214610204575b600080fd5b603454610186906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101866004600360981b0181565b6101cf6101bf366004611231565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161019a565b603354610186906001600160a01b031681565b61018661202081565b61018661101081565b61022061021b3660046112df565b6103e2565b005b603554610186906001600160a01b031681565b6101866002600160a01b0381565b6101866004600160991b0181565b61025a61138881565b60405190815260200161019a565b61018661027636600461130b565b6037602052600090815260409020546001600160a01b031681565b61025a61520881565b61025a620249f081565b61025a7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b603654610186906001600160a01b031681565b61025a7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b61025a7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61025a7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018661203081565b61022061036a36600461132f565b6103f1565b61022061037d3660046113b7565b6105d1565b61018661039036600461130b565b6105e1565b61025a7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102206103ca3660046113f8565b61093a565b6102206103dd36600461149f565b610a97565b6103ed823383610af5565b5050565b6034546001600160a01b031633146104695760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b60648201526084015b60405180910390fd5b6035546001600160a01b038481169116146104e05760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610460565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961050f602060008486611521565b6105189161154b565b036105375761053261052d8260208186611521565b610c74565b6105cb565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed2610566602060008486611521565b61056f9161154b565b0361057e576105328282610d72565b60405162461bcd60e51b815260206004820152602e6024820152600080516020611a3a83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610460565b50505050565b6105dc838383610af5565b505050565b60006001600160a01b03821661063a5760405162461bcd60e51b815260206004820152602a6024820152600080516020611a3a83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610460565b6001600160a01b0382811660009081526037602052604090205416156106b65760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610460565b6035546036546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b039283169260009261076492911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0385811660008181526037602052604080822080546001600160a01b03191686861617905560335481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa1580156107fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610824919081019061158e565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610862573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261088a919081019061158e565b60405160200161089d9493929190611630565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108c9929190611677565b600060405180830381600087803b1580156108e357600080fd5b505af11580156108f7573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b031461097e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610460565b600054610100900460ff161580801561099e5750600054600160ff909116105b806109b85750303b1580156109b8575060005460ff166001145b610a1b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610460565b6000805460ff191660011790558015610a3e576000805461ff0019166101001790555b610a4a85858585610eb3565b8015610a90576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610ae85760405162461bcd60e51b815260206004820152602b6024820152600080516020611a3a83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610460565b610a908585858585610faf565b6000610b0084611165565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610b33903390309087906004016116a3565b600060405180830381600087803b158015610b4d57600080fd5b505af1158015610b61573d6000803e3d6000fd5b5050603354603554604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610bf1939092169160c401611677565b600060405180830381600087803b158015610c0b57600080fd5b505af1158015610c1f573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a46105cb565b6000808080610c85858701876116c7565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610cb857610cb8611718565b604051632142170760e11b81526001600160a01b038616906342842e0e90610ce8903090879087906004016116a3565b600060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b6000808080610d83858701876117b7565b6001600160a01b03808516600090815260376020526040902054949950929750909550935016905080610db857610db8611718565b60005b8251811015610e6357856001600160a01b03166342842e0e30868481518110610de657610de66118a9565b6020026020010151868581518110610e0057610e006118a9565b60200260200101516040518463ffffffff1660e01b8152600401610e26939291906116a3565b600060405180830381600087803b158015610e4057600080fd5b505af1158015610e54573d6000803e3d6000fd5b50505050806001019050610dbb565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b8686604051610d619291906118bf565b6001600160a01b03841615801590610ed357506001600160a01b03831615155b8015610ee757506001600160a01b03821615155b8015610efb57506001600160a01b03811615155b610f5f5760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610460565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000610fba86611165565b905060005b8281101561104c57866001600160a01b03166342842e0e3330878786818110610fea57610fea6118a9565b905060200201356040518463ffffffff1660e01b815260040161100f939291906116a3565b600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b50505050806001019050610fbf565b506033546035546040516001600160a01b03928316926316f198319216906110a4907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c906020016119be565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110d0929190611677565b600060405180830381600087803b1580156110ea57600080fd5b505af11580156110fe573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c5888888886040516111559493929190611a12565b60405180910390a4505050505050565b6001600160a01b0380821660009081526037602052604090205416806111915761118e826105e1565b90505b6001600160a01b0381166111a7576111a7611718565b919050565b6001600160a01b03811681146111c157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611202576112026111c4565b604052919050565b60006001600160401b03821115611223576112236111c4565b50601f01601f191660200190565b6000806000806080858703121561124757600080fd5b8435611252816111ac565b93506020850135611262816111ac565b92506040850135915060608501356001600160401b0381111561128457600080fd5b8501601f8101871361129557600080fd5b80356112a86112a38261120a565b6111da565b8181528860208385010111156112bd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156112f257600080fd5b82356112fd816111ac565b946020939093013593505050565b60006020828403121561131d57600080fd5b8135611328816111ac565b9392505050565b6000806000806060858703121561134557600080fd5b843593506020850135611357816111ac565b925060408501356001600160401b038082111561137357600080fd5b818701915087601f83011261138757600080fd5b81358181111561139657600080fd5b8860208285010111156113a857600080fd5b95989497505060200194505050565b6000806000606084860312156113cc57600080fd5b83356113d7816111ac565b925060208401356113e7816111ac565b929592945050506040919091013590565b6000806000806080858703121561140e57600080fd5b8435611419816111ac565b93506020850135611429816111ac565b92506040850135611439816111ac565b91506060850135611449816111ac565b939692955090935050565b60008083601f84011261146657600080fd5b5081356001600160401b0381111561147d57600080fd5b6020830191508360208260051b850101111561149857600080fd5b9250929050565b6000806000806000606086880312156114b757600080fd5b85356114c2816111ac565b945060208601356001600160401b03808211156114de57600080fd5b6114ea89838a01611454565b9096509450604088013591508082111561150357600080fd5b5061151088828901611454565b969995985093965092949392505050565b6000808585111561153157600080fd5b8386111561153e57600080fd5b5050820193919092039150565b8035602083101561156457600019602084900360031b1b165b92915050565b60005b8381101561158557818101518382015260200161156d565b50506000910152565b6000602082840312156115a057600080fd5b81516001600160401b038111156115b657600080fd5b8201601f810184136115c757600080fd5b80516115d56112a38261120a565b8181528560208385010111156115ea57600080fd5b6115fb82602083016020860161156a565b95945050505050565b6000815180845261161c81602086016020860161156a565b601f01601f19169290920160200192915050565b8481526001600160a01b038416602082015260806040820181905260009061165a90830185611604565b828103606084015261166c8185611604565b979650505050505050565b6001600160a01b038316815260406020820181905260009061169b90830184611604565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600080600080608085870312156116dd57600080fd5b84356116e8816111ac565b935060208501356116f8816111ac565b92506040850135611708816111ac565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611747576117476111c4565b5060051b60200190565b600082601f83011261176257600080fd5b813560206117726112a38361172e565b82815260059290921b8401810191818101908684111561179157600080fd5b8286015b848110156117ac5780358352918301918301611795565b509695505050505050565b600080600080600060a086880312156117cf57600080fd5b853594506020808701356117e2816111ac565b945060408701356117f2816111ac565b935060608701356001600160401b038082111561180e57600080fd5b818901915089601f83011261182257600080fd5b81356118306112a38261172e565b81815260059190911b8301840190848101908c83111561184f57600080fd5b938501935b82851015611876578435611867816111ac565b82529385019390850190611854565b96505050608089013592508083111561188e57600080fd5b505061189c88828901611751565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b828110156119015781516001600160a01b0316845292840192908401906001016118dc565b5050508381038285015284518082528583019183019060005b818110156119365783518352928401929184019160010161191a565b5090979650505050505050565b8183526000602080850194508260005b85811015611981578135611966816111ac565b6001600160a01b031687529582019590820190600101611953565b509495945050505050565b81835260006001600160fb1b038311156119a557600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a0606082018190526000906119f19083018688611943565b8281036080840152611a0481858761198c565b9a9950505050505050505050565b604081526000611a26604083018688611943565b828103602084015261166c81858761198c56fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a2646970667358221220d56687504a65fbdf30d6fa40bc1481712f630a02ef2aa4dc136cf9be78742d2364736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC721PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC721PredicateAccessList","sourceName":"contracts/child/RootMintableERC721PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"L2MintableERC721Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"L2MintableERC721WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childERC721Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC721Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721Metadata","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612231806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e65760003560e01c8063b17680651161010a578063e0563ab1116100ad578063f2fde38b1161007c578063f2fde38b14610466578063f4a120f714610479578063f64512551461048c578063f8c8765e146104b3578063ff6f870c146104c657600080fd5b8063e0563ab114610426578063e30c39781461042f578063eeb4994514610440578063f213159c1461045357600080fd5b8063b17680651461033e578063b68ad1e414610365578063c1225a2014610378578063c5ac2b1c1461038b578063c5e4683a146103b2578063d41f1771146103c5578063d7c9e3ec146103ec578063d8dd17731461041357600080fd5b806351351d531161018d57806379ba50971161015c57806379ba5097146102e85780637efab4f5146102f05780638da5cb5b1461031a578063947287cf1461032b57806397e5230d1461033457600080fd5b806351351d53146102ad57806355b01e4d146102bb5780635ea5df79146102c9578063715018a6146102e057600080fd5b806305dc2e8f146101eb57806307b3e2521461021b578063150b7a02146102295780631bc114ba14610260578063284017f5146102735780633b878c221461027c57806347e7ef24146102855780634fdca69d1461029a575b600080fd5b60fd546101fe906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101fe6004600360981b0181565b61024761023736600461186f565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610212565b60fc546101fe906001600160a01b031681565b6101fe61202081565b6101fe61101081565b61029861029336600461191d565b6104d9565b005b60fe546101fe906001600160a01b031681565b6101fe6002600160a01b0381565b6101fe6004600160991b0181565b6102d261138881565b604051908152602001610212565b6102986104e8565b6102986104fc565b6101fe6102fe366004611949565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101fe565b6102d261520881565b6102d2620249f081565b6102d27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101fe906001600160a01b031681565b61029861038636600461197d565b61057b565b6102d27faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102986103c036600461197d565b6105ca565b6102d27f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102d27f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b610298610421366004611998565b610611565b6101fe61203081565b6065546001600160a01b03166101fe565b61029861044e366004611a2a565b610732565b610298610461366004611ab2565b61090d565b610298610474366004611949565b61091d565b6101fe610487366004611949565b61098e565b6102d27f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102986104c1366004611af3565b610ce9565b6102986104d4366004611b9a565b610de2565b6104e4823383610e40565b5050565b6104f0610fc7565b6104fa6000611021565b565b60655433906001600160a01b0316811461056f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61057881611021565b50565b610583610fc7565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6105d2610fc7565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146106385760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff16158080156106585750600054600160ff909116105b806106725750303b158015610672575060005460ff166001145b61068e5760405162461bcd60e51b815260040161056690611c40565b6000805460ff1916600117905580156106b1576000805461ff0019166101001790555b6106bd8888888861103a565b60c9805461ffff191685151561ff00191617610100851515021790556106e282611021565b8015610728576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b6064820152608401610566565b60fe546001600160a01b0384811691161461081c5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610566565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961084b602060008486611c8e565b61085491611cb8565b036108735761086e6108698260208186611c8e565b611136565b610907565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26108a2602060008486611c8e565b6108ab91611cb8565b036108ba5761086e8282611235565b60405162461bcd60e51b815260206004820152602e60248201526000805160206121dc83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610566565b50505050565b610918838383610e40565b505050565b610925610fc7565b606580546001600160a01b0383166001600160a01b031990911681179091556109566033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166109e75760405162461bcd60e51b815260206004820152602a60248201526000805160206121dc83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610566565b6001600160a01b03828116600090815261010060205260409020541615610a645760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610566565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610b1292911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610bab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bd39190810190611cfb565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c399190810190611cfb565b604051602001610c4c9493929190611d9d565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610c78929190611de4565b600060405180830381600087803b158015610c9257600080fd5b505af1158015610ca6573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610d105760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff1615808015610d305750600054600160ff909116105b80610d4a5750303b158015610d4a575060005460ff166001145b610d665760405162461bcd60e51b815260040161056690611c40565b6000805460ff191660011790558015610d89576000805461ff0019166101001790555b610d958585858561103a565b8015610ddb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610e335760405162461bcd60e51b815260206004820152602b60248201526000805160206121dc83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610566565b610ddb8585858585611377565b610e48611535565b6000610e538461153d565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610e8690339030908790600401611e10565b600060405180830381600087803b158015610ea057600080fd5b505af1158015610eb4573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610f44939092169160c401611de4565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a4610907565b6033546001600160a01b031633146104fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610566565b606580546001600160a01b031916905561057881611585565b6001600160a01b0384161580159061105a57506001600160a01b03831615155b801561106e57506001600160a01b03821615155b801561108257506001600160a01b03811615155b6110e65760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610566565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061114785870187611e34565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061117b5761117b611e85565b604051632142170760e11b81526001600160a01b038616906342842e0e906111ab90309087908790600401611e10565b600060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b600080808061124685870187611f24565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061127c5761127c611e85565b60005b825181101561132757856001600160a01b03166342842e0e308684815181106112aa576112aa612016565b60200260200101518685815181106112c4576112c4612016565b60200260200101516040518463ffffffff1660e01b81526004016112ea93929190611e10565b600060405180830381600087803b15801561130457600080fd5b505af1158015611318573d6000803e3d6000fd5b5050505080600101905061127f565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b868660405161122492919061202c565b61137f611535565b600061138a8661153d565b905060005b8281101561141c57866001600160a01b03166342842e0e33308787868181106113ba576113ba612016565b905060200201356040518463ffffffff1660e01b81526004016113df93929190611e10565b600060405180830381600087803b1580156113f957600080fd5b505af115801561140d573d6000803e3d6000fd5b5050505080600101905061138f565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611474907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c9060200161212b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016114a0929190611de4565b600060405180830381600087803b1580156114ba57600080fd5b505af11580156114ce573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c588888888604051611525949392919061217f565b60405180910390a4505050505050565b6104fa6115d7565b6001600160a01b0380821660009081526101006020526040902054168061156a576115678261098e565b90505b6001600160a01b03811661158057611580611e85565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116e257604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161163991906121a6565b6000604051808303818686fa925050503d8060008114611675576040519150601f19603f3d011682016040523d82523d6000602084013e61167a565b606091505b509150915081801561169f575060008180602001905181019061169d91906121c2565b115b6116df5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610566565b50505b60c954610100900460ff16156104fa57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161174991906121a6565b6000604051808303818686fa925050503d8060008114611785576040519150601f19603f3d011682016040523d82523d6000602084013e61178a565b606091505b50915091508180156117b05750808060200190518101906117ab91906121c2565b600114155b6104e45760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610566565b6001600160a01b038116811461057857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561184057611840611802565b604052919050565b60006001600160401b0382111561186157611861611802565b50601f01601f191660200190565b6000806000806080858703121561188557600080fd5b8435611890816117ed565b935060208501356118a0816117ed565b92506040850135915060608501356001600160401b038111156118c257600080fd5b8501601f810187136118d357600080fd5b80356118e66118e182611848565b611818565b8181528860208385010111156118fb57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561193057600080fd5b823561193b816117ed565b946020939093013593505050565b60006020828403121561195b57600080fd5b8135611966816117ed565b9392505050565b8035801515811461158057600080fd5b60006020828403121561198f57600080fd5b6119668261196d565b600080600080600080600060e0888a0312156119b357600080fd5b87356119be816117ed565b965060208801356119ce816117ed565b955060408801356119de816117ed565b945060608801356119ee816117ed565b93506119fc6080890161196d565b9250611a0a60a0890161196d565b915060c0880135611a1a816117ed565b8091505092959891949750929550565b60008060008060608587031215611a4057600080fd5b843593506020850135611a52816117ed565b925060408501356001600160401b0380821115611a6e57600080fd5b818701915087601f830112611a8257600080fd5b813581811115611a9157600080fd5b886020828501011115611aa357600080fd5b95989497505060200194505050565b600080600060608486031215611ac757600080fd5b8335611ad2816117ed565b92506020840135611ae2816117ed565b929592945050506040919091013590565b60008060008060808587031215611b0957600080fd5b8435611b14816117ed565b93506020850135611b24816117ed565b92506040850135611b34816117ed565b91506060850135611b44816117ed565b939692955090935050565b60008083601f840112611b6157600080fd5b5081356001600160401b03811115611b7857600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b9250929050565b600080600080600060608688031215611bb257600080fd5b8535611bbd816117ed565b945060208601356001600160401b0380821115611bd957600080fd5b611be589838a01611b4f565b90965094506040880135915080821115611bfe57600080fd5b50611c0b88828901611b4f565b969995985093965092949392505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611c9e57600080fd5b83861115611cab57600080fd5b5050820193919092039150565b80356020831015611cd157600019602084900360031b1b165b92915050565b60005b83811015611cf2578181015183820152602001611cda565b50506000910152565b600060208284031215611d0d57600080fd5b81516001600160401b03811115611d2357600080fd5b8201601f81018413611d3457600080fd5b8051611d426118e182611848565b818152856020838501011115611d5757600080fd5b611d68826020830160208601611cd7565b95945050505050565b60008151808452611d89816020860160208601611cd7565b601f01601f19169290920160200192915050565b8481526001600160a01b0384166020820152608060408201819052600090611dc790830185611d71565b8281036060840152611dd98185611d71565b979650505050505050565b6001600160a01b0383168152604060208201819052600090611e0890830184611d71565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060008060808587031215611e4a57600080fd5b8435611e55816117ed565b93506020850135611e65816117ed565b92506040850135611e75816117ed565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611eb457611eb4611802565b5060051b60200190565b600082601f830112611ecf57600080fd5b81356020611edf6118e183611e9b565b82815260059290921b84018101918181019086841115611efe57600080fd5b8286015b84811015611f195780358352918301918301611f02565b509695505050505050565b600080600080600060a08688031215611f3c57600080fd5b85359450602080870135611f4f816117ed565b94506040870135611f5f816117ed565b935060608701356001600160401b0380821115611f7b57600080fd5b818901915089601f830112611f8f57600080fd5b8135611f9d6118e182611e9b565b81815260059190911b8301840190848101908c831115611fbc57600080fd5b938501935b82851015611fe3578435611fd4816117ed565b82529385019390850190611fc1565b965050506080890135925080831115611ffb57600080fd5b505061200988828901611ebe565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b8281101561206e5781516001600160a01b031684529284019290840190600101612049565b5050508381038285015284518082528583019183019060005b818110156120a357835183529284019291840191600101612087565b5090979650505050505050565b8183526000602080850194508260005b858110156120ee5781356120d3816117ed565b6001600160a01b0316875295820195908201906001016120c0565b509495945050505050565b81835260006001600160fb1b0383111561211257600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061215e90830186886120b0565b82810360808401526121718185876120f9565b9a9950505050505050505050565b6040815260006121936040830186886120b0565b8281036020840152611dd98185876120f9565b600082516121b8818460208701611cd7565b9190910192915050565b6000602082840312156121d457600080fd5b505191905056fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a26469706673582212204063e808f9818c931a3cdbf2406d8b4f218ddd313bef99b78b2b8455373be0c864736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101e65760003560e01c8063b17680651161010a578063e0563ab1116100ad578063f2fde38b1161007c578063f2fde38b14610466578063f4a120f714610479578063f64512551461048c578063f8c8765e146104b3578063ff6f870c146104c657600080fd5b8063e0563ab114610426578063e30c39781461042f578063eeb4994514610440578063f213159c1461045357600080fd5b8063b17680651461033e578063b68ad1e414610365578063c1225a2014610378578063c5ac2b1c1461038b578063c5e4683a146103b2578063d41f1771146103c5578063d7c9e3ec146103ec578063d8dd17731461041357600080fd5b806351351d531161018d57806379ba50971161015c57806379ba5097146102e85780637efab4f5146102f05780638da5cb5b1461031a578063947287cf1461032b57806397e5230d1461033457600080fd5b806351351d53146102ad57806355b01e4d146102bb5780635ea5df79146102c9578063715018a6146102e057600080fd5b806305dc2e8f146101eb57806307b3e2521461021b578063150b7a02146102295780631bc114ba14610260578063284017f5146102735780633b878c221461027c57806347e7ef24146102855780634fdca69d1461029a575b600080fd5b60fd546101fe906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101fe6004600360981b0181565b61024761023736600461186f565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610212565b60fc546101fe906001600160a01b031681565b6101fe61202081565b6101fe61101081565b61029861029336600461191d565b6104d9565b005b60fe546101fe906001600160a01b031681565b6101fe6002600160a01b0381565b6101fe6004600160991b0181565b6102d261138881565b604051908152602001610212565b6102986104e8565b6102986104fc565b6101fe6102fe366004611949565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b03166101fe565b6102d261520881565b6102d2620249f081565b6102d27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff546101fe906001600160a01b031681565b61029861038636600461197d565b61057b565b6102d27faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102986103c036600461197d565b6105ca565b6102d27f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102d27f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b610298610421366004611998565b610611565b6101fe61203081565b6065546001600160a01b03166101fe565b61029861044e366004611a2a565b610732565b610298610461366004611ab2565b61090d565b610298610474366004611949565b61091d565b6101fe610487366004611949565b61098e565b6102d27f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102986104c1366004611af3565b610ce9565b6102986104d4366004611b9a565b610de2565b6104e4823383610e40565b5050565b6104f0610fc7565b6104fa6000611021565b565b60655433906001600160a01b0316811461056f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61057881611021565b50565b610583610fc7565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b6105d2610fc7565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146106385760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff16158080156106585750600054600160ff909116105b806106725750303b158015610672575060005460ff166001145b61068e5760405162461bcd60e51b815260040161056690611c40565b6000805460ff1916600117905580156106b1576000805461ff0019166101001790555b6106bd8888888861103a565b60c9805461ffff191685151561ff00191617610100851515021790556106e282611021565b8015610728576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107a55760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c60448201526f2cafa9aa20aa22afa922a1a2a4ab22a960811b6064820152608401610566565b60fe546001600160a01b0384811691161461081c5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c654552433732315072656469636174653a204f4e4c604482015270595f4348494c445f50524544494341544560781b6064820152608401610566565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961084b602060008486611c8e565b61085491611cb8565b036108735761086e6108698260208186611c8e565b611136565b610907565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26108a2602060008486611c8e565b6108ab91611cb8565b036108ba5761086e8282611235565b60405162461bcd60e51b815260206004820152602e60248201526000805160206121dc83398151915260448201526d414c49445f5349474e415455524560901b6064820152608401610566565b50505050565b610918838383610e40565b505050565b610925610fc7565b606580546001600160a01b0383166001600160a01b031990911681179091556109566033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b0382166109e75760405162461bcd60e51b815260206004820152602a60248201526000805160206121dc83398151915260448201526920a624a22faa27a5a2a760b11b6064820152608401610566565b6001600160a01b03828116600090815261010060205260409020541615610a645760405162461bcd60e51b815260206004820152602b60248201527f526f6f744d696e7461626c654552433732315072656469636174653a20414c5260448201526a1150511657d3505414115160aa1b6064820152608401610566565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692600092610b1292911690603401604051602081830303815290604052805190602001208460405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b038581166000818152610100602052604080822080546001600160a01b03191686861617905560fc5481516306fdde0360e01b81529151959650909316936316f198319387937f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad938b9391926306fdde0392600480830193928290030181865afa158015610bab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bd39190810190611cfb565b896001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c399190810190611cfb565b604051602001610c4c9493929190611d9d565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610c78929190611de4565b600060405180830381600087803b158015610c9257600080fd5b505af1158015610ca6573d6000803e3d6000fd5b50506040516001600160a01b038085169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a39392505050565b336002600160a01b0314610d105760405163973d02cb60e01b815260040161056690611c1c565b600054610100900460ff1615808015610d305750600054600160ff909116105b80610d4a5750303b158015610d4a575060005460ff166001145b610d665760405162461bcd60e51b815260040161056690611c40565b6000805460ff191660011790558015610d89576000805461ff0019166101001790555b610d958585858561103a565b8015610ddb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b828114610e335760405162461bcd60e51b815260206004820152602b60248201526000805160206121dc83398151915260448201526a082989288be988a9c8ea8960ab1b6064820152608401610566565b610ddb8585858585611377565b610e48611535565b6000610e538461153d565b604051632142170760e11b81529091506001600160a01b038516906342842e0e90610e8690339030908790600401611e10565b600060405180830381600087803b158015610ea057600080fd5b505af1158015610eb4573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038a811682840152336060830152898116608083015260a08083018a90528351808403909101815260c08301938490526316f1983160e01b90935293841695506316f198319450610f44939092169160c401611de4565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917fe3abb9ec195b50242582cc6cb7abc990ac26439b9ed7635ed72f7bd720e7477a910160405180910390a4610907565b6033546001600160a01b031633146104fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610566565b606580546001600160a01b031916905561057881611585565b6001600160a01b0384161580159061105a57506001600160a01b03831615155b801561106e57506001600160a01b03821615155b801561108257506001600160a01b03811615155b6110e65760405162461bcd60e51b815260206004820152602f60248201527f526f6f744d696e7461626c654552433732315072656469636174653a2042414460448201526e2fa4a724aa24a0a624ad20aa24a7a760891b6064820152608401610566565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b600080808061114785870187611e34565b6001600160a01b03808516600090815261010060205260409020549498509296509094509250168061117b5761117b611e85565b604051632142170760e11b81526001600160a01b038616906342842e0e906111ab90309087908790600401611e10565b600060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b5050604080516001600160a01b03888116825260208201879052808816945085811693508916917f80afffd84aa825dd9b3c1ba262eb55eef58f78616634437a367a263f3c48fe3d91015b60405180910390a450505050505050565b600080808061124685870187611f24565b6001600160a01b038085166000908152610100602052604090205494995092975090955093501690508061127c5761127c611e85565b60005b825181101561132757856001600160a01b03166342842e0e308684815181106112aa576112aa612016565b60200260200101518685815181106112c4576112c4612016565b60200260200101516040518463ffffffff1660e01b81526004016112ea93929190611e10565b600060405180830381600087803b15801561130457600080fd5b505af1158015611318573d6000803e3d6000fd5b5050505080600101905061127f565b50836001600160a01b0316816001600160a01b0316866001600160a01b03167ff64537485d843fa8a1f4354cb9937954c64282de0828be9f096355006222186b868660405161122492919061202c565b61137f611535565b600061138a8661153d565b905060005b8281101561141c57866001600160a01b03166342842e0e33308787868181106113ba576113ba612016565b905060200201356040518463ffffffff1660e01b81526004016113df93929190611e10565b600060405180830381600087803b1580156113f957600080fd5b505af115801561140d573d6000803e3d6000fd5b5050505080600101905061138f565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611474907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908b9033908c908c908c908c9060200161212b565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016114a0929190611de4565b600060405180830381600087803b1580156114ba57600080fd5b505af11580156114ce573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316876001600160a01b03167f0ca5d99e0f7e7651c00c76347baa68a333790cbc9fb039a10843d1bd61f578c588888888604051611525949392919061217f565b60405180910390a4505050505050565b6104fa6115d7565b6001600160a01b0380821660009081526101006020526040902054168061156a576115678261098e565b90505b6001600160a01b03811661158057611580611e85565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156116e257604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161163991906121a6565b6000604051808303818686fa925050503d8060008114611675576040519150601f19603f3d011682016040523d82523d6000602084013e61167a565b606091505b509150915081801561169f575060008180602001905181019061169d91906121c2565b115b6116df5760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b6044820152606401610566565b50505b60c954610100900460ff16156104fa57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161174991906121a6565b6000604051808303818686fa925050503d8060008114611785576040519150601f19603f3d011682016040523d82523d6000602084013e61178a565b606091505b50915091508180156117b05750808060200190518101906117ab91906121c2565b600114155b6104e45760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b6044820152606401610566565b6001600160a01b038116811461057857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561184057611840611802565b604052919050565b60006001600160401b0382111561186157611861611802565b50601f01601f191660200190565b6000806000806080858703121561188557600080fd5b8435611890816117ed565b935060208501356118a0816117ed565b92506040850135915060608501356001600160401b038111156118c257600080fd5b8501601f810187136118d357600080fd5b80356118e66118e182611848565b611818565b8181528860208385010111156118fb57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561193057600080fd5b823561193b816117ed565b946020939093013593505050565b60006020828403121561195b57600080fd5b8135611966816117ed565b9392505050565b8035801515811461158057600080fd5b60006020828403121561198f57600080fd5b6119668261196d565b600080600080600080600060e0888a0312156119b357600080fd5b87356119be816117ed565b965060208801356119ce816117ed565b955060408801356119de816117ed565b945060608801356119ee816117ed565b93506119fc6080890161196d565b9250611a0a60a0890161196d565b915060c0880135611a1a816117ed565b8091505092959891949750929550565b60008060008060608587031215611a4057600080fd5b843593506020850135611a52816117ed565b925060408501356001600160401b0380821115611a6e57600080fd5b818701915087601f830112611a8257600080fd5b813581811115611a9157600080fd5b886020828501011115611aa357600080fd5b95989497505060200194505050565b600080600060608486031215611ac757600080fd5b8335611ad2816117ed565b92506020840135611ae2816117ed565b929592945050506040919091013590565b60008060008060808587031215611b0957600080fd5b8435611b14816117ed565b93506020850135611b24816117ed565b92506040850135611b34816117ed565b91506060850135611b44816117ed565b939692955090935050565b60008083601f840112611b6157600080fd5b5081356001600160401b03811115611b7857600080fd5b6020830191508360208260051b8501011115611b9357600080fd5b9250929050565b600080600080600060608688031215611bb257600080fd5b8535611bbd816117ed565b945060208601356001600160401b0380821115611bd957600080fd5b611be589838a01611b4f565b90965094506040880135915080821115611bfe57600080fd5b50611c0b88828901611b4f565b969995985093965092949392505050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611c9e57600080fd5b83861115611cab57600080fd5b5050820193919092039150565b80356020831015611cd157600019602084900360031b1b165b92915050565b60005b83811015611cf2578181015183820152602001611cda565b50506000910152565b600060208284031215611d0d57600080fd5b81516001600160401b03811115611d2357600080fd5b8201601f81018413611d3457600080fd5b8051611d426118e182611848565b818152856020838501011115611d5757600080fd5b611d68826020830160208601611cd7565b95945050505050565b60008151808452611d89816020860160208601611cd7565b601f01601f19169290920160200192915050565b8481526001600160a01b0384166020820152608060408201819052600090611dc790830185611d71565b8281036060840152611dd98185611d71565b979650505050505050565b6001600160a01b0383168152604060208201819052600090611e0890830184611d71565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60008060008060808587031215611e4a57600080fd5b8435611e55816117ed565b93506020850135611e65816117ed565b92506040850135611e75816117ed565b9396929550929360600135925050565b634e487b7160e01b600052600160045260246000fd5b60006001600160401b03821115611eb457611eb4611802565b5060051b60200190565b600082601f830112611ecf57600080fd5b81356020611edf6118e183611e9b565b82815260059290921b84018101918181019086841115611efe57600080fd5b8286015b84811015611f195780358352918301918301611f02565b509695505050505050565b600080600080600060a08688031215611f3c57600080fd5b85359450602080870135611f4f816117ed565b94506040870135611f5f816117ed565b935060608701356001600160401b0380821115611f7b57600080fd5b818901915089601f830112611f8f57600080fd5b8135611f9d6118e182611e9b565b81815260059190911b8301840190848101908c831115611fbc57600080fd5b938501935b82851015611fe3578435611fd4816117ed565b82529385019390850190611fc1565b965050506080890135925080831115611ffb57600080fd5b505061200988828901611ebe565b9150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b8281101561206e5781516001600160a01b031684529284019290840190600101612049565b5050508381038285015284518082528583019183019060005b818110156120a357835183529284019291840191600101612087565b5090979650505050505050565b8183526000602080850194508260005b858110156120ee5781356120d3816117ed565b6001600160a01b0316875295820195908201906001016120c0565b509495945050505050565b81835260006001600160fb1b0383111561211257600080fd5b8260051b80836020870137939093016020019392505050565b8781526001600160a01b0387811660208301528616604082015260a06060820181905260009061215e90830186886120b0565b82810360808401526121718185876120f9565b9a9950505050505050505050565b6040815260006121936040830186886120b0565b8281036020840152611dd98185876120f9565b600082516121b8818460208701611cd7565b9190910192915050565b6000602082840312156121d457600080fd5b505191905056fe526f6f744d696e7461626c654552433732315072656469636174653a20494e56a26469706673582212204063e808f9818c931a3cdbf2406d8b4f218ddd313bef99b78b2b8455373be0c864736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var ChildERC1155Artifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155","sourceName":"contracts/child/ChildERC1155.sol","abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rootToken_","type":"address"},{"internalType":"string","name":"uri_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"invalidateNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612b8b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101155760003560e01c806357128683116100a2578063e619870511610071578063e619870514610279578063e985e9c51461028b578063f242432a146102c7578063f399e22e146102da578063f5298aca146102ed57600080fd5b8063571286831461022d5780636b20c454146102405780639b77ef1114610253578063a22cb4651461026657600080fd5b8063156e29f6116100e9578063156e29f6146101965780631f2d0065146101a95780632d0335ab146101cf5780632eb2c2d6146101f85780634e1273f41461020d57600080fd5b8062fdd58e1461011a57806301ffc9a7146101405780630c53c51c146101635780630e89341c14610183575b600080fd5b61012d610128366004611cd5565b610300565b6040519081526020015b60405180910390f35b61015361014e366004611d15565b61039b565b6040519015158152602001610137565b610176610171366004611d7a565b6103eb565b6040516101379190611e49565b610176610191366004611e5c565b6106c9565b6101536101a4366004611e75565b61075d565b610103546001600160a01b03165b6040516001600160a01b039091168152602001610137565b61012d6101dd366004611ea8565b6001600160a01b031660009081526038602052604090205490565b61020b61020636600461200c565b6107b0565b005b61022061021b3660046120b5565b61080e565b60405161013791906121ba565b61015361023b366004612211565b610937565b61015361024e3660046122aa565b610a53565b61020b610261366004611e5c565b610afb565b61020b61027436600461232a565b610b22565b610102546001600160a01b03166101b7565b610153610299366004612366565b6001600160a01b03918216600090815260d16020908152604080832093909416825291909152205460ff1690565b61020b6102d5366004612399565b610b38565b61020b6102e83660046123fd565b610b8f565b6101536102fb366004611e75565b610da5565b60006001600160a01b0383166103705760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600081815260d0602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806103cc57506001600160e01b031982166303a24d0760e21b145b8061039557506301ffc9a760e01b6001600160e01b0319831614610395565b6060600061042e87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dde92505050565b90506001600160e01b03196000358116908216036104b45760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f640000006064820152608401610367565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506105258982888888610df9565b61057b5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610367565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d6040516020016105d09392919061244f565b60408051601f19818403018152908290526105ea91612475565b6000604051808303816000865af19150503d8060008114610627576040519150601f19603f3d011682016040523d82523d6000602084013e61062c565b606091505b50915091508161067e5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610367565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c6040516106b39493929190612491565b60405180910390a19a9950505050505050505050565b606060d280546106d8906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610704906124dd565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b50505050509050919050565b610102546000906001600160a01b0316331461078b5760405162461bcd60e51b815260040161036790612517565b6107a684848460405180602001604052806000815250610ed5565b5060019392505050565b6107b8610fe4565b6001600160a01b0316856001600160a01b031614806107de57506107de85610299610fe4565b6107fa5760405162461bcd60e51b81526004016103679061255c565b6108078585858585610ff3565b5050505050565b606081518351146108735760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610367565b600083516001600160401b0381111561088e5761088e611ec3565b6040519080825280602002602001820160405280156108b7578160200160208202803683370190505b50905060005b845181101561092f576109028582815181106108db576108db6125aa565b60200260200101518583815181106108f5576108f56125aa565b6020026020010151610300565b828281518110610914576109146125aa565b6020908102919091010152610928816125d6565b90506108bd565b509392505050565b610102546000906001600160a01b031633146109655760405162461bcd60e51b815260040161036790612517565b85848114801561097457508083145b6109c05760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a206172726179206c656e206d69736d617463686044820152606401610367565b60005b81811015610a4457610a3c8989838181106109e0576109e06125aa565b90506020020160208101906109f59190611ea8565b888884818110610a0757610a076125aa565b90506020020135878785818110610a2057610a206125aa565b9050602002013560405180602001604052806000815250610ed5565b6001016109c3565b50600198975050505050505050565b610102546000906001600160a01b03163314610a815760405162461bcd60e51b815260040161036790612517565b610aef8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061119d92505050565b50600195945050505050565b3360009081526038602052604081208054839290610b1a9084906125ef565b909155505050565b610b34610b2d610fe4565b8383611334565b5050565b610b40610fe4565b6001600160a01b0316856001600160a01b03161480610b665750610b6685610299610fe4565b610b825760405162461bcd60e51b81526004016103679061255c565b6108078585858585611414565b606b54610100900460ff1615808015610baf5750606b54600160ff909116105b80610bc95750303b158015610bc95750606b5460ff166001145b610c2c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610367565b606b805460ff191660011790558015610c4f57606b805461ff0019166101001790555b6001600160a01b038416610ca55760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a204241445f494e495449414c495a4154494f4e6044820152606401610367565b61010380546001600160a01b0386166001600160a01b031991821617909155610102805490911633179055604080516020601f8501819004810282018101909252838152610d0d91859085908190840183828082843760009201919091525061153b92505050565b610d59610d22856001600160a01b031661156e565b604051602001610d329190612602565b60408051601f1981840301815282820190915260018252603160f81b602083015290611584565b8015610d9f57606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610102546000906001600160a01b03163314610dd35760405162461bcd60e51b815260040161036790612517565b6107a68484846115f0565b60008151600003610df157506000919050565b506020015190565b6000806001610e0f610e0a886116f0565b61176d565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610e5d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610367565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6001600160a01b038416610f355760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610367565b6000610f3f610fe4565b90506000610f4c8561179a565b90506000610f598561179a565b9050600086815260d0602090815260408083206001600160a01b038b16845290915281208054879290610f8d9084906125ef565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020612af3833981519152910160405180910390a4610fdb836000898989896117e5565b50505050505050565b6000610fee611940565b905090565b81518351146110145760405162461bcd60e51b815260040161036790612637565b6001600160a01b03841661103a5760405162461bcd60e51b81526004016103679061267f565b6000611044610fe4565b905060005b845181101561112f576000858281518110611066576110666125aa565b602002602001015190506000858381518110611084576110846125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038e1683529093529190912054909150818110156110d55760405162461bcd60e51b8152600401610367906126c4565b600083815260d0602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111149084906125ef565b9250508190555050505080611128906125d6565b9050611049565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161117f92919061270e565b60405180910390a461119581878787878761199c565b505050505050565b6001600160a01b0383166111c35760405162461bcd60e51b81526004016103679061273c565b80518251146111e45760405162461bcd60e51b815260040161036790612637565b60006111ee610fe4565b604080516020810190915260009052905060005b83518110156112c757600084828151811061121f5761121f6125aa565b60200260200101519050600084838151811061123d5761123d6125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038c16835290935291909120549091508181101561128e5760405162461bcd60e51b81526004016103679061277f565b600092835260d0602090815260408085206001600160a01b038b16865290915290922091039055806112bf816125d6565b915050611202565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161131892919061270e565b60405180910390a4604080516020810190915260009052610d9f565b816001600160a01b0316836001600160a01b0316036113a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610367565b6001600160a01b03838116600081815260d16020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661143a5760405162461bcd60e51b81526004016103679061267f565b6000611444610fe4565b905060006114518561179a565b9050600061145e8561179a565b9050600086815260d0602090815260408083206001600160a01b038c168452909152902054858110156114a35760405162461bcd60e51b8152600401610367906126c4565b600087815260d0602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906114e29084906125ef565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020612af3833981519152910160405180910390a4611530848a8a8a8a8a6117e5565b505050505050505050565b606b54610100900460ff166115625760405162461bcd60e51b8152600401610367906127c3565b61156b81611a57565b50565b60606103956001600160a01b0383166014611a87565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6115d2818484611c29565b600055600280546001600160a01b0319163017905560055550505050565b6001600160a01b0383166116165760405162461bcd60e51b81526004016103679061273c565b6000611620610fe4565b9050600061162d8461179a565b9050600061163a8461179a565b604080516020808201835260009182905288825260d081528282206001600160a01b038b16835290522054909150848110156116885760405162461bcd60e51b81526004016103679061277f565b600086815260d0602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020612af3833981519152910160405180910390a4604080516020810190915260009052610fdb565b6000604051806080016040528060438152602001612b136043913980516020918201208351848301516040808701518051908601209051611750950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039561177a611c72565b8360405161190160f01b8152600281019290925260228201526042902090565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106117d4576117d46125aa565b602090810291909101015292915050565b6001600160a01b0384163b156111955760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611829908990899088908890889060040161280e565b6020604051808303816000875af1925050508015611864575060408051601f3d908101601f1916820190925261186191810190612853565b60015b61191057611870612870565b806308c379a0036118a9575061188461288b565b8061188f57506118ab565b8060405162461bcd60e51b81526004016103679190611e49565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610367565b6001600160e01b0319811663f23a6e6160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b600030330361199657600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506119999050565b50335b90565b6001600160a01b0384163b156111955760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906119e0908990899088908890889060040161295c565b6020604051808303816000875af1925050508015611a1b575060408051601f3d908101601f19168201909252611a1891810190612853565b60015b611a2757611870612870565b6001600160e01b0319811663bc197c8160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b606b54610100900460ff16611a7e5760405162461bcd60e51b8152600401610367906127c3565b61156b81611cad565b60606000611a968360026129ba565b611aa19060026125ef565b6001600160401b03811115611ab857611ab8611ec3565b6040519080825280601f01601f191660200182016040528015611ae2576020820181803683370190505b509050600360fc1b81600081518110611afd57611afd6125aa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b2c57611b2c6125aa565b60200101906001600160f81b031916908160001a9053506000611b508460026129ba565b611b5b9060016125ef565b90505b6001811115611bd3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611b8f57611b8f6125aa565b1a60f81b828281518110611ba557611ba56125aa565b60200101906001600160f81b031916908160001a90535060049490941c93611bcc816129d1565b9050611b5e565b508315611c225760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610367565b9392505050565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611c90575060015446145b15611c9c575060005490565b610fee600554600354600454611c29565b60d2610b348282612a33565b80356001600160a01b0381168114611cd057600080fd5b919050565b60008060408385031215611ce857600080fd5b611cf183611cb9565b946020939093013593505050565b6001600160e01b03198116811461156b57600080fd5b600060208284031215611d2757600080fd5b8135611c2281611cff565b60008083601f840112611d4457600080fd5b5081356001600160401b03811115611d5b57600080fd5b602083019150836020828501011115611d7357600080fd5b9250929050565b60008060008060008060a08789031215611d9357600080fd5b611d9c87611cb9565b955060208701356001600160401b03811115611db757600080fd5b611dc389828a01611d32565b9096509450506040870135925060608701359150608087013560ff81168114611deb57600080fd5b809150509295509295509295565b60005b83811015611e14578181015183820152602001611dfc565b50506000910152565b60008151808452611e35816020860160208601611df9565b601f01601f19169290920160200192915050565b602081526000611c226020830184611e1d565b600060208284031215611e6e57600080fd5b5035919050565b600080600060608486031215611e8a57600080fd5b611e9384611cb9565b95602085013595506040909401359392505050565b600060208284031215611eba57600080fd5b611c2282611cb9565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611efe57611efe611ec3565b6040525050565b60006001600160401b03821115611f1e57611f1e611ec3565b5060051b60200190565b600082601f830112611f3957600080fd5b81356020611f4682611f05565b604051611f538282611ed9565b83815260059390931b8501820192828101915086841115611f7357600080fd5b8286015b84811015611f8e5780358352918301918301611f77565b509695505050505050565b600082601f830112611faa57600080fd5b81356001600160401b03811115611fc357611fc3611ec3565b604051611fda601f8301601f191660200182611ed9565b818152846020838601011115611fef57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561202457600080fd5b61202d86611cb9565b945061203b60208701611cb9565b935060408601356001600160401b038082111561205757600080fd5b61206389838a01611f28565b9450606088013591508082111561207957600080fd5b61208589838a01611f28565b9350608088013591508082111561209b57600080fd5b506120a888828901611f99565b9150509295509295909350565b600080604083850312156120c857600080fd5b82356001600160401b03808211156120df57600080fd5b818501915085601f8301126120f357600080fd5b8135602061210082611f05565b60405161210d8282611ed9565b83815260059390931b850182019282810191508984111561212d57600080fd5b948201945b838610156121525761214386611cb9565b82529482019490820190612132565b9650508601359250508082111561216857600080fd5b5061217585828601611f28565b9150509250929050565b600081518084526020808501945080840160005b838110156121af57815187529582019590820190600101612193565b509495945050505050565b602081526000611c22602083018461217f565b60008083601f8401126121df57600080fd5b5081356001600160401b038111156121f657600080fd5b6020830191508360208260051b8501011115611d7357600080fd5b6000806000806000806060878903121561222a57600080fd5b86356001600160401b038082111561224157600080fd5b61224d8a838b016121cd565b9098509650602089013591508082111561226657600080fd5b6122728a838b016121cd565b9096509450604089013591508082111561228b57600080fd5b5061229889828a016121cd565b979a9699509497509295939492505050565b6000806000806000606086880312156122c257600080fd5b6122cb86611cb9565b945060208601356001600160401b03808211156122e757600080fd5b6122f389838a016121cd565b9096509450604088013591508082111561230c57600080fd5b50612319888289016121cd565b969995985093965092949392505050565b6000806040838503121561233d57600080fd5b61234683611cb9565b91506020830135801515811461235b57600080fd5b809150509250929050565b6000806040838503121561237957600080fd5b61238283611cb9565b915061239060208401611cb9565b90509250929050565b600080600080600060a086880312156123b157600080fd5b6123ba86611cb9565b94506123c860208701611cb9565b9350604086013592506060860135915060808601356001600160401b038111156123f157600080fd5b6120a888828901611f99565b60008060006040848603121561241257600080fd5b61241b84611cb9565b925060208401356001600160401b0381111561243657600080fd5b61244286828701611d32565b9497909650939450505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251612487818460208701611df9565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b600181811c908216806124f157607f821691505b60208210810361251157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526025908201527f4368696c64455243313135353a204f6e6c79207072656469636174652063616e6040820152640818d85b1b60da1b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016125e8576125e86125c0565b5060010190565b80820180821115610395576103956125c0565b6c4368696c64455243313135352d60981b81526000825161262a81600d850160208701611df9565b91909101600d0192915050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612721604083018561217f565b8281036020840152612733818561217f565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061284890830184611e1d565b979650505050505050565b60006020828403121561286557600080fd5b8151611c2281611cff565b600060033d11156119995760046000803e5060005160e01c90565b600060443d10156128995790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156128c857505050505090565b82850191508151818111156128e05750505050505090565b843d87010160208285010111156128fa5750505050505090565b61290960208286010187611ed9565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906129889083018661217f565b828103606084015261299a818661217f565b905082810360808401526129ae8185611e1d565b98975050505050505050565b8082028115828204841417610395576103956125c0565b6000816129e0576129e06125c0565b506000190190565b601f821115612a2e57600081815260208120601f850160051c81016020861015612a0f5750805b601f850160051c820191505b8181101561119557828155600101612a1b565b505050565b81516001600160401b03811115612a4c57612a4c611ec3565b612a6081612a5a84546124dd565b846129e8565b602080601f831160018114612a955760008415612a7d5750858301515b600019600386901b1c1916600185901b178555611195565b600085815260208120601f198616915b82811015612ac457888601518255948401946001909101908401612aa5565b5085821015612ae25787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f624d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220d48b6656ae2af8f39607add0ff4fc12029027806b1a7c756a64f97827803920c64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101155760003560e01c806357128683116100a2578063e619870511610071578063e619870514610279578063e985e9c51461028b578063f242432a146102c7578063f399e22e146102da578063f5298aca146102ed57600080fd5b8063571286831461022d5780636b20c454146102405780639b77ef1114610253578063a22cb4651461026657600080fd5b8063156e29f6116100e9578063156e29f6146101965780631f2d0065146101a95780632d0335ab146101cf5780632eb2c2d6146101f85780634e1273f41461020d57600080fd5b8062fdd58e1461011a57806301ffc9a7146101405780630c53c51c146101635780630e89341c14610183575b600080fd5b61012d610128366004611cd5565b610300565b6040519081526020015b60405180910390f35b61015361014e366004611d15565b61039b565b6040519015158152602001610137565b610176610171366004611d7a565b6103eb565b6040516101379190611e49565b610176610191366004611e5c565b6106c9565b6101536101a4366004611e75565b61075d565b610103546001600160a01b03165b6040516001600160a01b039091168152602001610137565b61012d6101dd366004611ea8565b6001600160a01b031660009081526038602052604090205490565b61020b61020636600461200c565b6107b0565b005b61022061021b3660046120b5565b61080e565b60405161013791906121ba565b61015361023b366004612211565b610937565b61015361024e3660046122aa565b610a53565b61020b610261366004611e5c565b610afb565b61020b61027436600461232a565b610b22565b610102546001600160a01b03166101b7565b610153610299366004612366565b6001600160a01b03918216600090815260d16020908152604080832093909416825291909152205460ff1690565b61020b6102d5366004612399565b610b38565b61020b6102e83660046123fd565b610b8f565b6101536102fb366004611e75565b610da5565b60006001600160a01b0383166103705760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600081815260d0602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806103cc57506001600160e01b031982166303a24d0760e21b145b8061039557506301ffc9a760e01b6001600160e01b0319831614610395565b6060600061042e87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dde92505050565b90506001600160e01b03196000358116908216036104b45760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f640000006064820152608401610367565b604080516060810182526001600160a01b038a16600081815260386020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506105258982888888610df9565b61057b5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610367565b603860008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d6040516020016105d09392919061244f565b60408051601f19818403018152908290526105ea91612475565b6000604051808303816000865af19150503d8060008114610627576040519150601f19603f3d011682016040523d82523d6000602084013e61062c565b606091505b50915091508161067e5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610367565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c6040516106b39493929190612491565b60405180910390a19a9950505050505050505050565b606060d280546106d8906124dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610704906124dd565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b50505050509050919050565b610102546000906001600160a01b0316331461078b5760405162461bcd60e51b815260040161036790612517565b6107a684848460405180602001604052806000815250610ed5565b5060019392505050565b6107b8610fe4565b6001600160a01b0316856001600160a01b031614806107de57506107de85610299610fe4565b6107fa5760405162461bcd60e51b81526004016103679061255c565b6108078585858585610ff3565b5050505050565b606081518351146108735760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610367565b600083516001600160401b0381111561088e5761088e611ec3565b6040519080825280602002602001820160405280156108b7578160200160208202803683370190505b50905060005b845181101561092f576109028582815181106108db576108db6125aa565b60200260200101518583815181106108f5576108f56125aa565b6020026020010151610300565b828281518110610914576109146125aa565b6020908102919091010152610928816125d6565b90506108bd565b509392505050565b610102546000906001600160a01b031633146109655760405162461bcd60e51b815260040161036790612517565b85848114801561097457508083145b6109c05760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a206172726179206c656e206d69736d617463686044820152606401610367565b60005b81811015610a4457610a3c8989838181106109e0576109e06125aa565b90506020020160208101906109f59190611ea8565b888884818110610a0757610a076125aa565b90506020020135878785818110610a2057610a206125aa565b9050602002013560405180602001604052806000815250610ed5565b6001016109c3565b50600198975050505050505050565b610102546000906001600160a01b03163314610a815760405162461bcd60e51b815260040161036790612517565b610aef8686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808a0282810182019093528982529093508992508891829185019084908082843760009201919091525061119d92505050565b50600195945050505050565b3360009081526038602052604081208054839290610b1a9084906125ef565b909155505050565b610b34610b2d610fe4565b8383611334565b5050565b610b40610fe4565b6001600160a01b0316856001600160a01b03161480610b665750610b6685610299610fe4565b610b825760405162461bcd60e51b81526004016103679061255c565b6108078585858585611414565b606b54610100900460ff1615808015610baf5750606b54600160ff909116105b80610bc95750303b158015610bc95750606b5460ff166001145b610c2c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610367565b606b805460ff191660011790558015610c4f57606b805461ff0019166101001790555b6001600160a01b038416610ca55760405162461bcd60e51b815260206004820181905260248201527f4368696c64455243313135353a204241445f494e495449414c495a4154494f4e6044820152606401610367565b61010380546001600160a01b0386166001600160a01b031991821617909155610102805490911633179055604080516020601f8501819004810282018101909252838152610d0d91859085908190840183828082843760009201919091525061153b92505050565b610d59610d22856001600160a01b031661156e565b604051602001610d329190612602565b60408051601f1981840301815282820190915260018252603160f81b602083015290611584565b8015610d9f57606b805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610102546000906001600160a01b03163314610dd35760405162461bcd60e51b815260040161036790612517565b6107a68484846115f0565b60008151600003610df157506000919050565b506020015190565b6000806001610e0f610e0a886116f0565b61176d565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610e5d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610367565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6001600160a01b038416610f355760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610367565b6000610f3f610fe4565b90506000610f4c8561179a565b90506000610f598561179a565b9050600086815260d0602090815260408083206001600160a01b038b16845290915281208054879290610f8d9084906125ef565b909155505060408051878152602081018790526001600160a01b03808a169260009291871691600080516020612af3833981519152910160405180910390a4610fdb836000898989896117e5565b50505050505050565b6000610fee611940565b905090565b81518351146110145760405162461bcd60e51b815260040161036790612637565b6001600160a01b03841661103a5760405162461bcd60e51b81526004016103679061267f565b6000611044610fe4565b905060005b845181101561112f576000858281518110611066576110666125aa565b602002602001015190506000858381518110611084576110846125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038e1683529093529190912054909150818110156110d55760405162461bcd60e51b8152600401610367906126c4565b600083815260d0602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111149084906125ef565b9250508190555050505080611128906125d6565b9050611049565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161117f92919061270e565b60405180910390a461119581878787878761199c565b505050505050565b6001600160a01b0383166111c35760405162461bcd60e51b81526004016103679061273c565b80518251146111e45760405162461bcd60e51b815260040161036790612637565b60006111ee610fe4565b604080516020810190915260009052905060005b83518110156112c757600084828151811061121f5761121f6125aa565b60200260200101519050600084838151811061123d5761123d6125aa565b602090810291909101810151600084815260d0835260408082206001600160a01b038c16835290935291909120549091508181101561128e5760405162461bcd60e51b81526004016103679061277f565b600092835260d0602090815260408085206001600160a01b038b16865290915290922091039055806112bf816125d6565b915050611202565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161131892919061270e565b60405180910390a4604080516020810190915260009052610d9f565b816001600160a01b0316836001600160a01b0316036113a75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610367565b6001600160a01b03838116600081815260d16020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661143a5760405162461bcd60e51b81526004016103679061267f565b6000611444610fe4565b905060006114518561179a565b9050600061145e8561179a565b9050600086815260d0602090815260408083206001600160a01b038c168452909152902054858110156114a35760405162461bcd60e51b8152600401610367906126c4565b600087815260d0602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906114e29084906125ef565b909155505060408051888152602081018890526001600160a01b03808b16928c82169291881691600080516020612af3833981519152910160405180910390a4611530848a8a8a8a8a6117e5565b505050505050505050565b606b54610100900460ff166115625760405162461bcd60e51b8152600401610367906127c3565b61156b81611a57565b50565b60606103956001600160a01b0383166014611a87565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6115d2818484611c29565b600055600280546001600160a01b0319163017905560055550505050565b6001600160a01b0383166116165760405162461bcd60e51b81526004016103679061273c565b6000611620610fe4565b9050600061162d8461179a565b9050600061163a8461179a565b604080516020808201835260009182905288825260d081528282206001600160a01b038b16835290522054909150848110156116885760405162461bcd60e51b81526004016103679061277f565b600086815260d0602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a9052909290881691600080516020612af3833981519152910160405180910390a4604080516020810190915260009052610fdb565b6000604051806080016040528060438152602001612b136043913980516020918201208351848301516040808701518051908601209051611750950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061039561177a611c72565b8360405161190160f01b8152600281019290925260228201526042902090565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106117d4576117d46125aa565b602090810291909101015292915050565b6001600160a01b0384163b156111955760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611829908990899088908890889060040161280e565b6020604051808303816000875af1925050508015611864575060408051601f3d908101601f1916820190925261186191810190612853565b60015b61191057611870612870565b806308c379a0036118a9575061188461288b565b8061188f57506118ab565b8060405162461bcd60e51b81526004016103679190611e49565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610367565b6001600160e01b0319811663f23a6e6160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b600030330361199657600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506119999050565b50335b90565b6001600160a01b0384163b156111955760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906119e0908990899088908890889060040161295c565b6020604051808303816000875af1925050508015611a1b575060408051601f3d908101601f19168201909252611a1891810190612853565b60015b611a2757611870612870565b6001600160e01b0319811663bc197c8160e01b14610fdb5760405162461bcd60e51b815260040161036790612914565b606b54610100900460ff16611a7e5760405162461bcd60e51b8152600401610367906127c3565b61156b81611cad565b60606000611a968360026129ba565b611aa19060026125ef565b6001600160401b03811115611ab857611ab8611ec3565b6040519080825280601f01601f191660200182016040528015611ae2576020820181803683370190505b509050600360fc1b81600081518110611afd57611afd6125aa565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b2c57611b2c6125aa565b60200101906001600160f81b031916908160001a9053506000611b508460026129ba565b611b5b9060016125ef565b90505b6001811115611bd3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611b8f57611b8f6125aa565b1a60f81b828281518110611ba557611ba56125aa565b60200101906001600160f81b031916908160001a90535060049490941c93611bcc816129d1565b9050611b5e565b508315611c225760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610367565b9392505050565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b031630148015611c90575060015446145b15611c9c575060005490565b610fee600554600354600454611c29565b60d2610b348282612a33565b80356001600160a01b0381168114611cd057600080fd5b919050565b60008060408385031215611ce857600080fd5b611cf183611cb9565b946020939093013593505050565b6001600160e01b03198116811461156b57600080fd5b600060208284031215611d2757600080fd5b8135611c2281611cff565b60008083601f840112611d4457600080fd5b5081356001600160401b03811115611d5b57600080fd5b602083019150836020828501011115611d7357600080fd5b9250929050565b60008060008060008060a08789031215611d9357600080fd5b611d9c87611cb9565b955060208701356001600160401b03811115611db757600080fd5b611dc389828a01611d32565b9096509450506040870135925060608701359150608087013560ff81168114611deb57600080fd5b809150509295509295509295565b60005b83811015611e14578181015183820152602001611dfc565b50506000910152565b60008151808452611e35816020860160208601611df9565b601f01601f19169290920160200192915050565b602081526000611c226020830184611e1d565b600060208284031215611e6e57600080fd5b5035919050565b600080600060608486031215611e8a57600080fd5b611e9384611cb9565b95602085013595506040909401359392505050565b600060208284031215611eba57600080fd5b611c2282611cb9565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611efe57611efe611ec3565b6040525050565b60006001600160401b03821115611f1e57611f1e611ec3565b5060051b60200190565b600082601f830112611f3957600080fd5b81356020611f4682611f05565b604051611f538282611ed9565b83815260059390931b8501820192828101915086841115611f7357600080fd5b8286015b84811015611f8e5780358352918301918301611f77565b509695505050505050565b600082601f830112611faa57600080fd5b81356001600160401b03811115611fc357611fc3611ec3565b604051611fda601f8301601f191660200182611ed9565b818152846020838601011115611fef57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561202457600080fd5b61202d86611cb9565b945061203b60208701611cb9565b935060408601356001600160401b038082111561205757600080fd5b61206389838a01611f28565b9450606088013591508082111561207957600080fd5b61208589838a01611f28565b9350608088013591508082111561209b57600080fd5b506120a888828901611f99565b9150509295509295909350565b600080604083850312156120c857600080fd5b82356001600160401b03808211156120df57600080fd5b818501915085601f8301126120f357600080fd5b8135602061210082611f05565b60405161210d8282611ed9565b83815260059390931b850182019282810191508984111561212d57600080fd5b948201945b838610156121525761214386611cb9565b82529482019490820190612132565b9650508601359250508082111561216857600080fd5b5061217585828601611f28565b9150509250929050565b600081518084526020808501945080840160005b838110156121af57815187529582019590820190600101612193565b509495945050505050565b602081526000611c22602083018461217f565b60008083601f8401126121df57600080fd5b5081356001600160401b038111156121f657600080fd5b6020830191508360208260051b8501011115611d7357600080fd5b6000806000806000806060878903121561222a57600080fd5b86356001600160401b038082111561224157600080fd5b61224d8a838b016121cd565b9098509650602089013591508082111561226657600080fd5b6122728a838b016121cd565b9096509450604089013591508082111561228b57600080fd5b5061229889828a016121cd565b979a9699509497509295939492505050565b6000806000806000606086880312156122c257600080fd5b6122cb86611cb9565b945060208601356001600160401b03808211156122e757600080fd5b6122f389838a016121cd565b9096509450604088013591508082111561230c57600080fd5b50612319888289016121cd565b969995985093965092949392505050565b6000806040838503121561233d57600080fd5b61234683611cb9565b91506020830135801515811461235b57600080fd5b809150509250929050565b6000806040838503121561237957600080fd5b61238283611cb9565b915061239060208401611cb9565b90509250929050565b600080600080600060a086880312156123b157600080fd5b6123ba86611cb9565b94506123c860208701611cb9565b9350604086013592506060860135915060808601356001600160401b038111156123f157600080fd5b6120a888828901611f99565b60008060006040848603121561241257600080fd5b61241b84611cb9565b925060208401356001600160401b0381111561243657600080fd5b61244286828701611d32565b9497909650939450505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251612487818460208701611df9565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b600181811c908216806124f157607f821691505b60208210810361251157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526025908201527f4368696c64455243313135353a204f6e6c79207072656469636174652063616e6040820152640818d85b1b60da1b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016125e8576125e86125c0565b5060010190565b80820180821115610395576103956125c0565b6c4368696c64455243313135352d60981b81526000825161262a81600d850160208701611df9565b91909101600d0192915050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612721604083018561217f565b8281036020840152612733818561217f565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061284890830184611e1d565b979650505050505050565b60006020828403121561286557600080fd5b8151611c2281611cff565b600060033d11156119995760046000803e5060005160e01c90565b600060443d10156128995790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156128c857505050505090565b82850191508151818111156128e05750505050505090565b843d87010160208285010111156128fa5750505050505090565b61290960208286010187611ed9565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906129889083018661217f565b828103606084015261299a818661217f565b905082810360808401526129ae8185611e1d565b98975050505050505050565b8082028115828204841417610395576103956125c0565b6000816129e0576129e06125c0565b506000190190565b601f821115612a2e57600081815260208120601f850160051c81016020861015612a0f5750805b601f850160051c820191505b8181101561119557828155600101612a1b565b505050565b81516001600160401b03811115612a4c57612a4c611ec3565b612a6081612a5a84546124dd565b846129e8565b602080601f831160018114612a955760008415612a7d5750858301515b600019600386901b1c1916600185901b178555611195565b600085815260208120601f198616915b82811015612ac457888601518255948401946001909101908401612aa5565b5085821015612ae25787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f624d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220d48b6656ae2af8f39607add0ff4fc12029027806b1a7c756a64f97827803920c64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC1155PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155Predicate","sourceName":"contracts/child/ChildERC1155Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506123d5806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b6101706102143660046119ca565b6037602052600090815260409020546001600160a01b031681565b61024261023d366004611a39565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611ae5565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611b1a565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b610242610343366004611b60565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611be8565b6108f2565b61039187878787878787610a4f565b50505050505050565b6103a683338484610dce565b505050565b6103b784848484610dce565b50505050565b6103f5604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b8152506110e3565b6034546001600160a01b031633146104675760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b61049f6040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b8152506110e3565b6035546001600160a01b0384811691161461050f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b606482015260840161045e565b610547604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b8152506110e3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610576602060008486611c44565b61057f91611c6e565b0361067e576105bc6040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b8152506110e3565b6105f4604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b8152506110e3565b6106096106048260208186611c44565b611129565b6106416040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b8152506110e3565b610679604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b8152506110e3565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186106ad602060008486611c44565b6106b691611c6e565b036107a7576106f360405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b8152506110e3565b61072b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b8152506110e3565b6107358282611394565b61076e6040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b8152506110e3565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b8152506110e3565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107d6602060008486611c44565b6107df91611c6e565b036108605761081d6040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b8152506110e3565b6108278282611601565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b8152506110e3565b6108996040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b8152506110e3565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b606482015260840161045e565b336002600160a01b03146109365760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161045e565b600054610100900460ff16158080156109565750600054600160ff909116105b806109705750303b158015610970575060005460ff166001145b6109d35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161045e565b6000805460ff1916600117905580156109f6576000805461ff0019166101001790555b610a0285858585611769565b8015610a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b86610a598161185f565b610a755760405162461bcd60e51b815260040161045e90611c8c565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad99190611ccf565b6001600160a01b038181166000908152603760205260409020549192508a8116911614610b185760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610b2e57610b2e611d31565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190611ccf565b6001600160a01b031614610bb057610bb0611d31565b8685148015610bbe57508483145b610c185760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b606482015260840161045e565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610c4c9033908a908a908a908a90600401611d79565b6020604051808303816000875af1158015610c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8f9190611dbd565b610cab5760405162461bcd60e51b815260040161045e90611ddf565b6033546035546040516001600160a01b03928316926316f19831921690610d06907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611e6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d32929190611f1b565b600060405180830381600087803b158015610d4c57600080fd5b505af1158015610d60573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610dbb96959493929190611f47565b60405180910390a4505050505050505050565b83610dd88161185f565b610df45760405162461bcd60e51b815260040161045e90611c8c565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190611ccf565b6001600160a01b03818116600090815260376020526040902054919250878116911614610e975760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610ead57610ead611d31565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611ccf565b6001600160a01b031614610f2f57610f2f611d31565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610f5f90339088908890600401611f90565b6020604051808303816000875af1158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190611dbd565b610fbe5760405162461bcd60e51b815260040161045e90611ddf565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110509391169160e401611f1b565b600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec23388886040516110d393929190611f90565b60405180910390a4505050505050565b611126816040516024016110f79190611fb1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118f4565b50565b60008080808061113b86880188611fc4565b6001600160a01b03808616600090815260376020526040902054959a509398509196509450925016806111805760405162461bcd60e51b815260040161045e90611cec565b6111898161185f565b61119557611195611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f99190611ccf565b9050866001600160a01b0316816001600160a01b03161461121c5761121c611d31565b6001600160a01b03811661123257611232611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190611ccf565b6001600160a01b0316146112b4576112b4611d31565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f6906112e490889088908890600401611f90565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190611dbd565b6113435760405162461bcd60e51b815260040161045e9061201f565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610dbb93929190611f90565b6000808080806113a686880188612135565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806113ed5760405162461bcd60e51b815260040161045e90611cec565b6113f68161185f565b61140257611402611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190611ccf565b9050866001600160a01b0316816001600160a01b03161461148957611489611d31565b6001600160a01b03811661149f5761149f611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190611ccf565b6001600160a01b03161461152157611521611d31565b604051635712868360e01b81526001600160a01b038316906357128683906115519088908890889060040161227a565b6020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115949190611dbd565b6115b05760405162461bcd60e51b815260040161045e9061201f565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610dbb9392919061227a565b600080611610838501856122ef565b9093509150506001600160a01b03821661162c5761162c611d31565b6001600160a01b03828116600090815260376020526040902054161561165457611654611d31565b6036546040516bffffffffffffffffffffffff19606085901b1660208201526000916116a4916001600160a01b0390911690603401604051602081830303815290604052805190602001206118fd565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e906116f89086908690600401611f1b565b600060405180830381600087803b15801561171257600080fd5b505af1158015611726573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061178957506001600160a01b03831615155b801561179d57506001600160a01b03821615155b80156117b157506001600160a01b03811615155b61180f5760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b606482015260840161045e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361187b57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118e2575060408051601f3d908101601f191682019092526118df91810190611dbd565b60015b6118ee57506000919050565b92915050565b61112681611994565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118ee5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161045e565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461112657600080fd5b6000602082840312156119dc57600080fd5b81356119e7816119b5565b9392505050565b60008083601f840112611a0057600080fd5b5081356001600160401b03811115611a1757600080fd5b6020830191508360208260051b8501011115611a3257600080fd5b9250929050565b60008060008060008060006080888a031215611a5457600080fd5b8735611a5f816119b5565b965060208801356001600160401b0380821115611a7b57600080fd5b611a878b838c016119ee565b909850965060408a0135915080821115611aa057600080fd5b611aac8b838c016119ee565b909650945060608a0135915080821115611ac557600080fd5b50611ad28a828b016119ee565b989b979a50959850939692959293505050565b600080600060608486031215611afa57600080fd5b8335611b05816119b5565b95602085013595506040909401359392505050565b60008060008060808587031215611b3057600080fd5b8435611b3b816119b5565b93506020850135611b4b816119b5565b93969395505050506040820135916060013590565b60008060008060608587031215611b7657600080fd5b843593506020850135611b88816119b5565b925060408501356001600160401b0380821115611ba457600080fd5b818701915087601f830112611bb857600080fd5b813581811115611bc757600080fd5b886020828501011115611bd957600080fd5b95989497505060200194505050565b60008060008060808587031215611bfe57600080fd5b8435611c09816119b5565b93506020850135611c19816119b5565b92506040850135611c29816119b5565b91506060850135611c39816119b5565b939692955090935050565b60008085851115611c5457600080fd5b83861115611c6157600080fd5b5050820193919092039150565b803560208310156118ee57600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b600060208284031215611ce157600080fd5b81516119e7816119b5565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611d6057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611d9e9083018688611d47565b8281036040840152611db1818587611d47565b98975050505050505050565b600060208284031215611dcf57600080fd5b815180151581146119e757600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611e5f578135611e44816119b5565b6001600160a01b031687529582019590820190600101611e31565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611e9d908301888a611e21565b8281036080840152611eb0818789611d47565b905082810360a0840152611ec5818587611d47565b9c9b505050505050505050505050565b6000815180845260005b81811015611efb57602081850181015186830182015201611edf565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611f3f90830184611ed5565b949350505050565b606081526000611f5b60608301888a611e21565b8281036020840152611f6e818789611d47565b90508281036040840152611f83818587611d47565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006119e76020830184611ed5565b600080600080600060a08688031215611fdc57600080fd5b8535611fe7816119b5565b94506020860135611ff7816119b5565b93506040860135612007816119b5565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561209f5761209f612061565b604052919050565b60006001600160401b038211156120c0576120c0612061565b5060051b60200190565b600082601f8301126120db57600080fd5b813560206120f06120eb836120a7565b612077565b82815260059290921b8401810191818101908684111561210f57600080fd5b8286015b8481101561212a5780358352918301918301612113565b509695505050505050565b60008060008060008060c0878903121561214e57600080fd5b86359550602080880135612161816119b5565b95506040880135612171816119b5565b945060608801356001600160401b038082111561218d57600080fd5b818a0191508a601f8301126121a157600080fd5b81356121af6120eb826120a7565b81815260059190911b8301840190848101908d8311156121ce57600080fd5b938501935b828510156121f55784356121e6816119b5565b825293850193908501906121d3565b9750505060808a013592508083111561220d57600080fd5b6122198b848c016120ca565b945060a08a013592508083111561222f57600080fd5b505061223d89828a016120ca565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611e5f5781518752958201959082019060010161225e565b606080825284519082018190526000906020906080840190828801845b828110156122bc5781516001600160a01b031684529284019290840190600101612297565b505050838103828501526122d0818761224a565b91505082810360408401526122e5818561224a565b9695505050505050565b60008060006060848603121561230457600080fd5b83359250602080850135612317816119b5565b925060408501356001600160401b038082111561233357600080fd5b818701915087601f83011261234757600080fd5b81358181111561235957612359612061565b61236b601f8201601f19168501612077565b9150808252888482850101111561238157600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220b8ff1c1a3dc85da9eeea2b90e4ccedbf900288e11dfec6acff2354fa0f387aed64736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b6101706102143660046119ca565b6037602052600090815260409020546001600160a01b031681565b61024261023d366004611a39565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611ae5565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611b1a565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b610242610343366004611b60565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611be8565b6108f2565b61039187878787878787610a4f565b50505050505050565b6103a683338484610dce565b505050565b6103b784848484610dce565b50505050565b6103f5604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b8152506110e3565b6034546001600160a01b031633146104675760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b61049f6040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b8152506110e3565b6035546001600160a01b0384811691161461050f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b606482015260840161045e565b610547604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b8152506110e3565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610576602060008486611c44565b61057f91611c6e565b0361067e576105bc6040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b8152506110e3565b6105f4604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b8152506110e3565b6106096106048260208186611c44565b611129565b6106416040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b8152506110e3565b610679604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b8152506110e3565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186106ad602060008486611c44565b6106b691611c6e565b036107a7576106f360405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b8152506110e3565b61072b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b8152506110e3565b6107358282611394565b61076e6040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b8152506110e3565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b8152506110e3565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6107d6602060008486611c44565b6107df91611c6e565b036108605761081d6040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b8152506110e3565b6108278282611601565b610679604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b8152506110e3565b6108996040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b8152506110e3565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b606482015260840161045e565b336002600160a01b03146109365760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b604482015260640161045e565b600054610100900460ff16158080156109565750600054600160ff909116105b806109705750303b158015610970575060005460ff166001145b6109d35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161045e565b6000805460ff1916600117905580156109f6576000805461ff0019166101001790555b610a0285858585611769565b8015610a48576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b86610a598161185f565b610a755760405162461bcd60e51b815260040161045e90611c8c565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad99190611ccf565b6001600160a01b038181166000908152603760205260409020549192508a8116911614610b185760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610b2e57610b2e611d31565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190611ccf565b6001600160a01b031614610bb057610bb0611d31565b8685148015610bbe57508483145b610c185760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b606482015260840161045e565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610c4c9033908a908a908a908a90600401611d79565b6020604051808303816000875af1158015610c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8f9190611dbd565b610cab5760405162461bcd60e51b815260040161045e90611ddf565b6033546035546040516001600160a01b03928316926316f19831921690610d06907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611e6a565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d32929190611f1b565b600060405180830381600087803b158015610d4c57600080fd5b505af1158015610d60573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610dbb96959493929190611f47565b60405180910390a4505050505050505050565b83610dd88161185f565b610df45760405162461bcd60e51b815260040161045e90611c8c565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190611ccf565b6001600160a01b03818116600090815260376020526040902054919250878116911614610e975760405162461bcd60e51b815260040161045e90611cec565b6001600160a01b038116610ead57610ead611d31565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611ccf565b6001600160a01b031614610f2f57610f2f611d31565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610f5f90339088908890600401611f90565b6020604051808303816000875af1158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190611dbd565b610fbe5760405162461bcd60e51b815260040161045e90611ddf565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110509391169160e401611f1b565b600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec23388886040516110d393929190611f90565b60405180910390a4505050505050565b611126816040516024016110f79190611fb1565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118f4565b50565b60008080808061113b86880188611fc4565b6001600160a01b03808616600090815260376020526040902054959a509398509196509450925016806111805760405162461bcd60e51b815260040161045e90611cec565b6111898161185f565b61119557611195611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f99190611ccf565b9050866001600160a01b0316816001600160a01b03161461121c5761121c611d31565b6001600160a01b03811661123257611232611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e9190611ccf565b6001600160a01b0316146112b4576112b4611d31565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f6906112e490889088908890600401611f90565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190611dbd565b6113435760405162461bcd60e51b815260040161045e9061201f565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610dbb93929190611f90565b6000808080806113a686880188612135565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806113ed5760405162461bcd60e51b815260040161045e90611cec565b6113f68161185f565b61140257611402611d31565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114669190611ccf565b9050866001600160a01b0316816001600160a01b03161461148957611489611d31565b6001600160a01b03811661149f5761149f611d31565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b9190611ccf565b6001600160a01b03161461152157611521611d31565b604051635712868360e01b81526001600160a01b038316906357128683906115519088908890889060040161227a565b6020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115949190611dbd565b6115b05760405162461bcd60e51b815260040161045e9061201f565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610dbb9392919061227a565b600080611610838501856122ef565b9093509150506001600160a01b03821661162c5761162c611d31565b6001600160a01b03828116600090815260376020526040902054161561165457611654611d31565b6036546040516bffffffffffffffffffffffff19606085901b1660208201526000916116a4916001600160a01b0390911690603401604051602081830303815290604052805190602001206118fd565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e906116f89086908690600401611f1b565b600060405180830381600087803b15801561171257600080fd5b505af1158015611726573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061178957506001600160a01b03831615155b801561179d57506001600160a01b03821615155b80156117b157506001600160a01b03811615155b61180f5760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b606482015260840161045e565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361187b57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa9250505080156118e2575060408051601f3d908101601f191682019092526118df91810190611dbd565b60015b6118ee57506000919050565b92915050565b61112681611994565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166118ee5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b604482015260640161045e565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b038116811461112657600080fd5b6000602082840312156119dc57600080fd5b81356119e7816119b5565b9392505050565b60008083601f840112611a0057600080fd5b5081356001600160401b03811115611a1757600080fd5b6020830191508360208260051b8501011115611a3257600080fd5b9250929050565b60008060008060008060006080888a031215611a5457600080fd5b8735611a5f816119b5565b965060208801356001600160401b0380821115611a7b57600080fd5b611a878b838c016119ee565b909850965060408a0135915080821115611aa057600080fd5b611aac8b838c016119ee565b909650945060608a0135915080821115611ac557600080fd5b50611ad28a828b016119ee565b989b979a50959850939692959293505050565b600080600060608486031215611afa57600080fd5b8335611b05816119b5565b95602085013595506040909401359392505050565b60008060008060808587031215611b3057600080fd5b8435611b3b816119b5565b93506020850135611b4b816119b5565b93969395505050506040820135916060013590565b60008060008060608587031215611b7657600080fd5b843593506020850135611b88816119b5565b925060408501356001600160401b0380821115611ba457600080fd5b818701915087601f830112611bb857600080fd5b813581811115611bc757600080fd5b886020828501011115611bd957600080fd5b95989497505060200194505050565b60008060008060808587031215611bfe57600080fd5b8435611c09816119b5565b93506020850135611c19816119b5565b92506040850135611c29816119b5565b91506060850135611c39816119b5565b939692955090935050565b60008085851115611c5457600080fd5b83861115611c6157600080fd5b5050820193919092039150565b803560208310156118ee57600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b600060208284031215611ce157600080fd5b81516119e7816119b5565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b03831115611d6057600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611d9e9083018688611d47565b8281036040840152611db1818587611d47565b98975050505050505050565b600060208284031215611dcf57600080fd5b815180151581146119e757600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611e5f578135611e44816119b5565b6001600160a01b031687529582019590820190600101611e31565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611e9d908301888a611e21565b8281036080840152611eb0818789611d47565b905082810360a0840152611ec5818587611d47565b9c9b505050505050505050505050565b6000815180845260005b81811015611efb57602081850181015186830182015201611edf565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611f3f90830184611ed5565b949350505050565b606081526000611f5b60608301888a611e21565b8281036020840152611f6e818789611d47565b90508281036040840152611f83818587611d47565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006119e76020830184611ed5565b600080600080600060a08688031215611fdc57600080fd5b8535611fe7816119b5565b94506020860135611ff7816119b5565b93506040860135612007816119b5565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561209f5761209f612061565b604052919050565b60006001600160401b038211156120c0576120c0612061565b5060051b60200190565b600082601f8301126120db57600080fd5b813560206120f06120eb836120a7565b612077565b82815260059290921b8401810191818101908684111561210f57600080fd5b8286015b8481101561212a5780358352918301918301612113565b509695505050505050565b60008060008060008060c0878903121561214e57600080fd5b86359550602080880135612161816119b5565b95506040880135612171816119b5565b945060608801356001600160401b038082111561218d57600080fd5b818a0191508a601f8301126121a157600080fd5b81356121af6120eb826120a7565b81815260059190911b8301840190848101908d8311156121ce57600080fd5b938501935b828510156121f55784356121e6816119b5565b825293850193908501906121d3565b9750505060808a013592508083111561220d57600080fd5b6122198b848c016120ca565b945060a08a013592508083111561222f57600080fd5b505061223d89828a016120ca565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611e5f5781518752958201959082019060010161225e565b606080825284519082018190526000906020906080840190828801845b828110156122bc5781516001600160a01b031684529284019290840190600101612297565b505050838103828501526122d0818761224a565b91505082810360408401526122e5818561224a565b9695505050505050565b60008060006060848603121561230457600080fd5b83359250602080850135612317816119b5565b925060408501356001600160401b038082111561233357600080fd5b818701915087601f83011261234757600080fd5b81358181111561235957612359612061565b61236b601f8201601f19168501612077565b9150808252888482850101111561238157600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220b8ff1c1a3dc85da9eeea2b90e4ccedbf900288e11dfec6acff2354fa0f387aed64736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` -var ChildERC1155PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155PredicateAccessList","sourceName":"contracts/child/ChildERC1155PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612b6d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611ff5565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004612064565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004612110565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004612145565b610525565b61026661033f366004612199565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004612199565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da3660046121b6565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b61026661040736600461224c565b6106f6565b61026661041a366004611ff5565b610c26565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102666104543660046122d4565b610c97565b610461610d90565b61046b6000610dea565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610dea565b50565b6104f4610e03565b61050387878787878787610e0b565b50505050505050565b610514610e03565b6105208333848461118b565b505050565b61052d610e03565b6105398484848461118b565b50505050565b610547610d90565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610d90565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b610681888888886114a1565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610dea565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61072e604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b815250611597565b60fd546001600160a01b0316331461079b5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b6107d36040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b815250611597565b60fe546001600160a01b038481169116146108435760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b61087b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b815250611597565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108aa6020600084866123a2565b6108b3916123cc565b036109b2576108f06040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b815250611597565b610928604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b815250611597565b61093d61093882602081866123a2565b6115da565b6109756040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b815250611597565b6109ad604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b815250611597565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109e16020600084866123a2565b6109ea916123cc565b03610adb57610a2760405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b815250611597565b610a5f604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b815250611597565b610a698282611846565b610aa26040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b815250611597565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b815250611597565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610b0a6020600084866123a2565b610b13916123cc565b03610b9457610b516040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b815250611597565b610b5b8282611ab4565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b815250611597565b610bcd6040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b815250611597565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610c2e610d90565b606580546001600160a01b0383166001600160a01b03199091168117909155610c5f6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b0314610cbe5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff1615808015610cde5750600054600160ff909116105b80610cf85750303b158015610cf8575060005460ff166001145b610d145760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610d37576000805461ff0019166101001790555b610d43858585856114a1565b8015610d89576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e981611c1e565b61046b611c70565b86610e1581611e8a565b610e315760405162461bcd60e51b81526004016104d7906123ea565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e95919061242d565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610ed55760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b038116610eeb57610eeb61248f565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f57919061242d565b6001600160a01b031614610f6d57610f6d61248f565b8685148015610f7b57508483145b610fd55760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906110099033908a908a908a908a906004016124d7565b6020604051808303816000875af1158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c919061251b565b6110685760405162461bcd60e51b81526004016104d790612538565b60fc5460fe546040516001600160a01b03928316926316f198319216906110c3907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f906020016125c3565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110ef92919061267e565b600060405180830381600087803b15801561110957600080fd5b505af115801561111d573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051611178969594939291906126aa565b60405180910390a4505050505050505050565b8361119581611e8a565b6111b15760405162461bcd60e51b81526004016104d7906123ea565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611215919061242d565b6001600160a01b03818116600090815261010060205260409020549192508781169116146112555760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b03811661126b5761126b61248f565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d7919061242d565b6001600160a01b0316146112ed576112ed61248f565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061131d903390889088906004016126f3565b6020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061251b565b61137c5760405162461bcd60e51b81526004016104d790612538565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f198319361140e9391169160e40161267e565b600060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051611491939291906126f3565b60405180910390a4505050505050565b6001600160a01b038416158015906114c157506001600160a01b03831615155b80156114d557506001600160a01b03821615155b80156114e957506001600160a01b03811615155b6115475760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6104e9816040516024016115ab9190612714565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611f1f565b6000808080806115ec86880188612727565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806116325760405162461bcd60e51b81526004016104d79061244a565b61163b81611e8a565b6116475761164761248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ab919061242d565b9050866001600160a01b0316816001600160a01b0316146116ce576116ce61248f565b6001600160a01b0381166116e4576116e461248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611750919061242d565b6001600160a01b0316146117665761176661248f565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690611796908890889088906004016126f3565b6020604051808303816000875af11580156117b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d9919061251b565b6117f55760405162461bcd60e51b81526004016104d790612782565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051611178939291906126f3565b60008080808061185886880188612898565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806118a05760405162461bcd60e51b81526004016104d79061244a565b6118a981611e8a565b6118b5576118b561248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611919919061242d565b9050866001600160a01b0316816001600160a01b03161461193c5761193c61248f565b6001600160a01b0381166119525761195261248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119be919061242d565b6001600160a01b0316146119d4576119d461248f565b604051635712868360e01b81526001600160a01b03831690635712868390611a04908890889088906004016129dd565b6020604051808303816000875af1158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a47919061251b565b611a635760405162461bcd60e51b81526004016104d790612782565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051611178939291906129dd565b600080611ac383850185612a52565b9093509150506001600160a01b038216611adf57611adf61248f565b6001600160a01b03828116600090815261010060205260409020541615611b0857611b0861248f565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611b58916001600160a01b039091169060340160405160208183030381529060405280519060200120611f28565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e90611bad908690869060040161267e565b600060405180830381600087803b158015611bc757600080fd5b505af1158015611bdb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611d7b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611cd29190612b02565b6000604051808303818686fa925050503d8060008114611d0e576040519150601f19603f3d011682016040523d82523d6000602084013e611d13565b606091505b5091509150818015611d385750600081806020019051810190611d369190612b1e565b115b611d785760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611de29190612b02565b6000604051808303818686fa925050503d8060008114611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b5091509150818015611e49575080806020019051810190611e449190612b1e565b600114155b611e865760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611ea657506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611f0d575060408051601f3d908101601f19168201909252611f0a9181019061251b565b60015b611f1957506000919050565b92915050565b6104e981611fbf565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611f195760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146104e957600080fd5b60006020828403121561200757600080fd5b813561201281611fe0565b9392505050565b60008083601f84011261202b57600080fd5b5081356001600160401b0381111561204257600080fd5b6020830191508360208260051b850101111561205d57600080fd5b9250929050565b60008060008060008060006080888a03121561207f57600080fd5b873561208a81611fe0565b965060208801356001600160401b03808211156120a657600080fd5b6120b28b838c01612019565b909850965060408a01359150808211156120cb57600080fd5b6120d78b838c01612019565b909650945060608a01359150808211156120f057600080fd5b506120fd8a828b01612019565b989b979a50959850939692959293505050565b60008060006060848603121561212557600080fd5b833561213081611fe0565b95602085013595506040909401359392505050565b6000806000806080858703121561215b57600080fd5b843561216681611fe0565b9350602085013561217681611fe0565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b6000602082840312156121ab57600080fd5b81356120128161218b565b600080600080600080600060e0888a0312156121d157600080fd5b87356121dc81611fe0565b965060208801356121ec81611fe0565b955060408801356121fc81611fe0565b9450606088013561220c81611fe0565b9350608088013561221c8161218b565b925060a088013561222c8161218b565b915060c088013561223c81611fe0565b8091505092959891949750929550565b6000806000806060858703121561226257600080fd5b84359350602085013561227481611fe0565b925060408501356001600160401b038082111561229057600080fd5b818701915087601f8301126122a457600080fd5b8135818111156122b357600080fd5b8860208285010111156122c557600080fd5b95989497505060200194505050565b600080600080608085870312156122ea57600080fd5b84356122f581611fe0565b9350602085013561230581611fe0565b9250604085013561231581611fe0565b9150606085013561232581611fe0565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156123b257600080fd5b838611156123bf57600080fd5b5050820193919092039150565b80356020831015611f1957600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561243f57600080fd5b815161201281611fe0565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156124be57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03861681526060602082018190526000906124fc90830186886124a5565b828103604084015261250f8185876124a5565b98975050505050505050565b60006020828403121561252d57600080fd5b81516120128161218b565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b858110156125b857813561259d81611fe0565b6001600160a01b03168752958201959082019060010161258a565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906125f6908301888a61257a565b82810360808401526126098187896124a5565b905082810360a084015261261e8185876124a5565b9c9b505050505050505050505050565b60005b83811015612649578181015183820152602001612631565b50506000910152565b6000815180845261266a81602086016020860161262e565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906126a290830184612652565b949350505050565b6060815260006126be60608301888a61257a565b82810360208401526126d18187896124a5565b905082810360408401526126e68185876124a5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006120126020830184612652565b600080600080600060a0868803121561273f57600080fd5b853561274a81611fe0565b9450602086013561275a81611fe0565b9350604086013561276a81611fe0565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612802576128026127c4565b604052919050565b60006001600160401b03821115612823576128236127c4565b5060051b60200190565b600082601f83011261283e57600080fd5b8135602061285361284e8361280a565b6127da565b82815260059290921b8401810191818101908684111561287257600080fd5b8286015b8481101561288d5780358352918301918301612876565b509695505050505050565b60008060008060008060c087890312156128b157600080fd5b863595506020808801356128c481611fe0565b955060408801356128d481611fe0565b945060608801356001600160401b03808211156128f057600080fd5b818a0191508a601f83011261290457600080fd5b813561291261284e8261280a565b81815260059190911b8301840190848101908d83111561293157600080fd5b938501935b8285101561295857843561294981611fe0565b82529385019390850190612936565b9750505060808a013592508083111561297057600080fd5b61297c8b848c0161282d565b945060a08a013592508083111561299257600080fd5b50506129a089828a0161282d565b9150509295509295509295565b600081518084526020808501945080840160005b838110156125b8578151875295820195908201906001016129c1565b606080825284519082018190526000906020906080840190828801845b82811015612a1f5781516001600160a01b0316845292840192908401906001016129fa565b50505083810382850152612a3381876129ad565b9150508281036040840152612a4881856129ad565b9695505050505050565b600080600060608486031215612a6757600080fd5b83359250602080850135612a7a81611fe0565b925060408501356001600160401b0380821115612a9657600080fd5b818701915087601f830112612aaa57600080fd5b813581811115612abc57612abc6127c4565b612ace601f8201601f191685016127da565b91508082528884828501011115612ae457600080fd5b80848401858401376000848284010152508093505050509250925092565b60008251612b1481846020870161262e565b9190910192915050565b600060208284031215612b3057600080fd5b505191905056fea26469706673582212201c0bd6f5fcdfe08c70b8df7e77905aeb88a61268b0b41fb26f79c4fe107b8b8764736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611ff5565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004612064565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004612110565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004612145565b610525565b61026661033f366004612199565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004612199565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da3660046121b6565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b61026661040736600461224c565b6106f6565b61026661041a366004611ff5565b610c26565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b6102666104543660046122d4565b610c97565b610461610d90565b61046b6000610dea565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610dea565b50565b6104f4610e03565b61050387878787878787610e0b565b50505050505050565b610514610e03565b6105208333848461118b565b505050565b61052d610e03565b6105398484848461118b565b50505050565b610547610d90565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610d90565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b610681888888886114a1565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610dea565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61072e604051806040016040528060178152602001764368696c6445524331313535507265646963617465203160481b815250611597565b60fd546001600160a01b0316331461079b5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b6107d36040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901960491b815250611597565b60fe546001600160a01b038481169116146108435760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b61087b604051806040016040528060178152602001764368696c6445524331313535507265646963617465203360481b815250611597565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216108aa6020600084866123a2565b6108b3916123cc565b036109b2576108f06040518060400160405280601781526020017610da1a5b19115490cc4c4d4d541c99591a58d85d19480d604a1b815250611597565b610928604051806040016040528060178152602001764368696c6445524331313535507265646963617465203560481b815250611597565b61093d61093882602081866123a2565b6115da565b6109756040518060400160405280601781526020017621b434b63222a92198989a9aa83932b234b1b0ba32901b60491b815250611597565b6109ad604051806040016040528060178152602001764368696c6445524331313535507265646963617465203760481b815250611597565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186109e16020600084866123a2565b6109ea916123cc565b03610adb57610a2760405180604001604052806017815260200176086d0d2d8c88aa48662626a6aa0e4cac8d2c6c2e8ca407604b1b815250611597565b610a5f604051806040016040528060178152602001764368696c6445524331313535507265646963617465203960481b815250611597565b610a698282611846565b610aa26040518060400160405280601881526020017704368696c64455243313135355072656469636174652031360441b815250611597565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313160401b815250611597565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad610b0a6020600084866123a2565b610b13916123cc565b03610b9457610b516040518060400160405280601881526020017721b434b63222a92198989a9aa83932b234b1b0ba3290189960411b815250611597565b610b5b8282611ab4565b6109ad604051806040016040528060188152602001774368696c644552433131353550726564696361746520313360401b815250611597565b610bcd6040518060400160405280601881526020017710da1a5b19115490cc4c4d4d541c99591a58d85d19480c4d60421b815250611597565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610c2e610d90565b606580546001600160a01b0383166001600160a01b03199091168117909155610c5f6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b0314610cbe5760405163973d02cb60e01b81526004016104d790612330565b600054610100900460ff1615808015610cde5750600054600160ff909116105b80610cf85750303b158015610cf8575060005460ff166001145b610d145760405162461bcd60e51b81526004016104d790612354565b6000805460ff191660011790558015610d37576000805461ff0019166101001790555b610d43858585856114a1565b8015610d89576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e981611c1e565b61046b611c70565b86610e1581611e8a565b610e315760405162461bcd60e51b81526004016104d7906123ea565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e95919061242d565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610ed55760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b038116610eeb57610eeb61248f565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f57919061242d565b6001600160a01b031614610f6d57610f6d61248f565b8685148015610f7b57508483145b610fd55760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906110099033908a908a908a908a906004016124d7565b6020604051808303816000875af1158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c919061251b565b6110685760405162461bcd60e51b81526004016104d790612538565b60fc5460fe546040516001600160a01b03928316926316f198319216906110c3907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f906020016125c3565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016110ef92919061267e565b600060405180830381600087803b15801561110957600080fd5b505af115801561111d573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051611178969594939291906126aa565b60405180910390a4505050505050505050565b8361119581611e8a565b6111b15760405162461bcd60e51b81526004016104d7906123ea565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611215919061242d565b6001600160a01b03818116600090815261010060205260409020549192508781169116146112555760405162461bcd60e51b81526004016104d79061244a565b6001600160a01b03811661126b5761126b61248f565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d7919061242d565b6001600160a01b0316146112ed576112ed61248f565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061131d903390889088906004016126f3565b6020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611360919061251b565b61137c5760405162461bcd60e51b81526004016104d790612538565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f198319361140e9391169160e40161267e565b600060405180830381600087803b15801561142857600080fd5b505af115801561143c573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051611491939291906126f3565b60405180910390a4505050505050565b6001600160a01b038416158015906114c157506001600160a01b03831615155b80156114d557506001600160a01b03821615155b80156114e957506001600160a01b03811615155b6115475760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6104e9816040516024016115ab9190612714565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b179052611f1f565b6000808080806115ec86880188612727565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806116325760405162461bcd60e51b81526004016104d79061244a565b61163b81611e8a565b6116475761164761248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015611687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ab919061242d565b9050866001600160a01b0316816001600160a01b0316146116ce576116ce61248f565b6001600160a01b0381166116e4576116e461248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611750919061242d565b6001600160a01b0316146117665761176661248f565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690611796908890889088906004016126f3565b6020604051808303816000875af11580156117b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d9919061251b565b6117f55760405162461bcd60e51b81526004016104d790612782565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051611178939291906126f3565b60008080808061185886880188612898565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806118a05760405162461bcd60e51b81526004016104d79061244a565b6118a981611e8a565b6118b5576118b561248f565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611919919061242d565b9050866001600160a01b0316816001600160a01b03161461193c5761193c61248f565b6001600160a01b0381166119525761195261248f565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119be919061242d565b6001600160a01b0316146119d4576119d461248f565b604051635712868360e01b81526001600160a01b03831690635712868390611a04908890889088906004016129dd565b6020604051808303816000875af1158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a47919061251b565b611a635760405162461bcd60e51b81526004016104d790612782565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051611178939291906129dd565b600080611ac383850185612a52565b9093509150506001600160a01b038216611adf57611adf61248f565b6001600160a01b03828116600090815261010060205260409020541615611b0857611b0861248f565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611b58916001600160a01b039091169060340160405160208183030381529060405280519060200120611f28565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e90611bad908690869060040161267e565b600060405180830381600087803b158015611bc757600080fd5b505af1158015611bdb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611d7b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b019161138891611cd29190612b02565b6000604051808303818686fa925050503d8060008114611d0e576040519150601f19603f3d011682016040523d82523d6000602084013e611d13565b606091505b5091509150818015611d385750600081806020019051810190611d369190612b1e565b115b611d785760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611de29190612b02565b6000604051808303818686fa925050503d8060008114611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b5091509150818015611e49575080806020019051810190611e449190612b1e565b600114155b611e865760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611ea657506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611f0d575060408051601f3d908101601f19168201909252611f0a9181019061251b565b60015b611f1957506000919050565b92915050565b6104e981611fbf565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611f195760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6001600160a01b03811681146104e957600080fd5b60006020828403121561200757600080fd5b813561201281611fe0565b9392505050565b60008083601f84011261202b57600080fd5b5081356001600160401b0381111561204257600080fd5b6020830191508360208260051b850101111561205d57600080fd5b9250929050565b60008060008060008060006080888a03121561207f57600080fd5b873561208a81611fe0565b965060208801356001600160401b03808211156120a657600080fd5b6120b28b838c01612019565b909850965060408a01359150808211156120cb57600080fd5b6120d78b838c01612019565b909650945060608a01359150808211156120f057600080fd5b506120fd8a828b01612019565b989b979a50959850939692959293505050565b60008060006060848603121561212557600080fd5b833561213081611fe0565b95602085013595506040909401359392505050565b6000806000806080858703121561215b57600080fd5b843561216681611fe0565b9350602085013561217681611fe0565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b6000602082840312156121ab57600080fd5b81356120128161218b565b600080600080600080600060e0888a0312156121d157600080fd5b87356121dc81611fe0565b965060208801356121ec81611fe0565b955060408801356121fc81611fe0565b9450606088013561220c81611fe0565b9350608088013561221c8161218b565b925060a088013561222c8161218b565b915060c088013561223c81611fe0565b8091505092959891949750929550565b6000806000806060858703121561226257600080fd5b84359350602085013561227481611fe0565b925060408501356001600160401b038082111561229057600080fd5b818701915087601f8301126122a457600080fd5b8135818111156122b357600080fd5b8860208285010111156122c557600080fd5b95989497505060200194505050565b600080600080608085870312156122ea57600080fd5b84356122f581611fe0565b9350602085013561230581611fe0565b9250604085013561231581611fe0565b9150606085013561232581611fe0565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600080858511156123b257600080fd5b838611156123bf57600080fd5b5050820193919092039150565b80356020831015611f1957600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561243f57600080fd5b815161201281611fe0565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156124be57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03861681526060602082018190526000906124fc90830186886124a5565b828103604084015261250f8185876124a5565b98975050505050505050565b60006020828403121561252d57600080fd5b81516120128161218b565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b858110156125b857813561259d81611fe0565b6001600160a01b03168752958201959082019060010161258a565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906125f6908301888a61257a565b82810360808401526126098187896124a5565b905082810360a084015261261e8185876124a5565b9c9b505050505050505050505050565b60005b83811015612649578181015183820152602001612631565b50506000910152565b6000815180845261266a81602086016020860161262e565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906126a290830184612652565b949350505050565b6060815260006126be60608301888a61257a565b82810360208401526126d18187896124a5565b905082810360408401526126e68185876124a5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020815260006120126020830184612652565b600080600080600060a0868803121561273f57600080fd5b853561274a81611fe0565b9450602086013561275a81611fe0565b9350604086013561276a81611fe0565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612802576128026127c4565b604052919050565b60006001600160401b03821115612823576128236127c4565b5060051b60200190565b600082601f83011261283e57600080fd5b8135602061285361284e8361280a565b6127da565b82815260059290921b8401810191818101908684111561287257600080fd5b8286015b8481101561288d5780358352918301918301612876565b509695505050505050565b60008060008060008060c087890312156128b157600080fd5b863595506020808801356128c481611fe0565b955060408801356128d481611fe0565b945060608801356001600160401b03808211156128f057600080fd5b818a0191508a601f83011261290457600080fd5b813561291261284e8261280a565b81815260059190911b8301840190848101908d83111561293157600080fd5b938501935b8285101561295857843561294981611fe0565b82529385019390850190612936565b9750505060808a013592508083111561297057600080fd5b61297c8b848c0161282d565b945060a08a013592508083111561299257600080fd5b50506129a089828a0161282d565b9150509295509295509295565b600081518084526020808501945080840160005b838110156125b8578151875295820195908201906001016129c1565b606080825284519082018190526000906020906080840190828801845b82811015612a1f5781516001600160a01b0316845292840192908401906001016129fa565b50505083810382850152612a3381876129ad565b9150508281036040840152612a4881856129ad565b9695505050505050565b600080600060608486031215612a6757600080fd5b83359250602080850135612a7a81611fe0565b925060408501356001600160401b0380821115612a9657600080fd5b818701915087601f830112612aaa57600080fd5b813581811115612abc57612abc6127c4565b612ace601f8201601f191685016127da565b91508082528884828501011115612ae457600080fd5b80848401858401376000848284010152508093505050509250925092565b60008251612b1481846020870161262e565b9190910192915050565b600060208284031215612b3057600080fd5b505191905056fea26469706673582212201c0bd6f5fcdfe08c70b8df7e77905aeb88a61268b0b41fb26f79c4fe107b8b8764736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC1155PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155Predicate","sourceName":"contracts/child/ChildERC1155Predicate.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612040806100206000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b610170610214366004611648565b6037602052600090815260409020546001600160a01b031681565b61024261023d3660046116b7565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611763565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611798565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b6102426103433660046117de565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611866565b6105dd565b6103918787878787878761073a565b50505050505050565b6103a683338484610ab9565b505050565b6103b784848484610ab9565b50505050565b6034546001600160a01b0316331461042f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461049f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b6064820152608401610426565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104ce6020600084866118c2565b6104d7916118ec565b036104f6576104f16104ec82602081866118c2565b610dce565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186105256020600084866118c2565b61052e916118ec565b0361053d576104f18282611039565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61056c6020600084866118c2565b610575916118ec565b03610584576104f182826112a6565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b6064820152608401610426565b336002600160a01b03146106215760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610426565b600054610100900460ff16158080156106415750600054600160ff909116105b8061065b5750303b15801561065b575060005460ff166001145b6106be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610426565b6000805460ff1916600117905580156106e1576000805461ff0019166101001790555b6106ed8585858561140e565b8015610733576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b8661074481611504565b6107605760405162461bcd60e51b81526004016104269061190a565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c4919061194d565b6001600160a01b038181166000908152603760205260409020549192508a81169116146108035760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610819576108196119af565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610885919061194d565b6001600160a01b03161461089b5761089b6119af565b86851480156108a957508483145b6109035760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b6064820152608401610426565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906109379033908a908a908a908a906004016119f7565b6020604051808303816000875af1158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190611a3b565b6109965760405162461bcd60e51b815260040161042690611a5d565b6033546035546040516001600160a01b03928316926316f198319216906109f1907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611ae8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a1d929190611b99565b600060405180830381600087803b158015610a3757600080fd5b505af1158015610a4b573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610aa696959493929190611bc5565b60405180910390a4505050505050505050565b83610ac381611504565b610adf5760405162461bcd60e51b81526004016104269061190a565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b43919061194d565b6001600160a01b03818116600090815260376020526040902054919250878116911614610b825760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610b9857610b986119af565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c04919061194d565b6001600160a01b031614610c1a57610c1a6119af565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610c4a90339088908890600401611c0e565b6020604051808303816000875af1158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190611a3b565b610ca95760405162461bcd60e51b815260040161042690611a5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f1983193610d3b9391169160e401611b99565b600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051610dbe93929190611c0e565b60405180910390a4505050505050565b600080808080610de086880188611c2f565b6001600160a01b03808616600090815260376020526040902054959a50939850919650945092501680610e255760405162461bcd60e51b81526004016104269061196a565b610e2e81611504565b610e3a57610e3a6119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e919061194d565b9050866001600160a01b0316816001600160a01b031614610ec157610ec16119af565b6001600160a01b038116610ed757610ed76119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f43919061194d565b6001600160a01b031614610f5957610f596119af565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690610f8990889088908890600401611c0e565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc9190611a3b565b610fe85760405162461bcd60e51b815260040161042690611c8a565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610aa693929190611c0e565b60008080808061104b86880188611da0565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806110925760405162461bcd60e51b81526004016104269061196a565b61109b81611504565b6110a7576110a76119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b919061194d565b9050866001600160a01b0316816001600160a01b03161461112e5761112e6119af565b6001600160a01b038116611144576111446119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b0919061194d565b6001600160a01b0316146111c6576111c66119af565b604051635712868360e01b81526001600160a01b038316906357128683906111f690889088908890600401611ee5565b6020604051808303816000875af1158015611215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112399190611a3b565b6112555760405162461bcd60e51b815260040161042690611c8a565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610aa693929190611ee5565b6000806112b583850185611f5a565b9093509150506001600160a01b0382166112d1576112d16119af565b6001600160a01b0382811660009081526037602052604090205416156112f9576112f96119af565b6036546040516bffffffffffffffffffffffff19606085901b166020820152600091611349916001600160a01b039091169060340160405160208183030381529060405280519060200120611599565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061139d9086908690600401611b99565b600060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061142e57506001600160a01b03831615155b801561144257506001600160a01b03821615155b801561145657506001600160a01b03811615155b6114b45760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b6064820152608401610426565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361152057506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611587575060408051601f3d908101601f1916820190925261158491810190611a3b565b60015b61159357506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115935760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610426565b6001600160a01b038116811461164557600080fd5b50565b60006020828403121561165a57600080fd5b813561166581611630565b9392505050565b60008083601f84011261167e57600080fd5b5081356001600160401b0381111561169557600080fd5b6020830191508360208260051b85010111156116b057600080fd5b9250929050565b60008060008060008060006080888a0312156116d257600080fd5b87356116dd81611630565b965060208801356001600160401b03808211156116f957600080fd5b6117058b838c0161166c565b909850965060408a013591508082111561171e57600080fd5b61172a8b838c0161166c565b909650945060608a013591508082111561174357600080fd5b506117508a828b0161166c565b989b979a50959850939692959293505050565b60008060006060848603121561177857600080fd5b833561178381611630565b95602085013595506040909401359392505050565b600080600080608085870312156117ae57600080fd5b84356117b981611630565b935060208501356117c981611630565b93969395505050506040820135916060013590565b600080600080606085870312156117f457600080fd5b84359350602085013561180681611630565b925060408501356001600160401b038082111561182257600080fd5b818701915087601f83011261183657600080fd5b81358181111561184557600080fd5b88602082850101111561185757600080fd5b95989497505060200194505050565b6000806000806080858703121561187c57600080fd5b843561188781611630565b9350602085013561189781611630565b925060408501356118a781611630565b915060608501356118b781611630565b939692955090935050565b600080858511156118d257600080fd5b838611156118df57600080fd5b5050820193919092039150565b8035602083101561159357600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561195f57600080fd5b815161166581611630565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156119de57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611a1c90830186886119c5565b8281036040840152611a2f8185876119c5565b98975050505050505050565b600060208284031215611a4d57600080fd5b8151801515811461166557600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611add578135611ac281611630565b6001600160a01b031687529582019590820190600101611aaf565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611b1b908301888a611a9f565b8281036080840152611b2e8187896119c5565b905082810360a0840152611b438185876119c5565b9c9b505050505050505050505050565b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611bbd90830184611b53565b949350505050565b606081526000611bd960608301888a611a9f565b8281036020840152611bec8187896119c5565b90508281036040840152611c018185876119c5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a08688031215611c4757600080fd5b8535611c5281611630565b94506020860135611c6281611630565b93506040860135611c7281611630565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611d0a57611d0a611ccc565b604052919050565b60006001600160401b03821115611d2b57611d2b611ccc565b5060051b60200190565b600082601f830112611d4657600080fd5b81356020611d5b611d5683611d12565b611ce2565b82815260059290921b84018101918181019086841115611d7a57600080fd5b8286015b84811015611d955780358352918301918301611d7e565b509695505050505050565b60008060008060008060c08789031215611db957600080fd5b86359550602080880135611dcc81611630565b95506040880135611ddc81611630565b945060608801356001600160401b0380821115611df857600080fd5b818a0191508a601f830112611e0c57600080fd5b8135611e1a611d5682611d12565b81815260059190911b8301840190848101908d831115611e3957600080fd5b938501935b82851015611e60578435611e5181611630565b82529385019390850190611e3e565b9750505060808a0135925080831115611e7857600080fd5b611e848b848c01611d35565b945060a08a0135925080831115611e9a57600080fd5b5050611ea889828a01611d35565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611add57815187529582019590820190600101611ec9565b606080825284519082018190526000906020906080840190828801845b82811015611f275781516001600160a01b031684529284019290840190600101611f02565b50505083810382850152611f3b8187611eb5565b9150508281036040840152611f508185611eb5565b9695505050505050565b600080600060608486031215611f6f57600080fd5b83359250602080850135611f8281611630565b925060408501356001600160401b0380821115611f9e57600080fd5b818701915087601f830112611fb257600080fd5b813581811115611fc457611fc4611ccc565b611fd6601f8201601f19168501611ce2565b91508082528884828501011115611fec57600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220144e7d3687aae30c76d4672a727fea0faa7f80324ee0ce29478a172a7808516964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c806397e5230d116100c3578063d41f17711161007c578063d41f1771146102de578063d7c9e3ec14610305578063e0563ab11461032c578063eeb4994514610335578063f645125514610348578063f8c8765e1461036f57600080fd5b806397e5230d1461024d578063b176806514610257578063b5c5f6721461027e578063b68ad1e414610291578063b8cd3ec0146102a4578063c5ac2b1c146102b757600080fd5b806351351d531161011557806351351d53146101d357806355b01e4d146101e15780635ea5df79146101ef5780637efab4f51461020657806386937eb41461022f578063947287cf1461024457600080fd5b8063051eb2e21461015d57806305dc2e8f1461018d57806307b3e252146101a05780631bc114ba146101ae578063284017f5146101c15780633b878c22146101ca575b600080fd5b603554610170906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b603454610170906001600160a01b031681565b6101706004600360981b0181565b603354610170906001600160a01b031681565b61017061202081565b61017061101081565b6101706002600160a01b0381565b6101706004600160991b0181565b6101f861138881565b604051908152602001610184565b610170610214366004611648565b6037602052600090815260409020546001600160a01b031681565b61024261023d3660046116b7565b610382565b005b6101f861520881565b6101f8620249f081565b6101f87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b61024261028c366004611763565b61039a565b603654610170906001600160a01b031681565b6102426102b2366004611798565b6103ab565b6101f87faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6101f87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6101f87f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61017061203081565b6102426103433660046117de565b6103bd565b6101f87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61024261037d366004611866565b6105dd565b6103918787878787878761073a565b50505050505050565b6103a683338484610ab9565b505050565b6103b784848484610ab9565b50505050565b6034546001600160a01b0316331461042f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084015b60405180910390fd5b6035546001600160a01b0384811691161461049f5760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b6064820152608401610426565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216104ce6020600084866118c2565b6104d7916118ec565b036104f6576104f16104ec82602081866118c2565b610dce565b6103b7565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d186105256020600084866118c2565b61052e916118ec565b0361053d576104f18282611039565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad61056c6020600084866118c2565b610575916118ec565b03610584576104f182826112a6565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b6064820152608401610426565b336002600160a01b03146106215760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610426565b600054610100900460ff16158080156106415750600054600160ff909116105b8061065b5750303b15801561065b575060005460ff166001145b6106be5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610426565b6000805460ff1916600117905580156106e1576000805461ff0019166101001790555b6106ed8585858561140e565b8015610733576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b8661074481611504565b6107605760405162461bcd60e51b81526004016104269061190a565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c4919061194d565b6001600160a01b038181166000908152603760205260409020549192508a81169116146108035760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610819576108196119af565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610885919061194d565b6001600160a01b03161461089b5761089b6119af565b86851480156108a957508483145b6109035760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b6064820152608401610426565b604051631ac8311560e21b81526001600160a01b038a1690636b20c454906109379033908a908a908a908a906004016119f7565b6020604051808303816000875af1158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190611a3b565b6109965760405162461bcd60e51b815260040161042690611a5d565b6033546035546040516001600160a01b03928316926316f198319216906109f1907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001611ae8565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610a1d929190611b99565b600060405180830381600087803b158015610a3757600080fd5b505af1158015610a4b573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610aa696959493929190611bc5565b60405180910390a4505050505050505050565b83610ac381611504565b610adf5760405162461bcd60e51b81526004016104269061190a565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b43919061194d565b6001600160a01b03818116600090815260376020526040902054919250878116911614610b825760405162461bcd60e51b81526004016104269061196a565b6001600160a01b038116610b9857610b986119af565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c04919061194d565b6001600160a01b031614610c1a57610c1a6119af565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca90610c4a90339088908890600401611c0e565b6020604051808303816000875af1158015610c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8d9190611a3b565b610ca95760405162461bcd60e51b815260040161042690611a5d565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f1983193610d3b9391169160e401611b99565b600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec2338888604051610dbe93929190611c0e565b60405180910390a4505050505050565b600080808080610de086880188611c2f565b6001600160a01b03808616600090815260376020526040902054959a50939850919650945092501680610e255760405162461bcd60e51b81526004016104269061196a565b610e2e81611504565b610e3a57610e3a6119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e919061194d565b9050866001600160a01b0316816001600160a01b031614610ec157610ec16119af565b6001600160a01b038116610ed757610ed76119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f43919061194d565b6001600160a01b031614610f5957610f596119af565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f690610f8990889088908890600401611c0e565b6020604051808303816000875af1158015610fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcc9190611a3b565b610fe85760405162461bcd60e51b815260040161042690611c8a565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610aa693929190611c0e565b60008080808061104b86880188611da0565b6001600160a01b03808616600090815260376020526040902054959b5093995091975095509350169050806110925760405162461bcd60e51b81526004016104269061196a565b61109b81611504565b6110a7576110a76119af565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110b919061194d565b9050866001600160a01b0316816001600160a01b03161461112e5761112e6119af565b6001600160a01b038116611144576111446119af565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b0919061194d565b6001600160a01b0316146111c6576111c66119af565b604051635712868360e01b81526001600160a01b038316906357128683906111f690889088908890600401611ee5565b6020604051808303816000875af1158015611215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112399190611a3b565b6112555760405162461bcd60e51b815260040161042690611c8a565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610aa693929190611ee5565b6000806112b583850185611f5a565b9093509150506001600160a01b0382166112d1576112d16119af565b6001600160a01b0382811660009081526037602052604090205416156112f9576112f96119af565b6036546040516bffffffffffffffffffffffff19606085901b166020820152600091611349916001600160a01b039091169060340160405160208183030381529060405280519060200120611599565b6001600160a01b038481166000908152603760205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061139d9086908690600401611b99565b600060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b6001600160a01b0384161580159061142e57506001600160a01b03831615155b801561144257506001600160a01b03821615155b801561145657506001600160a01b03811615155b6114b45760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b6064820152608401610426565b603380546001600160a01b039586166001600160a01b0319918216179091556034805494861694821694909417909355603580549285169284169290921790915560368054919093169116179055565b6000816001600160a01b03163b60000361152057506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611587575060408051601f3d908101601f1916820190925261158491810190611a3b565b60015b61159357506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166115935760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610426565b6001600160a01b038116811461164557600080fd5b50565b60006020828403121561165a57600080fd5b813561166581611630565b9392505050565b60008083601f84011261167e57600080fd5b5081356001600160401b0381111561169557600080fd5b6020830191508360208260051b85010111156116b057600080fd5b9250929050565b60008060008060008060006080888a0312156116d257600080fd5b87356116dd81611630565b965060208801356001600160401b03808211156116f957600080fd5b6117058b838c0161166c565b909850965060408a013591508082111561171e57600080fd5b61172a8b838c0161166c565b909650945060608a013591508082111561174357600080fd5b506117508a828b0161166c565b989b979a50959850939692959293505050565b60008060006060848603121561177857600080fd5b833561178381611630565b95602085013595506040909401359392505050565b600080600080608085870312156117ae57600080fd5b84356117b981611630565b935060208501356117c981611630565b93969395505050506040820135916060013590565b600080600080606085870312156117f457600080fd5b84359350602085013561180681611630565b925060408501356001600160401b038082111561182257600080fd5b818701915087601f83011261183657600080fd5b81358181111561184557600080fd5b88602082850101111561185757600080fd5b95989497505060200194505050565b6000806000806080858703121561187c57600080fd5b843561188781611630565b9350602085013561189781611630565b925060408501356118a781611630565b915060608501356118b781611630565b939692955090935050565b600080858511156118d257600080fd5b838611156118df57600080fd5b5050820193919092039150565b8035602083101561159357600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b60006020828403121561195f57600080fd5b815161166581611630565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b038311156119de57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b0386168152606060208201819052600090611a1c90830186886119c5565b8281036040840152611a2f8185876119c5565b98975050505050505050565b600060208284031215611a4d57600080fd5b8151801515811461166557600080fd5b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b85811015611add578135611ac281611630565b6001600160a01b031687529582019590820190600101611aaf565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090611b1b908301888a611a9f565b8281036080840152611b2e8187896119c5565b905082810360a0840152611b438185876119c5565b9c9b505050505050505050505050565b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611bbd90830184611b53565b949350505050565b606081526000611bd960608301888a611a9f565b8281036020840152611bec8187896119c5565b90508281036040840152611c018185876119c5565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a08688031215611c4757600080fd5b8535611c5281611630565b94506020860135611c6281611630565b93506040860135611c7281611630565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611d0a57611d0a611ccc565b604052919050565b60006001600160401b03821115611d2b57611d2b611ccc565b5060051b60200190565b600082601f830112611d4657600080fd5b81356020611d5b611d5683611d12565b611ce2565b82815260059290921b84018101918181019086841115611d7a57600080fd5b8286015b84811015611d955780358352918301918301611d7e565b509695505050505050565b60008060008060008060c08789031215611db957600080fd5b86359550602080880135611dcc81611630565b95506040880135611ddc81611630565b945060608801356001600160401b0380821115611df857600080fd5b818a0191508a601f830112611e0c57600080fd5b8135611e1a611d5682611d12565b81815260059190911b8301840190848101908d831115611e3957600080fd5b938501935b82851015611e60578435611e5181611630565b82529385019390850190611e3e565b9750505060808a0135925080831115611e7857600080fd5b611e848b848c01611d35565b945060a08a0135925080831115611e9a57600080fd5b5050611ea889828a01611d35565b9150509295509295509295565b600081518084526020808501945080840160005b83811015611add57815187529582019590820190600101611ec9565b606080825284519082018190526000906020906080840190828801845b82811015611f275781516001600160a01b031684529284019290840190600101611f02565b50505083810382850152611f3b8187611eb5565b9150508281036040840152611f508185611eb5565b9695505050505050565b600080600060608486031215611f6f57600080fd5b83359250602080850135611f8281611630565b925060408501356001600160401b0380821115611f9e57600080fd5b818701915087601f830112611fb257600080fd5b813581811115611fc457611fc4611ccc565b611fd6601f8201601f19168501611ce2565b91508082528884828501011115611fec57600080fd5b8084840185840137600084828401015250809350505050925092509256fea2646970667358221220144e7d3687aae30c76d4672a727fea0faa7f80324ee0ce29478a172a7808516964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` +var ChildERC1155PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"ChildERC1155PredicateAccessList","sourceName":"contracts/child/ChildERC1155PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2ERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2ERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2TokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newRootERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChildERC1155","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b506127d8806100206000396000f3fe608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611c73565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004611ce2565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004611d8e565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004611dc3565b610525565b61026661033f366004611e17565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004611e17565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da366004611e34565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b610266610407366004611eca565b6106f6565b61026661041a366004611c73565b610911565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b610266610454366004611f52565b610982565b610461610a7b565b61046b6000610ad5565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610ad5565b50565b6104f4610aee565b61050387878787878787610af6565b50505050505050565b610514610aee565b61052083338484610e76565b505050565b61052d610aee565b61053984848484610e76565b50505050565b610547610a7b565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610a7b565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b6106818888888861118c565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610ad5565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107635760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b60fe546001600160a01b038481169116146107d35760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610802602060008486612020565b61080b9161204a565b0361082a576108256108208260208186612020565b611282565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610859602060008486612020565b6108629161204a565b036108715761082582826114ee565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108a0602060008486612020565b6108a99161204a565b036108b857610825828261175c565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610919610a7b565b606580546001600160a01b0383166001600160a01b0319909116811790915561094a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b03146109a95760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff16158080156109c95750600054600160ff909116105b806109e35750303b1580156109e3575060005460ff166001145b6109ff5760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610a22576000805461ff0019166101001790555b610a2e8585858561118c565b8015610a74576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e9816118c6565b61046b611918565b86610b0081611b32565b610b1c5760405162461bcd60e51b81526004016104d790612068565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906120ab565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610bc05760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610bd657610bd661210d565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906120ab565b6001600160a01b031614610c5857610c5861210d565b8685148015610c6657508483145b610cc05760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610cf49033908a908a908a908a90600401612155565b6020604051808303816000875af1158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d379190612199565b610d535760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe546040516001600160a01b03928316926316f19831921690610dae907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001612241565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610dda9291906122fc565b600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610e6396959493929190612328565b60405180910390a4505050505050505050565b83610e8081611b32565b610e9c5760405162461bcd60e51b81526004016104d790612068565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0091906120ab565b6001600160a01b0381811660009081526101006020526040902054919250878116911614610f405760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610f5657610f5661210d565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc291906120ab565b6001600160a01b031614610fd857610fd861210d565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061100890339088908890600401612371565b6020604051808303816000875af1158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190612199565b6110675760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110f99391169160e4016122fc565b600060405180830381600087803b15801561111357600080fd5b505af1158015611127573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec233888860405161117c93929190612371565b60405180910390a4505050505050565b6001600160a01b038416158015906111ac57506001600160a01b03831615155b80156111c057506001600160a01b03821615155b80156111d457506001600160a01b03811615155b6112325760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b60008080808061129486880188612392565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806112da5760405162461bcd60e51b81526004016104d7906120c8565b6112e381611b32565b6112ef576112ef61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135391906120ab565b9050866001600160a01b0316816001600160a01b0316146113765761137661210d565b6001600160a01b03811661138c5761138c61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f891906120ab565b6001600160a01b03161461140e5761140e61210d565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f69061143e90889088908890600401612371565b6020604051808303816000875af115801561145d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114819190612199565b61149d5760405162461bcd60e51b81526004016104d7906123ed565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610e6393929190612371565b60008080808061150086880188612503565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806115485760405162461bcd60e51b81526004016104d7906120c8565b61155181611b32565b61155d5761155d61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906120ab565b9050866001600160a01b0316816001600160a01b0316146115e4576115e461210d565b6001600160a01b0381166115fa576115fa61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166691906120ab565b6001600160a01b03161461167c5761167c61210d565b604051635712868360e01b81526001600160a01b038316906357128683906116ac90889088908890600401612648565b6020604051808303816000875af11580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef9190612199565b61170b5760405162461bcd60e51b81526004016104d7906123ed565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610e6393929190612648565b60008061176b838501856126bd565b9093509150506001600160a01b0382166117875761178761210d565b6001600160a01b038281166000908152610100602052604090205416156117b0576117b061210d565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611800916001600160a01b039091169060340160405160208183030381529060405280519060200120611bc7565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061185590869086906004016122fc565b600060405180830381600087803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611a2357604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161197a919061276d565b6000604051808303818686fa925050503d80600081146119b6576040519150601f19603f3d011682016040523d82523d6000602084013e6119bb565b606091505b50915091508180156119e057506000818060200190518101906119de9190612789565b115b611a205760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a8a919061276d565b6000604051808303818686fa925050503d8060008114611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b5091509150818015611af1575080806020019051810190611aec9190612789565b600114155b611b2e5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611b4e57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611bb5575060408051601f3d908101601f19168201909252611bb291810190612199565b60015b611bc157506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611bc15760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b6001600160a01b03811681146104e957600080fd5b600060208284031215611c8557600080fd5b8135611c9081611c5e565b9392505050565b60008083601f840112611ca957600080fd5b5081356001600160401b03811115611cc057600080fd5b6020830191508360208260051b8501011115611cdb57600080fd5b9250929050565b60008060008060008060006080888a031215611cfd57600080fd5b8735611d0881611c5e565b965060208801356001600160401b0380821115611d2457600080fd5b611d308b838c01611c97565b909850965060408a0135915080821115611d4957600080fd5b611d558b838c01611c97565b909650945060608a0135915080821115611d6e57600080fd5b50611d7b8a828b01611c97565b989b979a50959850939692959293505050565b600080600060608486031215611da357600080fd5b8335611dae81611c5e565b95602085013595506040909401359392505050565b60008060008060808587031215611dd957600080fd5b8435611de481611c5e565b93506020850135611df481611c5e565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b600060208284031215611e2957600080fd5b8135611c9081611e09565b600080600080600080600060e0888a031215611e4f57600080fd5b8735611e5a81611c5e565b96506020880135611e6a81611c5e565b95506040880135611e7a81611c5e565b94506060880135611e8a81611c5e565b93506080880135611e9a81611e09565b925060a0880135611eaa81611e09565b915060c0880135611eba81611c5e565b8091505092959891949750929550565b60008060008060608587031215611ee057600080fd5b843593506020850135611ef281611c5e565b925060408501356001600160401b0380821115611f0e57600080fd5b818701915087601f830112611f2257600080fd5b813581811115611f3157600080fd5b886020828501011115611f4357600080fd5b95989497505060200194505050565b60008060008060808587031215611f6857600080fd5b8435611f7381611c5e565b93506020850135611f8381611c5e565b92506040850135611f9381611c5e565b91506060850135611fa381611c5e565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561203057600080fd5b8386111561203d57600080fd5b5050820193919092039150565b80356020831015611bc157600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b6000602082840312156120bd57600080fd5b8151611c9081611c5e565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561213c57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038616815260606020820181905260009061217a9083018688612123565b828103604084015261218d818587612123565b98975050505050505050565b6000602082840312156121ab57600080fd5b8151611c9081611e09565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b8581101561223657813561221b81611c5e565b6001600160a01b031687529582019590820190600101612208565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612274908301888a6121f8565b8281036080840152612287818789612123565b905082810360a084015261229c818587612123565b9c9b505050505050505050505050565b60005b838110156122c75781810151838201526020016122af565b50506000910152565b600081518084526122e88160208601602086016122ac565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612320908301846122d0565b949350505050565b60608152600061233c60608301888a6121f8565b828103602084015261234f818789612123565b90508281036040840152612364818587612123565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a086880312156123aa57600080fd5b85356123b581611c5e565b945060208601356123c581611c5e565b935060408601356123d581611c5e565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561246d5761246d61242f565b604052919050565b60006001600160401b0382111561248e5761248e61242f565b5060051b60200190565b600082601f8301126124a957600080fd5b813560206124be6124b983612475565b612445565b82815260059290921b840181019181810190868411156124dd57600080fd5b8286015b848110156124f857803583529183019183016124e1565b509695505050505050565b60008060008060008060c0878903121561251c57600080fd5b8635955060208088013561252f81611c5e565b9550604088013561253f81611c5e565b945060608801356001600160401b038082111561255b57600080fd5b818a0191508a601f83011261256f57600080fd5b813561257d6124b982612475565b81815260059190911b8301840190848101908d83111561259c57600080fd5b938501935b828510156125c35784356125b481611c5e565b825293850193908501906125a1565b9750505060808a01359250808311156125db57600080fd5b6125e78b848c01612498565b945060a08a01359250808311156125fd57600080fd5b505061260b89828a01612498565b9150509295509295509295565b600081518084526020808501945080840160005b838110156122365781518752958201959082019060010161262c565b606080825284519082018190526000906020906080840190828801845b8281101561268a5781516001600160a01b031684529284019290840190600101612665565b5050508381038285015261269e8187612618565b91505082810360408401526126b38185612618565b9695505050505050565b6000806000606084860312156126d257600080fd5b833592506020808501356126e581611c5e565b925060408501356001600160401b038082111561270157600080fd5b818701915087601f83011261271557600080fd5b8135818111156127275761272761242f565b612739601f8201601f19168501612445565b9150808252888482850101111561274f57600080fd5b80848401858401376000848284010152508093505050509250925092565b6000825161277f8184602087016122ac565b9190910192915050565b60006020828403121561279b57600080fd5b505191905056fea26469706673582212205d35ced486c2210da22d8254dca762acf5687ec4e599a9e2dbab26a8777a105964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101b05760003560e01c8063b1768065116100ef578063d7c9e3ec11610092578063d7c9e3ec146103a5578063d8dd1773146103cc578063e0563ab1146103df578063e30c3978146103e8578063eeb49945146103f9578063f2fde38b1461040c578063f64512551461041f578063f8c8765e1461044657600080fd5b8063b1768065146102d1578063b5c5f672146102f8578063b68ad1e41461030b578063b8cd3ec01461031e578063c1225a2014610331578063c5ac2b1c14610344578063c5e4683a1461036b578063d41f17711461037e57600080fd5b80635ea5df79116101575780635ea5df7914610247578063715018a61461025e57806379ba5097146102685780637efab4f51461027057806386937eb41461029a5780638da5cb5b146102ad578063947287cf146102be57806397e5230d146102c757600080fd5b8063051eb2e2146101b557806305dc2e8f146101e557806307b3e252146101f85780631bc114ba14610206578063284017f5146102195780633b878c221461022257806351351d531461022b57806355b01e4d14610239575b600080fd5b60fe546101c8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b60fd546101c8906001600160a01b031681565b6101c86004600360981b0181565b60fc546101c8906001600160a01b031681565b6101c861202081565b6101c861101081565b6101c86002600160a01b0381565b6101c86004600160991b0181565b61025061138881565b6040519081526020016101dc565b610266610459565b005b61026661046d565b6101c861027e366004611c73565b610100602052600090815260409020546001600160a01b031681565b6102666102a8366004611ce2565b6104ec565b6033546001600160a01b03166101c8565b61025061520881565b610250620249f081565b6102507f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b610266610306366004611d8e565b61050c565b60ff546101c8906001600160a01b031681565b61026661032c366004611dc3565b610525565b61026661033f366004611e17565b61053f565b6102507faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610266610379366004611e17565b61058e565b6102507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102507f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102666103da366004611e34565b6105d5565b6101c861203081565b6065546001600160a01b03166101c8565b610266610407366004611eca565b6106f6565b61026661041a366004611c73565b610911565b6102507f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b610266610454366004611f52565b610982565b610461610a7b565b61046b6000610ad5565b565b60655433906001600160a01b031681146104e05760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b6104e981610ad5565b50565b6104f4610aee565b61050387878787878787610af6565b50505050505050565b610514610aee565b61052083338484610e76565b505050565b61052d610aee565b61053984848484610e76565b50505050565b610547610a7b565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b610596610a7b565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b03146105fc5760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff161580801561061c5750600054600160ff909116105b806106365750303b158015610636575060005460ff166001145b6106525760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610675576000805461ff0019166101001790555b6106818888888861118c565b60c9805461ffff191685151561ff00191617610100851515021790556106a682610ad5565b80156106ec576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146107635760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f5354415460448201526922afa922a1a2a4ab22a960b11b60648201526084016104d7565b60fe546001600160a01b038481169116146107d35760405162461bcd60e51b815260206004820152602a60248201527f4368696c64455243313135355072656469636174653a204f4e4c595f524f4f546044820152695f50524544494341544560b01b60648201526084016104d7565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610802602060008486612020565b61080b9161204a565b0361082a576108256108208260208186612020565b611282565b610539565b7faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18610859602060008486612020565b6108629161204a565b036108715761082582826114ee565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6108a0602060008486612020565b6108a99161204a565b036108b857610825828261175c565b60405162461bcd60e51b815260206004820152602860248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f5360448201526749474e415455524560c01b60648201526084016104d7565b610919610a7b565b606580546001600160a01b0383166001600160a01b0319909116811790915561094a6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b336002600160a01b03146109a95760405163973d02cb60e01b81526004016104d790611fae565b600054610100900460ff16158080156109c95750600054600160ff909116105b806109e35750303b1580156109e3575060005460ff166001145b6109ff5760405162461bcd60e51b81526004016104d790611fd2565b6000805460ff191660011790558015610a22576000805461ff0019166101001790555b610a2e8585858561118c565b8015610a74576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6033546001600160a01b0316331461046b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d7565b606580546001600160a01b03191690556104e9816118c6565b61046b611918565b86610b0081611b32565b610b1c5760405162461bcd60e51b81526004016104d790612068565b6000886001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8091906120ab565b6001600160a01b03818116600090815261010060205260409020549192508a8116911614610bc05760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610bd657610bd661210d565b306001600160a01b0316896001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906120ab565b6001600160a01b031614610c5857610c5861210d565b8685148015610c6657508483145b610cc05760405162461bcd60e51b815260206004820152602560248201527f4368696c64455243313135355072656469636174653a20494e56414c49445f4c60448201526408a9c8ea8960db1b60648201526084016104d7565b604051631ac8311560e21b81526001600160a01b038a1690636b20c45490610cf49033908a908a908a908a90600401612155565b6020604051808303816000875af1158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d379190612199565b610d535760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe546040516001600160a01b03928316926316f19831921690610dae907f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed290869033908f908f908f908f908f908f90602001612241565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610dda9291906122fc565b600060405180830381600087803b158015610df457600080fd5b505af1158015610e08573d6000803e3d6000fd5b50505050336001600160a01b0316896001600160a01b0316826001600160a01b03167f7a10660242ca367951ff3777cdb3c2a761e3ccad204bac118501e24693f3683d8b8b8b8b8b8b604051610e6396959493929190612328565b60405180910390a4505050505050505050565b83610e8081611b32565b610e9c5760405162461bcd60e51b81526004016104d790612068565b6000856001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0091906120ab565b6001600160a01b0381811660009081526101006020526040902054919250878116911614610f405760405162461bcd60e51b81526004016104d7906120c8565b6001600160a01b038116610f5657610f5661210d565b306001600160a01b0316866001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc291906120ab565b6001600160a01b031614610fd857610fd861210d565b604051637a94c56560e11b81526001600160a01b0387169063f5298aca9061100890339088908890600401612371565b6020604051808303816000875af1158015611027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104b9190612199565b6110675760405162461bcd60e51b81526004016104d7906121b6565b60fc5460fe54604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152898116608083015260a0820189905260c08083018990528351808403909101815260e08301938490526316f1983160e01b909352938416936316f19831936110f99391169160e4016122fc565b600060405180830381600087803b15801561111357600080fd5b505af1158015611127573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b0316826001600160a01b03167f2ca9093e8b5356801039806c6a08003e5b7013fb8ae48f720fc90fc1c1a8bec233888860405161117c93929190612371565b60405180910390a4505050505050565b6001600160a01b038416158015906111ac57506001600160a01b03831615155b80156111c057506001600160a01b03821615155b80156111d457506001600160a01b03811615155b6112325760405162461bcd60e51b815260206004820152602960248201527f4368696c64455243313135355072656469636174653a204241445f494e49544960448201526820a624ad20aa24a7a760b91b60648201526084016104d7565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b60008080808061129486880188612392565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806112da5760405162461bcd60e51b81526004016104d7906120c8565b6112e381611b32565b6112ef576112ef61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135391906120ab565b9050866001600160a01b0316816001600160a01b0316146113765761137661210d565b6001600160a01b03811661138c5761138c61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f891906120ab565b6001600160a01b03161461140e5761140e61210d565b604051630ab714fb60e11b81526001600160a01b0383169063156e29f69061143e90889088908890600401612371565b6020604051808303816000875af115801561145d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114819190612199565b61149d5760405162461bcd60e51b81526004016104d7906123ed565b846001600160a01b0316826001600160a01b0316886001600160a01b03167f2930d932c1cccd6add2e0e2d706ede9015db8a194405f2a3e1783703515e104f898888604051610e6393929190612371565b60008080808061150086880188612503565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806115485760405162461bcd60e51b81526004016104d7906120c8565b61155181611b32565b61155d5761155d61210d565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561159d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c191906120ab565b9050866001600160a01b0316816001600160a01b0316146115e4576115e461210d565b6001600160a01b0381166115fa576115fa61210d565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166691906120ab565b6001600160a01b03161461167c5761167c61210d565b604051635712868360e01b81526001600160a01b038316906357128683906116ac90889088908890600401612648565b6020604051808303816000875af11580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef9190612199565b61170b5760405162461bcd60e51b81526004016104d7906123ed565b856001600160a01b0316826001600160a01b0316886001600160a01b03167f17304b99f8dfa5a2b8dd5695d82f9947c2abfbc9cb64bab610b9a1a0feadb9a0888888604051610e6393929190612648565b60008061176b838501856126bd565b9093509150506001600160a01b0382166117875761178761210d565b6001600160a01b038281166000908152610100602052604090205416156117b0576117b061210d565b60ff546040516bffffffffffffffffffffffff19606085901b166020820152600091611800916001600160a01b039091169060340160405160208183030381529060405280519060200120611bc7565b6001600160a01b03848116600090815261010060205260409081902080546001600160a01b0319169284169283179055516379ccf11760e11b81529192509063f399e22e9061185590869086906004016122fc565b600060405180830381600087803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b50506040516001600160a01b038085169350861691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a35050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff1615611a2357604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161197a919061276d565b6000604051808303818686fa925050503d80600081146119b6576040519150601f19603f3d011682016040523d82523d6000602084013e6119bb565b606091505b50915091508180156119e057506000818060200190518101906119de9190612789565b115b611a205760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016104d7565b50505b60c954610100900460ff161561046b57604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b019161138891611a8a919061276d565b6000604051808303818686fa925050503d8060008114611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b5091509150818015611af1575080806020019051810190611aec9190612789565b600114155b611b2e5760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016104d7565b5050565b6000816001600160a01b03163b600003611b4e57506000919050565b6040516301ffc9a760e01b8152636cdb3d1360e11b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015611bb5575060408051601f3d908101601f19168201909252611bb291810190612199565b60015b611bc157506000919050565b92915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116611bc15760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016104d7565b6001600160a01b03811681146104e957600080fd5b600060208284031215611c8557600080fd5b8135611c9081611c5e565b9392505050565b60008083601f840112611ca957600080fd5b5081356001600160401b03811115611cc057600080fd5b6020830191508360208260051b8501011115611cdb57600080fd5b9250929050565b60008060008060008060006080888a031215611cfd57600080fd5b8735611d0881611c5e565b965060208801356001600160401b0380821115611d2457600080fd5b611d308b838c01611c97565b909850965060408a0135915080821115611d4957600080fd5b611d558b838c01611c97565b909650945060608a0135915080821115611d6e57600080fd5b50611d7b8a828b01611c97565b989b979a50959850939692959293505050565b600080600060608486031215611da357600080fd5b8335611dae81611c5e565b95602085013595506040909401359392505050565b60008060008060808587031215611dd957600080fd5b8435611de481611c5e565b93506020850135611df481611c5e565b93969395505050506040820135916060013590565b80151581146104e957600080fd5b600060208284031215611e2957600080fd5b8135611c9081611e09565b600080600080600080600060e0888a031215611e4f57600080fd5b8735611e5a81611c5e565b96506020880135611e6a81611c5e565b95506040880135611e7a81611c5e565b94506060880135611e8a81611c5e565b93506080880135611e9a81611e09565b925060a0880135611eaa81611e09565b915060c0880135611eba81611c5e565b8091505092959891949750929550565b60008060008060608587031215611ee057600080fd5b843593506020850135611ef281611c5e565b925060408501356001600160401b0380821115611f0e57600080fd5b818701915087601f830112611f2257600080fd5b813581811115611f3157600080fd5b886020828501011115611f4357600080fd5b95989497505060200194505050565b60008060008060808587031215611f6857600080fd5b8435611f7381611c5e565b93506020850135611f8381611c5e565b92506040850135611f9381611c5e565b91506060850135611fa381611c5e565b939692955090935050565b6020808252600a908201526914d654d5115350d0531360b21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000808585111561203057600080fd5b8386111561203d57600080fd5b5050820193919092039150565b80356020831015611bc157600019602084900360031b1b1692915050565b60208082526023908201527f4368696c64455243313135355072656469636174653a204e4f545f434f4e54526040820152621050d560ea1b606082015260800190565b6000602082840312156120bd57600080fd5b8151611c9081611c5e565b60208082526025908201527f4368696c64455243313135355072656469636174653a20554e4d41505045445f6040820152642a27a5a2a760d91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b81835260006001600160fb1b0383111561213c57600080fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b038616815260606020820181905260009061217a9083018688612123565b828103604084015261218d818587612123565b98975050505050505050565b6000602082840312156121ab57600080fd5b8151611c9081611e09565b60208082526022908201527f4368696c64455243313135355072656469636174653a204255524e5f4641494c604082015261115160f21b606082015260800190565b8183526000602080850194508260005b8581101561223657813561221b81611c5e565b6001600160a01b031687529582019590820190600101612208565b509495945050505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612274908301888a6121f8565b8281036080840152612287818789612123565b905082810360a084015261229c818587612123565b9c9b505050505050505050505050565b60005b838110156122c75781810151838201526020016122af565b50506000910152565b600081518084526122e88160208601602086016122ac565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090612320908301846122d0565b949350505050565b60608152600061233c60608301888a6121f8565b828103602084015261234f818789612123565b90508281036040840152612364818587612123565b9998505050505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b600080600080600060a086880312156123aa57600080fd5b85356123b581611c5e565b945060208601356123c581611c5e565b935060408601356123d581611c5e565b94979396509394606081013594506080013592915050565b60208082526022908201527f4368696c64455243313135355072656469636174653a204d494e545f4641494c604082015261115160f21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561246d5761246d61242f565b604052919050565b60006001600160401b0382111561248e5761248e61242f565b5060051b60200190565b600082601f8301126124a957600080fd5b813560206124be6124b983612475565b612445565b82815260059290921b840181019181810190868411156124dd57600080fd5b8286015b848110156124f857803583529183019183016124e1565b509695505050505050565b60008060008060008060c0878903121561251c57600080fd5b8635955060208088013561252f81611c5e565b9550604088013561253f81611c5e565b945060608801356001600160401b038082111561255b57600080fd5b818a0191508a601f83011261256f57600080fd5b813561257d6124b982612475565b81815260059190911b8301840190848101908d83111561259c57600080fd5b938501935b828510156125c35784356125b481611c5e565b825293850193908501906125a1565b9750505060808a01359250808311156125db57600080fd5b6125e78b848c01612498565b945060a08a01359250808311156125fd57600080fd5b505061260b89828a01612498565b9150509295509295509295565b600081518084526020808501945080840160005b838110156122365781518752958201959082019060010161262c565b606080825284519082018190526000906020906080840190828801845b8281101561268a5781516001600160a01b031684529284019290840190600101612665565b5050508381038285015261269e8187612618565b91505082810360408401526126b38185612618565b9695505050505050565b6000806000606084860312156126d257600080fd5b833592506020808501356126e581611c5e565b925060408501356001600160401b038082111561270157600080fd5b818701915087601f83011261271557600080fd5b8135818111156127275761272761242f565b612739601f8201601f19168501612445565b9150808252888482850101111561274f57600080fd5b80848401858401376000848284010152508093505050509250925092565b6000825161277f8184602087016122ac565b9190910192915050565b60006020828403121561279b57600080fd5b505191905056fea26469706673582212205d35ced486c2210da22d8254dca762acf5687ec4e599a9e2dbab26a8777a105964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC1155PredicateArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC1155Predicate","sourceName":"contracts/child/RootMintableERC1155Predicate.sol","abi":[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"childToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50611c01806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063b68ad1e4116100ad578063eeb4994511610071578063eeb49945146102fe578063f23a6e6114610311578063f4a120f714610330578063f645125514610343578063f8c8765e1461036a57600080fd5b8063b68ad1e41461023e578063bc197c8114610251578063c5ac2b1c14610289578063d41f1771146102b0578063d7c9e3ec146102d757600080fd5b80634c4c45de116100f45780634c4c45de146101a7578063654715e6146101ba5780637efab4f5146101cd578063a78e111c146101f6578063b17680651461020957600080fd5b806301ffc9a71461012657806305dc2e8f1461014e5780630efe6a8b146101795780631bc114ba1461018e575b600080fd5b610139610134366004611182565b61037d565b60405190151581526020015b60405180910390f35b600154610161906001600160a01b031681565b6040516001600160a01b039091168152602001610145565b61018c6101873660046111cb565b6103b4565b005b600054610161906201000090046001600160a01b031681565b61018c6101b536600461124b565b6103c5565b600254610161906001600160a01b031681565b6101616101db3660046112f7565b6004602052600090815260409020546001600160a01b031681565b61018c610204366004611314565b61043f565b6102307f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b604051908152602001610145565b600354610161906001600160a01b031681565b61027061025f3660046114a6565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610145565b6102307faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102307f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102307f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018c61030c366004611553565b610451565b61027061031f3660046115db565b63f23a6e6160e01b95945050505050565b61016161033e3660046112f7565b610629565b6102307f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61018c610378366004611643565b610944565b60006001600160e01b03198216630271189760e51b14806103ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6103c083338484610a5d565b505050565b84831480156103d357508481145b6104275760405162461bcd60e51b815260206004820152602c6024820152600080516020611bac83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61043687878787878787610bf3565b50505050505050565b61044b84848484610a5d565b50505050565b6001546001600160a01b031633146104c55760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b606482015260840161041e565b6002546001600160a01b0384811691161461053d5760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b606482015260840161041e565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961056c60206000848661169f565b610575916116c9565b036105945761058f61058a826020818661169f565b610dd3565b61044b565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26105c360206000848661169f565b6105cc916116c9565b036105db5761058f8282610ed2565b60405162461bcd60e51b815260206004820152602f6024820152600080516020611bac83398151915260448201526e56414c49445f5349474e415455524560881b606482015260840161041e565b60006001600160a01b0382166106835760405162461bcd60e51b815260206004820152602b6024820152600080516020611bac83398151915260448201526a2b20a624a22faa27a5a2a760a91b606482015260840161041e565b6001600160a01b0382811660009081526004602052604090205416156107005760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b606482015260840161041e565b6002546003546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b03928316926107aa921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b03848116600081815260046020818152604080842080546001600160a01b031916968816969096179095558451908101855282815293516303a24d0760e21b8152908101919091529294509091630e89341c90602401600060405180830381865afa92505050801561084557506040513d6000823e601f3d908101601f19168201604052610842919081019061170b565b60015b1561084d5790505b600060029054906101000a90046001600160a01b03166001600160a01b03166316f19831837f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad87856040516020016108a7939291906117ad565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108d39291906117d7565b600060405180830381600087803b1580156108ed57600080fd5b505af1158015610901573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff16158080156109645750600054600160ff909116105b8061097e5750303b15801561097e575060005460ff166001145b6109e15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161041e565b6000805460ff191660011790558015610a04576000805461ff0019166101001790555b610a1085858585611033565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000610a688561113b565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610a9d903390309088908890600401611803565b600060405180830381600087803b158015610ab757600080fd5b505af1158015610acb573d6000803e3d6000fd5b5050600054600254604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935262010000909404841695506316f198319450610b68939092169160e4016117d7565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610a56565b6000610bfe8861113b565b905060005b84811015610caa57886001600160a01b031663f242432a3330898986818110610c2e57610c2e61183b565b90506020020135888887818110610c4757610c4761183b565b905060200201356040518563ffffffff1660e01b8152600401610c6d9493929190611803565b600060405180830381600087803b158015610c8757600080fd5b505af1158015610c9b573d6000803e3d6000fd5b50505050806001019050610c03565b506000546002546040516001600160a01b03620100009093048316926316f19831921690610d0c907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e906020016118cc565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d389291906117d7565b600060405180830381600087803b158015610d5257600080fd5b505af1158015610d66573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a604051610dc196959493929190611937565b60405180910390a45050505050505050565b600080808080610de586880188611980565b6001600160a01b03808616600090815260046020526040902054959a50939850919650945092501680610e1a57610e1a6119db565b604051637921219560e11b81526001600160a01b0387169063f242432a90610e4c903090889088908890600401611803565b600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c690606001610dc1565b600080808080610ee4868801886119f1565b6001600160a01b03808616600090815260046020526040902054959b509399509197509550935016905080610f1b57610f1b6119db565b60005b8351811015610fe157866001600160a01b031663f242432a30878481518110610f4957610f4961183b565b6020026020010151878581518110610f6357610f6361183b565b6020026020010151878681518110610f7d57610f7d61183b565b60200260200101516040518563ffffffff1660e01b8152600401610fa49493929190611803565b600060405180830381600087803b158015610fbe57600080fd5b505af1158015610fd2573d6000803e3d6000fd5b50505050806001019050610f1e565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd20878787604051610dc193929190611b36565b6001600160a01b0384161580159061105357506001600160a01b03831615155b801561106757506001600160a01b03821615155b801561107b57506001600160a01b03811615155b6110e05760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b606482015260840161041e565b600080546001600160a01b03958616620100000262010000600160b01b0319909116179055600180549385166001600160a01b0319948516179055600280549285169284169290921790915560038054919093169116179055565b6001600160a01b0380821660009081526004602052604090205416806111675761116482610629565b90505b6001600160a01b03811661117d5761117d6119db565b919050565b60006020828403121561119457600080fd5b81356001600160e01b0319811681146111ac57600080fd5b9392505050565b6001600160a01b03811681146111c857600080fd5b50565b6000806000606084860312156111e057600080fd5b83356111eb816111b3565b95602085013595506040909401359392505050565b60008083601f84011261121257600080fd5b5081356001600160401b0381111561122957600080fd5b6020830191508360208260051b850101111561124457600080fd5b9250929050565b60008060008060008060006080888a03121561126657600080fd5b8735611271816111b3565b965060208801356001600160401b038082111561128d57600080fd5b6112998b838c01611200565b909850965060408a01359150808211156112b257600080fd5b6112be8b838c01611200565b909650945060608a01359150808211156112d757600080fd5b506112e48a828b01611200565b989b979a50959850939692959293505050565b60006020828403121561130957600080fd5b81356111ac816111b3565b6000806000806080858703121561132a57600080fd5b8435611335816111b3565b93506020850135611345816111b3565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156113985761139861135a565b604052919050565b60006001600160401b038211156113b9576113b961135a565b5060051b60200190565b600082601f8301126113d457600080fd5b813560206113e96113e4836113a0565b611370565b82815260059290921b8401810191818101908684111561140857600080fd5b8286015b84811015611423578035835291830191830161140c565b509695505050505050565b60006001600160401b038211156114475761144761135a565b50601f01601f191660200190565b600082601f83011261146657600080fd5b81356114746113e48261142e565b81815284602083860101111561148957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156114be57600080fd5b85356114c9816111b3565b945060208601356114d9816111b3565b935060408601356001600160401b03808211156114f557600080fd5b61150189838a016113c3565b9450606088013591508082111561151757600080fd5b61152389838a016113c3565b9350608088013591508082111561153957600080fd5b5061154688828901611455565b9150509295509295909350565b6000806000806060858703121561156957600080fd5b84359350602085013561157b816111b3565b925060408501356001600160401b038082111561159757600080fd5b818701915087601f8301126115ab57600080fd5b8135818111156115ba57600080fd5b8860208285010111156115cc57600080fd5b95989497505060200194505050565b600080600080600060a086880312156115f357600080fd5b85356115fe816111b3565b9450602086013561160e816111b3565b9350604086013592506060860135915060808601356001600160401b0381111561163757600080fd5b61154688828901611455565b6000806000806080858703121561165957600080fd5b8435611664816111b3565b93506020850135611674816111b3565b92506040850135611684816111b3565b91506060850135611694816111b3565b939692955090935050565b600080858511156116af57600080fd5b838611156116bc57600080fd5b5050820193919092039150565b803560208310156103ae57600019602084900360031b1b1692915050565b60005b838110156117025781810151838201526020016116ea565b50506000910152565b60006020828403121561171d57600080fd5b81516001600160401b0381111561173357600080fd5b8201601f8101841361174457600080fd5b80516117526113e48261142e565b81815285602083850101111561176757600080fd5b6117788260208301602086016116e7565b95945050505050565b600081518084526117998160208601602086016116e7565b601f01601f19169290920160200192915050565b8381526001600160a01b038316602082015260606040820181905260009061177890830184611781565b6001600160a01b03831681526040602082018190526000906117fb90830184611781565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b8581101561188f578135611874816111b3565b6001600160a01b031687529582019590820190600101611861565b509495945050505050565b81835260006001600160fb1b038311156118b357600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906118ff908301888a611851565b828103608084015261191281878961189a565b905082810360a084015261192781858761189a565b9c9b505050505050505050505050565b60608152600061194b60608301888a611851565b828103602084015261195e81878961189a565b9050828103604084015261197381858761189a565b9998505050505050505050565b600080600080600060a0868803121561199857600080fd5b85356119a3816111b3565b945060208601356119b3816111b3565b935060408601356119c3816111b3565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c08789031215611a0a57600080fd5b86359550602080880135611a1d816111b3565b95506040880135611a2d816111b3565b945060608801356001600160401b0380821115611a4957600080fd5b818a0191508a601f830112611a5d57600080fd5b8135611a6b6113e4826113a0565b81815260059190911b8301840190848101908d831115611a8a57600080fd5b938501935b82851015611ab1578435611aa2816111b3565b82529385019390850190611a8f565b9750505060808a0135925080831115611ac957600080fd5b611ad58b848c016113c3565b945060a08a0135925080831115611aeb57600080fd5b5050611af989828a016113c3565b9150509295509295509295565b600081518084526020808501945080840160005b8381101561188f57815187529582019590820190600101611b1a565b606080825284519082018190526000906020906080840190828801845b82811015611b785781516001600160a01b031684529284019290840190600101611b53565b50505083810382850152611b8c8187611b06565b9150508281036040840152611ba18185611b06565b969550505050505056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea2646970667358221220bac4157c867ef25ba423441a6f4177226bff4063bb665be9fb147719e7b08cc664736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063b68ad1e4116100ad578063eeb4994511610071578063eeb49945146102fe578063f23a6e6114610311578063f4a120f714610330578063f645125514610343578063f8c8765e1461036a57600080fd5b8063b68ad1e41461023e578063bc197c8114610251578063c5ac2b1c14610289578063d41f1771146102b0578063d7c9e3ec146102d757600080fd5b80634c4c45de116100f45780634c4c45de146101a7578063654715e6146101ba5780637efab4f5146101cd578063a78e111c146101f6578063b17680651461020957600080fd5b806301ffc9a71461012657806305dc2e8f1461014e5780630efe6a8b146101795780631bc114ba1461018e575b600080fd5b610139610134366004611182565b61037d565b60405190151581526020015b60405180910390f35b600154610161906001600160a01b031681565b6040516001600160a01b039091168152602001610145565b61018c6101873660046111cb565b6103b4565b005b600054610161906201000090046001600160a01b031681565b61018c6101b536600461124b565b6103c5565b600254610161906001600160a01b031681565b6101616101db3660046112f7565b6004602052600090815260409020546001600160a01b031681565b61018c610204366004611314565b61043f565b6102307f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b604051908152602001610145565b600354610161906001600160a01b031681565b61027061025f3660046114a6565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610145565b6102307faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b6102307f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102307f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b61018c61030c366004611553565b610451565b61027061031f3660046115db565b63f23a6e6160e01b95945050505050565b61016161033e3660046112f7565b610629565b6102307f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61018c610378366004611643565b610944565b60006001600160e01b03198216630271189760e51b14806103ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6103c083338484610a5d565b505050565b84831480156103d357508481145b6104275760405162461bcd60e51b815260206004820152602c6024820152600080516020611bac83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61043687878787878787610bf3565b50505050505050565b61044b84848484610a5d565b50505050565b6001546001600160a01b031633146104c55760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b606482015260840161041e565b6002546001600160a01b0384811691161461053d5760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b606482015260840161041e565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286961056c60206000848661169f565b610575916116c9565b036105945761058f61058a826020818661169f565b610dd3565b61044b565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26105c360206000848661169f565b6105cc916116c9565b036105db5761058f8282610ed2565b60405162461bcd60e51b815260206004820152602f6024820152600080516020611bac83398151915260448201526e56414c49445f5349474e415455524560881b606482015260840161041e565b60006001600160a01b0382166106835760405162461bcd60e51b815260206004820152602b6024820152600080516020611bac83398151915260448201526a2b20a624a22faa27a5a2a760a91b606482015260840161041e565b6001600160a01b0382811660009081526004602052604090205416156107005760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b606482015260840161041e565b6002546003546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b03928316926107aa921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b03848116600081815260046020818152604080842080546001600160a01b031916968816969096179095558451908101855282815293516303a24d0760e21b8152908101919091529294509091630e89341c90602401600060405180830381865afa92505050801561084557506040513d6000823e601f3d908101601f19168201604052610842919081019061170b565b60015b1561084d5790505b600060029054906101000a90046001600160a01b03166001600160a01b03166316f19831837f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad87856040516020016108a7939291906117ad565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016108d39291906117d7565b600060405180830381600087803b1580156108ed57600080fd5b505af1158015610901573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff16158080156109645750600054600160ff909116105b8061097e5750303b15801561097e575060005460ff166001145b6109e15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161041e565b6000805460ff191660011790558015610a04576000805461ff0019166101001790555b610a1085858585611033565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000610a688561113b565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610a9d903390309088908890600401611803565b600060405180830381600087803b158015610ab757600080fd5b505af1158015610acb573d6000803e3d6000fd5b5050600054600254604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935262010000909404841695506316f198319450610b68939092169160e4016117d7565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610a56565b6000610bfe8861113b565b905060005b84811015610caa57886001600160a01b031663f242432a3330898986818110610c2e57610c2e61183b565b90506020020135888887818110610c4757610c4761183b565b905060200201356040518563ffffffff1660e01b8152600401610c6d9493929190611803565b600060405180830381600087803b158015610c8757600080fd5b505af1158015610c9b573d6000803e3d6000fd5b50505050806001019050610c03565b506000546002546040516001600160a01b03620100009093048316926316f19831921690610d0c907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e906020016118cc565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d389291906117d7565b600060405180830381600087803b158015610d5257600080fd5b505af1158015610d66573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a604051610dc196959493929190611937565b60405180910390a45050505050505050565b600080808080610de586880188611980565b6001600160a01b03808616600090815260046020526040902054959a50939850919650945092501680610e1a57610e1a6119db565b604051637921219560e11b81526001600160a01b0387169063f242432a90610e4c903090889088908890600401611803565b600060405180830381600087803b158015610e6657600080fd5b505af1158015610e7a573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c690606001610dc1565b600080808080610ee4868801886119f1565b6001600160a01b03808616600090815260046020526040902054959b509399509197509550935016905080610f1b57610f1b6119db565b60005b8351811015610fe157866001600160a01b031663f242432a30878481518110610f4957610f4961183b565b6020026020010151878581518110610f6357610f6361183b565b6020026020010151878681518110610f7d57610f7d61183b565b60200260200101516040518563ffffffff1660e01b8152600401610fa49493929190611803565b600060405180830381600087803b158015610fbe57600080fd5b505af1158015610fd2573d6000803e3d6000fd5b50505050806001019050610f1e565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd20878787604051610dc193929190611b36565b6001600160a01b0384161580159061105357506001600160a01b03831615155b801561106757506001600160a01b03821615155b801561107b57506001600160a01b03811615155b6110e05760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b606482015260840161041e565b600080546001600160a01b03958616620100000262010000600160b01b0319909116179055600180549385166001600160a01b0319948516179055600280549285169284169290921790915560038054919093169116179055565b6001600160a01b0380821660009081526004602052604090205416806111675761116482610629565b90505b6001600160a01b03811661117d5761117d6119db565b919050565b60006020828403121561119457600080fd5b81356001600160e01b0319811681146111ac57600080fd5b9392505050565b6001600160a01b03811681146111c857600080fd5b50565b6000806000606084860312156111e057600080fd5b83356111eb816111b3565b95602085013595506040909401359392505050565b60008083601f84011261121257600080fd5b5081356001600160401b0381111561122957600080fd5b6020830191508360208260051b850101111561124457600080fd5b9250929050565b60008060008060008060006080888a03121561126657600080fd5b8735611271816111b3565b965060208801356001600160401b038082111561128d57600080fd5b6112998b838c01611200565b909850965060408a01359150808211156112b257600080fd5b6112be8b838c01611200565b909650945060608a01359150808211156112d757600080fd5b506112e48a828b01611200565b989b979a50959850939692959293505050565b60006020828403121561130957600080fd5b81356111ac816111b3565b6000806000806080858703121561132a57600080fd5b8435611335816111b3565b93506020850135611345816111b3565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156113985761139861135a565b604052919050565b60006001600160401b038211156113b9576113b961135a565b5060051b60200190565b600082601f8301126113d457600080fd5b813560206113e96113e4836113a0565b611370565b82815260059290921b8401810191818101908684111561140857600080fd5b8286015b84811015611423578035835291830191830161140c565b509695505050505050565b60006001600160401b038211156114475761144761135a565b50601f01601f191660200190565b600082601f83011261146657600080fd5b81356114746113e48261142e565b81815284602083860101111561148957600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156114be57600080fd5b85356114c9816111b3565b945060208601356114d9816111b3565b935060408601356001600160401b03808211156114f557600080fd5b61150189838a016113c3565b9450606088013591508082111561151757600080fd5b61152389838a016113c3565b9350608088013591508082111561153957600080fd5b5061154688828901611455565b9150509295509295909350565b6000806000806060858703121561156957600080fd5b84359350602085013561157b816111b3565b925060408501356001600160401b038082111561159757600080fd5b818701915087601f8301126115ab57600080fd5b8135818111156115ba57600080fd5b8860208285010111156115cc57600080fd5b95989497505060200194505050565b600080600080600060a086880312156115f357600080fd5b85356115fe816111b3565b9450602086013561160e816111b3565b9350604086013592506060860135915060808601356001600160401b0381111561163757600080fd5b61154688828901611455565b6000806000806080858703121561165957600080fd5b8435611664816111b3565b93506020850135611674816111b3565b92506040850135611684816111b3565b91506060850135611694816111b3565b939692955090935050565b600080858511156116af57600080fd5b838611156116bc57600080fd5b5050820193919092039150565b803560208310156103ae57600019602084900360031b1b1692915050565b60005b838110156117025781810151838201526020016116ea565b50506000910152565b60006020828403121561171d57600080fd5b81516001600160401b0381111561173357600080fd5b8201601f8101841361174457600080fd5b80516117526113e48261142e565b81815285602083850101111561176757600080fd5b6117788260208301602086016116e7565b95945050505050565b600081518084526117998160208601602086016116e7565b601f01601f19169290920160200192915050565b8381526001600160a01b038316602082015260606040820181905260009061177890830184611781565b6001600160a01b03831681526040602082018190526000906117fb90830184611781565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b8581101561188f578135611874816111b3565b6001600160a01b031687529582019590820190600101611861565b509495945050505050565b81835260006001600160fb1b038311156118b357600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c0606082018190526000906118ff908301888a611851565b828103608084015261191281878961189a565b905082810360a084015261192781858761189a565b9c9b505050505050505050505050565b60608152600061194b60608301888a611851565b828103602084015261195e81878961189a565b9050828103604084015261197381858761189a565b9998505050505050505050565b600080600080600060a0868803121561199857600080fd5b85356119a3816111b3565b945060208601356119b3816111b3565b935060408601356119c3816111b3565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c08789031215611a0a57600080fd5b86359550602080880135611a1d816111b3565b95506040880135611a2d816111b3565b945060608801356001600160401b0380821115611a4957600080fd5b818a0191508a601f830112611a5d57600080fd5b8135611a6b6113e4826113a0565b81815260059190911b8301840190848101908d831115611a8a57600080fd5b938501935b82851015611ab1578435611aa2816111b3565b82529385019390850190611a8f565b9750505060808a0135925080831115611ac957600080fd5b611ad58b848c016113c3565b945060a08a0135925080831115611aeb57600080fd5b5050611af989828a016113c3565b9150509295509295509295565b600081518084526020808501945080840160005b8381101561188f57815187529582019590820190600101611b1a565b606080825284519082018190526000906020906080840190828801845b82811015611b785781516001600160a01b031684529284019290840190600101611b53565b50505083810382850152611b8c8187611b06565b9150508281036040840152611ba18185611b06565b969550505050505056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea2646970667358221220bac4157c867ef25ba423441a6f4177226bff4063bb665be9fb147719e7b08cc664736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var RootMintableERC1155PredicateACLArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"RootMintableERC1155PredicateAccessList","sourceName":"contracts/child/RootMintableERC1155PredicateAccessList.sol","abi":[{"inputs":[{"internalType":"string","name":"only","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AllowListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockListUsageSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155DepositBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"L2MintableERC1155Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"L2MintableERC1155WithdrawBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"L2MintableTokenMapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_BATCH_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childERC1155Predicate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childTokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"depositBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"},{"internalType":"bool","name":"newUseAllowList","type":"bool"},{"internalType":"bool","name":"newUseBlockList","type":"bool"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newL2StateSender","type":"address"},{"internalType":"address","name":"newStateReceiver","type":"address"},{"internalType":"address","name":"newChildERC1155Predicate","type":"address"},{"internalType":"address","name":"newChildTokenTemplate","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l2StateSender","outputs":[{"internalType":"contract IStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155MetadataURI","name":"rootToken","type":"address"}],"name":"mapToken","outputs":[{"internalType":"address","name":"childToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onStateReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootTokenToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseAllowList","type":"bool"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newUseBlockList","type":"bool"}],"name":"setBlockList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612480806100206000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063a78e111c11610125578063d8dd1773116100ad578063f23a6e611161007c578063f23a6e61146104d3578063f2fde38b146104f2578063f4a120f714610505578063f645125514610518578063f8c8765e1461053f57600080fd5b8063d8dd177314610493578063e0563ab1146104a6578063e30c3978146104af578063eeb49945146104c057600080fd5b8063c1225a20116100f4578063c1225a20146103f8578063c5ac2b1c1461040b578063c5e4683a14610432578063d41f177114610445578063d7c9e3ec1461046c57600080fd5b8063a78e111c14610373578063b176806514610386578063b68ad1e4146103ad578063bc197c81146103c057600080fd5b806355b01e4d116101a857806379ba50971161017757806379ba50971461031d5780637efab4f5146103255780638da5cb5b1461034f578063947287cf1461036057806397e5230d1461036957600080fd5b806355b01e4d146102dd5780635ea5df79146102eb578063654715e614610302578063715018a61461031557600080fd5b80631bc114ba116101ef5780631bc114ba14610297578063284017f5146102aa5780633b878c22146102b35780634c4c45de146102bc57806351351d53146102cf57600080fd5b806301ffc9a71461022157806305dc2e8f1461024957806307b3e252146102745780630efe6a8b14610282575b600080fd5b61023461022f3660046118c4565b610552565b60405190151581526020015b60405180910390f35b60fd5461025c906001600160a01b031681565b6040516001600160a01b039091168152602001610240565b61025c6004600360981b0181565b61029561029036600461190a565b610589565b005b60fc5461025c906001600160a01b031681565b61025c61202081565b61025c61101081565b6102956102ca36600461198a565b61059a565b61025c6002600160a01b0381565b61025c6004600160991b0181565b6102f461138881565b604051908152602001610240565b60fe5461025c906001600160a01b031681565b610295610614565b610295610628565b61025c610333366004611a36565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b031661025c565b6102f461520881565b6102f4620249f081565b610295610381366004611a53565b6106a2565b6102f47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff5461025c906001600160a01b031681565b6103df6103ce366004611be5565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610240565b610295610406366004611ca2565b6106b4565b6102f47faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610295610440366004611ca2565b610703565b6102f47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102f47f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102956104a1366004611cbd565b61074a565b61025c61203081565b6065546001600160a01b031661025c565b6102956104ce366004611d4f565b610888565b6103df6104e1366004611dd7565b63f23a6e6160e01b95945050505050565b610295610500366004611a36565b610a60565b61025c610513366004611a36565b610ad1565b6102f47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61029561054d366004611e3f565b610de1565b60006001600160e01b03198216630271189760e51b148061058357506301ffc9a760e01b6001600160e01b03198316145b92915050565b61059583338484610eb3565b505050565b84831480156105a857508481145b6105fc5760405162461bcd60e51b815260206004820152602c602482015260008051602061242b83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61060b8787878787878761104b565b50505050505050565b61061c611228565b6106266000611282565b565b60655433906001600160a01b031681146106965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105f3565b61069f81611282565b50565b6106ae84848484610eb3565b50505050565b6106bc611228565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61070b611228565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b031461078e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016105f3565b600054610100900460ff16158080156107ae5750600054600160ff909116105b806107c85750303b1580156107c8575060005460ff166001145b6107e45760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610807576000805461ff0019166101001790555b6108138888888861129b565b60c9805461ffff191685151561ff001916176101008515150217905561083882611282565b801561087e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146108fc5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b60648201526084016105f3565b60fe546001600160a01b038481169116146109745760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b60648201526084016105f3565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696109a3602060008486611ee9565b6109ac91611f13565b036109cb576109c66109c18260208186611ee9565b611398565b6106ae565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26109fa602060008486611ee9565b610a0391611f13565b03610a12576109c682826114a6565b60405162461bcd60e51b815260206004820152602f602482015260008051602061242b83398151915260448201526e56414c49445f5349474e415455524560881b60648201526084016105f3565b610a68611228565b606580546001600160a01b0383166001600160a01b03199091168117909155610a996033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b038216610b2b5760405162461bcd60e51b815260206004820152602b602482015260008051602061242b83398151915260448201526a2b20a624a22faa27a5a2a760a91b60648201526084016105f3565b6001600160a01b03828116600090815261010060205260409020541615610ba95760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b60648201526084016105f3565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692610c53921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0384811660008181526101006020908152604080832080546001600160a01b031916958716959095179094558351908101845281815292516303a24d0760e21b815260048101919091529294509091630e89341c90602401600060405180830381865afa925050508015610cf057506040513d6000823e601f3d908101601f19168201604052610ced9190810190611f55565b60015b15610cf85790505b60fc546040516001600160a01b03909116906316f19831908490610d44907f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad9089908790602001611ff7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d70929190612021565b600060405180830381600087803b158015610d8a57600080fd5b505af1158015610d9e573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff1615808015610e015750600054600160ff909116105b80610e1b5750303b158015610e1b575060005460ff166001145b610e375760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610e5a576000805461ff0019166101001790555b610e668585858561129b565b8015610eac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610ebb611608565b6000610ec685611610565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610efb90339030908890889060040161204d565b600060405180830381600087803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935293841695506316f198319450610fc0939092169160e401612021565b600060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610eac565b611053611608565b600061105e88611610565b905060005b8481101561110a57886001600160a01b031663f242432a333089898681811061108e5761108e612085565b905060200201358888878181106110a7576110a7612085565b905060200201356040518563ffffffff1660e01b81526004016110cd949392919061204d565b600060405180830381600087803b1580156110e757600080fd5b505af11580156110fb573d6000803e3d6000fd5b50505050806001019050611063565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611166907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e90602001612116565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401611192929190612021565b600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a60405161121b96959493929190612181565b60405180910390a461087e565b6033546001600160a01b031633146106265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b606580546001600160a01b031916905561069f81611658565b6001600160a01b038416158015906112bb57506001600160a01b03831615155b80156112cf57506001600160a01b03821615155b80156112e357506001600160a01b03811615155b6113485760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b60648201526084016105f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080806113aa868801886121ca565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806113e0576113e0612225565b604051637921219560e11b81526001600160a01b0387169063f242432a9061141290309088908890889060040161204d565b600060405180830381600087803b15801561142c57600080fd5b505af1158015611440573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c6906060015b60405180910390a45050505050505050565b6000808080806114b88688018861223b565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806114f0576114f0612225565b60005b83518110156115b657866001600160a01b031663f242432a3087848151811061151e5761151e612085565b602002602001015187858151811061153857611538612085565b602002602001015187868151811061155257611552612085565b60200260200101516040518563ffffffff1660e01b8152600401611579949392919061204d565b600060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b505050508060010190506114f3565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd2087878760405161149493929190612380565b6106266116aa565b6001600160a01b0380821660009081526101006020526040902054168061163d5761163a82610ad1565b90505b6001600160a01b03811661165357611653612225565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156117b557604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161170c91906123f5565b6000604051808303818686fa925050503d8060008114611748576040519150601f19603f3d011682016040523d82523d6000602084013e61174d565b606091505b509150915081801561177257506000818060200190518101906117709190612411565b115b6117b25760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016105f3565b50505b60c954610100900460ff161561062657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161181c91906123f5565b6000604051808303818686fa925050503d8060008114611858576040519150601f19603f3d011682016040523d82523d6000602084013e61185d565b606091505b509150915081801561188357508080602001905181019061187e9190612411565b600114155b6118c05760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016105f3565b5050565b6000602082840312156118d657600080fd5b81356001600160e01b0319811681146118ee57600080fd5b9392505050565b6001600160a01b038116811461069f57600080fd5b60008060006060848603121561191f57600080fd5b833561192a816118f5565b95602085013595506040909401359392505050565b60008083601f84011261195157600080fd5b5081356001600160401b0381111561196857600080fd5b6020830191508360208260051b850101111561198357600080fd5b9250929050565b60008060008060008060006080888a0312156119a557600080fd5b87356119b0816118f5565b965060208801356001600160401b03808211156119cc57600080fd5b6119d88b838c0161193f565b909850965060408a01359150808211156119f157600080fd5b6119fd8b838c0161193f565b909650945060608a0135915080821115611a1657600080fd5b50611a238a828b0161193f565b989b979a50959850939692959293505050565b600060208284031215611a4857600080fd5b81356118ee816118f5565b60008060008060808587031215611a6957600080fd5b8435611a74816118f5565b93506020850135611a84816118f5565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611ad757611ad7611a99565b604052919050565b60006001600160401b03821115611af857611af8611a99565b5060051b60200190565b600082601f830112611b1357600080fd5b81356020611b28611b2383611adf565b611aaf565b82815260059290921b84018101918181019086841115611b4757600080fd5b8286015b84811015611b625780358352918301918301611b4b565b509695505050505050565b60006001600160401b03821115611b8657611b86611a99565b50601f01601f191660200190565b600082601f830112611ba557600080fd5b8135611bb3611b2382611b6d565b818152846020838601011115611bc857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611bfd57600080fd5b8535611c08816118f5565b94506020860135611c18816118f5565b935060408601356001600160401b0380821115611c3457600080fd5b611c4089838a01611b02565b94506060880135915080821115611c5657600080fd5b611c6289838a01611b02565b93506080880135915080821115611c7857600080fd5b50611c8588828901611b94565b9150509295509295909350565b8035801515811461165357600080fd5b600060208284031215611cb457600080fd5b6118ee82611c92565b600080600080600080600060e0888a031215611cd857600080fd5b8735611ce3816118f5565b96506020880135611cf3816118f5565b95506040880135611d03816118f5565b94506060880135611d13816118f5565b9350611d2160808901611c92565b9250611d2f60a08901611c92565b915060c0880135611d3f816118f5565b8091505092959891949750929550565b60008060008060608587031215611d6557600080fd5b843593506020850135611d77816118f5565b925060408501356001600160401b0380821115611d9357600080fd5b818701915087601f830112611da757600080fd5b813581811115611db657600080fd5b886020828501011115611dc857600080fd5b95989497505060200194505050565b600080600080600060a08688031215611def57600080fd5b8535611dfa816118f5565b94506020860135611e0a816118f5565b9350604086013592506060860135915060808601356001600160401b03811115611e3357600080fd5b611c8588828901611b94565b60008060008060808587031215611e5557600080fd5b8435611e60816118f5565b93506020850135611e70816118f5565b92506040850135611e80816118f5565b91506060850135611e90816118f5565b939692955090935050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611ef957600080fd5b83861115611f0657600080fd5b5050820193919092039150565b8035602083101561058357600019602084900360031b1b1692915050565b60005b83811015611f4c578181015183820152602001611f34565b50506000910152565b600060208284031215611f6757600080fd5b81516001600160401b03811115611f7d57600080fd5b8201601f81018413611f8e57600080fd5b8051611f9c611b2382611b6d565b818152856020838501011115611fb157600080fd5b611fc2826020830160208601611f31565b95945050505050565b60008151808452611fe3816020860160208601611f31565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090611fc290830184611fcb565b6001600160a01b038316815260406020820181905260009061204590830184611fcb565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b858110156120d95781356120be816118f5565b6001600160a01b0316875295820195908201906001016120ab565b509495945050505050565b81835260006001600160fb1b038311156120fd57600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612149908301888a61209b565b828103608084015261215c8187896120e4565b905082810360a08401526121718185876120e4565b9c9b505050505050505050505050565b60608152600061219560608301888a61209b565b82810360208401526121a88187896120e4565b905082810360408401526121bd8185876120e4565b9998505050505050505050565b600080600080600060a086880312156121e257600080fd5b85356121ed816118f5565b945060208601356121fd816118f5565b9350604086013561220d816118f5565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c0878903121561225457600080fd5b86359550602080880135612267816118f5565b95506040880135612277816118f5565b945060608801356001600160401b038082111561229357600080fd5b818a0191508a601f8301126122a757600080fd5b81356122b5611b2382611adf565b81815260059190911b8301840190848101908d8311156122d457600080fd5b938501935b828510156122fb5784356122ec816118f5565b825293850193908501906122d9565b9750505060808a013592508083111561231357600080fd5b61231f8b848c01611b02565b945060a08a013592508083111561233557600080fd5b505061234389828a01611b02565b9150509295509295509295565b600081518084526020808501945080840160005b838110156120d957815187529582019590820190600101612364565b606080825284519082018190526000906020906080840190828801845b828110156123c25781516001600160a01b03168452928401929084019060010161239d565b505050838103828501526123d68187612350565b91505082810360408401526123eb8185612350565b9695505050505050565b60008251612407818460208701611f31565b9190910192915050565b60006020828403121561242357600080fd5b505191905056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea26469706673582212207cc4d2e1fa811483449e50a585f2819503c945760fb6c93dc493fe7ad5264ad364736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063a78e111c11610125578063d8dd1773116100ad578063f23a6e611161007c578063f23a6e61146104d3578063f2fde38b146104f2578063f4a120f714610505578063f645125514610518578063f8c8765e1461053f57600080fd5b8063d8dd177314610493578063e0563ab1146104a6578063e30c3978146104af578063eeb49945146104c057600080fd5b8063c1225a20116100f4578063c1225a20146103f8578063c5ac2b1c1461040b578063c5e4683a14610432578063d41f177114610445578063d7c9e3ec1461046c57600080fd5b8063a78e111c14610373578063b176806514610386578063b68ad1e4146103ad578063bc197c81146103c057600080fd5b806355b01e4d116101a857806379ba50971161017757806379ba50971461031d5780637efab4f5146103255780638da5cb5b1461034f578063947287cf1461036057806397e5230d1461036957600080fd5b806355b01e4d146102dd5780635ea5df79146102eb578063654715e614610302578063715018a61461031557600080fd5b80631bc114ba116101ef5780631bc114ba14610297578063284017f5146102aa5780633b878c22146102b35780634c4c45de146102bc57806351351d53146102cf57600080fd5b806301ffc9a71461022157806305dc2e8f1461024957806307b3e252146102745780630efe6a8b14610282575b600080fd5b61023461022f3660046118c4565b610552565b60405190151581526020015b60405180910390f35b60fd5461025c906001600160a01b031681565b6040516001600160a01b039091168152602001610240565b61025c6004600360981b0181565b61029561029036600461190a565b610589565b005b60fc5461025c906001600160a01b031681565b61025c61202081565b61025c61101081565b6102956102ca36600461198a565b61059a565b61025c6002600160a01b0381565b61025c6004600160991b0181565b6102f461138881565b604051908152602001610240565b60fe5461025c906001600160a01b031681565b610295610614565b610295610628565b61025c610333366004611a36565b610100602052600090815260409020546001600160a01b031681565b6033546001600160a01b031661025c565b6102f461520881565b6102f4620249f081565b610295610381366004611a53565b6106a2565b6102f47f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60ff5461025c906001600160a01b031681565b6103df6103ce366004611be5565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610240565b610295610406366004611ca2565b6106b4565b6102f47faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d1881565b610295610440366004611ca2565b610703565b6102f47f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b6102f47f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed281565b6102956104a1366004611cbd565b61074a565b61025c61203081565b6065546001600160a01b031661025c565b6102956104ce366004611d4f565b610888565b6103df6104e1366004611dd7565b63f23a6e6160e01b95945050505050565b610295610500366004611a36565b610a60565b61025c610513366004611a36565b610ad1565b6102f47f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b61029561054d366004611e3f565b610de1565b60006001600160e01b03198216630271189760e51b148061058357506301ffc9a760e01b6001600160e01b03198316145b92915050565b61059583338484610eb3565b505050565b84831480156105a857508481145b6105fc5760405162461bcd60e51b815260206004820152602c602482015260008051602061242b83398151915260448201526b0ac82989288be988a9c8ea8960a31b60648201526084015b60405180910390fd5b61060b8787878787878761104b565b50505050505050565b61061c611228565b6106266000611282565b565b60655433906001600160a01b031681146106965760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105f3565b61069f81611282565b50565b6106ae84848484610eb3565b50505050565b6106bc611228565b60c9805461ff0019166101008315159081029190911790915560405143907f61d574757cde41a357d030b39b2705796ccd699578037ab9a1cfd8117d82bf8690600090a350565b61070b611228565b60c9805460ff191682151590811790915560405143907fe0a0f0fa52db091cb71c202d80420311430ce1ae2e7794149877b6720ce8bf0b90600090a350565b336002600160a01b031461078e5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016105f3565b600054610100900460ff16158080156107ae5750600054600160ff909116105b806107c85750303b1580156107c8575060005460ff166001145b6107e45760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610807576000805461ff0019166101001790555b6108138888888861129b565b60c9805461ffff191685151561ff001916176101008515150217905561083882611282565b801561087e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60fd546001600160a01b031633146108fc5760405162461bcd60e51b815260206004820152603160248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e604482015270262cafa9aa20aa22afa922a1a2a4ab22a960791b60648201526084016105f3565b60fe546001600160a01b038481169116146109745760405162461bcd60e51b815260206004820152603260248201527f526f6f744d696e7461626c65455243313135355072656469636174653a204f4e6044820152714c595f4348494c445f50524544494341544560701b60648201526084016105f3565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696109a3602060008486611ee9565b6109ac91611f13565b036109cb576109c66109c18260208186611ee9565b611398565b6106ae565b7f5fb452c5a8f2b7c7ef2984e2f1063c7ee9b80b110cdc98ccb98f6654e10b5ed26109fa602060008486611ee9565b610a0391611f13565b03610a12576109c682826114a6565b60405162461bcd60e51b815260206004820152602f602482015260008051602061242b83398151915260448201526e56414c49445f5349474e415455524560881b60648201526084016105f3565b610a68611228565b606580546001600160a01b0383166001600160a01b03199091168117909155610a996033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006001600160a01b038216610b2b5760405162461bcd60e51b815260206004820152602b602482015260008051602061242b83398151915260448201526a2b20a624a22faa27a5a2a760a91b60648201526084016105f3565b6001600160a01b03828116600090815261010060205260409020541615610ba95760405162461bcd60e51b815260206004820152602c60248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20414c60448201526b149150511657d3505414115160a21b60648201526084016105f3565b60fe5460ff546040516bffffffffffffffffffffffff19606086901b1660208201526001600160a01b0392831692610c53921690603401604051602081830303815290604052805190602001208360405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b0384811660008181526101006020908152604080832080546001600160a01b031916958716959095179094558351908101845281815292516303a24d0760e21b815260048101919091529294509091630e89341c90602401600060405180830381865afa925050508015610cf057506040513d6000823e601f3d908101601f19168201604052610ced9190810190611f55565b60015b15610cf85790505b60fc546040516001600160a01b03909116906316f19831908490610d44907f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad9089908790602001611ff7565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610d70929190612021565b600060405180830381600087803b158015610d8a57600080fd5b505af1158015610d9e573d6000803e3d6000fd5b50506040516001600160a01b038087169350871691507fb96a191bae4e25ffdff7f4136994eb0dec75d263750a07c035202c348c9515f090600090a35050919050565b600054610100900460ff1615808015610e015750600054600160ff909116105b80610e1b5750303b158015610e1b575060005460ff166001145b610e375760405162461bcd60e51b81526004016105f390611e9b565b6000805460ff191660011790558015610e5a576000805461ff0019166101001790555b610e668585858561129b565b8015610eac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b610ebb611608565b6000610ec685611610565b604051637921219560e11b81529091506001600160a01b0386169063f242432a90610efb90339030908890889060040161204d565b600060405180830381600087803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b505060fc5460fe54604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b038b8116828401523360608301528a8116608083015260a082018a905260c08083018a90528351808403909101815260e08301938490526316f1983160e01b90935293841695506316f198319450610fc0939092169160e401612021565b600060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b505060408051338152602081018790529081018590526001600160a01b03808816935084811692508816907fe6f1fb6bb1930a5d4b997d56e0a4a8cb6f3f941f0d5391f63c1f6914ee01e0b89060600160405180910390a4610eac565b611053611608565b600061105e88611610565b905060005b8481101561110a57886001600160a01b031663f242432a333089898681811061108e5761108e612085565b905060200201358888878181106110a7576110a7612085565b905060200201356040518563ffffffff1660e01b81526004016110cd949392919061204d565b600060405180830381600087803b1580156110e757600080fd5b505af11580156110fb573d6000803e3d6000fd5b50505050806001019050611063565b5060fc5460fe546040516001600160a01b03928316926316f19831921690611166907faf50c8eab81226bc79eee3a10e3fe25db1a2be7241130e392b0675df839b6d18908d9033908e908e908e908e908e908e90602001612116565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401611192929190612021565b600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316896001600160a01b03167fa7d9cd27143f817fe006011faf3c04351f70f75cd30e7b21405817f2f670041e8a8a8a8a8a8a60405161121b96959493929190612181565b60405180910390a461087e565b6033546001600160a01b031633146106265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b606580546001600160a01b031916905561069f81611658565b6001600160a01b038416158015906112bb57506001600160a01b03831615155b80156112cf57506001600160a01b03821615155b80156112e357506001600160a01b03811615155b6113485760405162461bcd60e51b815260206004820152603060248201527f526f6f744d696e7461626c65455243313135355072656469636174653a20424160448201526f222fa4a724aa24a0a624ad20aa24a7a760811b60648201526084016105f3565b60fc80546001600160a01b039586166001600160a01b03199182161790915560fd80549486169482169490941790935560fe80549285169284169290921790915560ff8054919093169116179055565b6000808080806113aa868801886121ca565b6001600160a01b0380861660009081526101006020526040902054959a509398509196509450925016806113e0576113e0612225565b604051637921219560e11b81526001600160a01b0387169063f242432a9061141290309088908890889060040161204d565b600060405180830381600087803b15801561142c57600080fd5b505af1158015611440573d6000803e3d6000fd5b5050604080516001600160a01b0389811682526020820188905291810186905281881693508482169250908916907f52cdfbe452878311d3237a4c20a951600d8e3a4fe6691d967d33788dc12d19c6906060015b60405180910390a45050505050505050565b6000808080806114b88688018861223b565b6001600160a01b0380861660009081526101006020526040902054959b5093995091975095509350169050806114f0576114f0612225565b60005b83518110156115b657866001600160a01b031663f242432a3087848151811061151e5761151e612085565b602002602001015187858151811061153857611538612085565b602002602001015187868151811061155257611552612085565b60200260200101516040518563ffffffff1660e01b8152600401611579949392919061204d565b600060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b505050508060010190506114f3565b50846001600160a01b0316816001600160a01b0316876001600160a01b03167f52733a40a0466155541c2fc4044165dd37a3db116bc834bab2f020665e90fd2087878760405161149493929190612380565b6106266116aa565b6001600160a01b0380821660009081526101006020526040902054168061163d5761163a82610ad1565b90505b6001600160a01b03811661165357611653612225565b919050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60c95460ff16156117b557604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600160991b01916113889161170c91906123f5565b6000604051808303818686fa925050503d8060008114611748576040519150601f19603f3d011682016040523d82523d6000602084013e61174d565b606091505b509150915081801561177257506000818060200190518101906117709190612411565b115b6117b25760405162461bcd60e51b81526020600482015260116024820152702224a9a0a62627aba2a22fa9a2a72222a960791b60448201526064016105f3565b50505b60c954610100900460ff161561062657604080513360248083019190915282518083039091018152604490910182526020810180516001600160e01b031663d78bca6960e01b179052905160009182916004600360981b01916113889161181c91906123f5565b6000604051808303818686fa925050503d8060008114611858576040519150601f19603f3d011682016040523d82523d6000602084013e61185d565b606091505b509150915081801561188357508080602001905181019061187e9190612411565b600114155b6118c05760405162461bcd60e51b815260206004820152600e60248201526d212627a1a5a2a22fa9a2a72222a960911b60448201526064016105f3565b5050565b6000602082840312156118d657600080fd5b81356001600160e01b0319811681146118ee57600080fd5b9392505050565b6001600160a01b038116811461069f57600080fd5b60008060006060848603121561191f57600080fd5b833561192a816118f5565b95602085013595506040909401359392505050565b60008083601f84011261195157600080fd5b5081356001600160401b0381111561196857600080fd5b6020830191508360208260051b850101111561198357600080fd5b9250929050565b60008060008060008060006080888a0312156119a557600080fd5b87356119b0816118f5565b965060208801356001600160401b03808211156119cc57600080fd5b6119d88b838c0161193f565b909850965060408a01359150808211156119f157600080fd5b6119fd8b838c0161193f565b909650945060608a0135915080821115611a1657600080fd5b50611a238a828b0161193f565b989b979a50959850939692959293505050565b600060208284031215611a4857600080fd5b81356118ee816118f5565b60008060008060808587031215611a6957600080fd5b8435611a74816118f5565b93506020850135611a84816118f5565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611ad757611ad7611a99565b604052919050565b60006001600160401b03821115611af857611af8611a99565b5060051b60200190565b600082601f830112611b1357600080fd5b81356020611b28611b2383611adf565b611aaf565b82815260059290921b84018101918181019086841115611b4757600080fd5b8286015b84811015611b625780358352918301918301611b4b565b509695505050505050565b60006001600160401b03821115611b8657611b86611a99565b50601f01601f191660200190565b600082601f830112611ba557600080fd5b8135611bb3611b2382611b6d565b818152846020838601011115611bc857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611bfd57600080fd5b8535611c08816118f5565b94506020860135611c18816118f5565b935060408601356001600160401b0380821115611c3457600080fd5b611c4089838a01611b02565b94506060880135915080821115611c5657600080fd5b611c6289838a01611b02565b93506080880135915080821115611c7857600080fd5b50611c8588828901611b94565b9150509295509295909350565b8035801515811461165357600080fd5b600060208284031215611cb457600080fd5b6118ee82611c92565b600080600080600080600060e0888a031215611cd857600080fd5b8735611ce3816118f5565b96506020880135611cf3816118f5565b95506040880135611d03816118f5565b94506060880135611d13816118f5565b9350611d2160808901611c92565b9250611d2f60a08901611c92565b915060c0880135611d3f816118f5565b8091505092959891949750929550565b60008060008060608587031215611d6557600080fd5b843593506020850135611d77816118f5565b925060408501356001600160401b0380821115611d9357600080fd5b818701915087601f830112611da757600080fd5b813581811115611db657600080fd5b886020828501011115611dc857600080fd5b95989497505060200194505050565b600080600080600060a08688031215611def57600080fd5b8535611dfa816118f5565b94506020860135611e0a816118f5565b9350604086013592506060860135915060808601356001600160401b03811115611e3357600080fd5b611c8588828901611b94565b60008060008060808587031215611e5557600080fd5b8435611e60816118f5565b93506020850135611e70816118f5565b92506040850135611e80816118f5565b91506060850135611e90816118f5565b939692955090935050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60008085851115611ef957600080fd5b83861115611f0657600080fd5b5050820193919092039150565b8035602083101561058357600019602084900360031b1b1692915050565b60005b83811015611f4c578181015183820152602001611f34565b50506000910152565b600060208284031215611f6757600080fd5b81516001600160401b03811115611f7d57600080fd5b8201601f81018413611f8e57600080fd5b8051611f9c611b2382611b6d565b818152856020838501011115611fb157600080fd5b611fc2826020830160208601611f31565b95945050505050565b60008151808452611fe3816020860160208601611f31565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090611fc290830184611fcb565b6001600160a01b038316815260406020820181905260009061204590830184611fcb565b949350505050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b858110156120d95781356120be816118f5565b6001600160a01b0316875295820195908201906001016120ab565b509495945050505050565b81835260006001600160fb1b038311156120fd57600080fd5b8260051b80836020870137939093016020019392505050565b8981526001600160a01b0389811660208301528816604082015260c060608201819052600090612149908301888a61209b565b828103608084015261215c8187896120e4565b905082810360a08401526121718185876120e4565b9c9b505050505050505050505050565b60608152600061219560608301888a61209b565b82810360208401526121a88187896120e4565b905082810360408401526121bd8185876120e4565b9998505050505050505050565b600080600080600060a086880312156121e257600080fd5b85356121ed816118f5565b945060208601356121fd816118f5565b9350604086013561220d816118f5565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052600160045260246000fd5b60008060008060008060c0878903121561225457600080fd5b86359550602080880135612267816118f5565b95506040880135612277816118f5565b945060608801356001600160401b038082111561229357600080fd5b818a0191508a601f8301126122a757600080fd5b81356122b5611b2382611adf565b81815260059190911b8301840190848101908d8311156122d457600080fd5b938501935b828510156122fb5784356122ec816118f5565b825293850193908501906122d9565b9750505060808a013592508083111561231357600080fd5b61231f8b848c01611b02565b945060a08a013592508083111561233557600080fd5b505061234389828a01611b02565b9150509295509295509295565b600081518084526020808501945080840160005b838110156120d957815187529582019590820190600101612364565b606080825284519082018190526000906020906080840190828801845b828110156123c25781516001600160a01b03168452928401929084019060010161239d565b505050838103828501526123d68187612350565b91505082810360408401526123eb8185612350565b9695505050505050565b60008251612407818460208701611f31565b9190910192915050565b60006020828403121561242357600080fd5b505191905056fe526f6f744d696e7461626c65455243313135355072656469636174653a20494ea26469706673582212207cc4d2e1fa811483449e50a585f2819503c945760fb6c93dc493fe7ad5264ad364736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` var SystemArtifact string = `{"_format":"hh-sol-artifact-1","contractName":"System","sourceName":"contracts/child/System.sol","abi":[{"inputs":[],"name":"ALLOWLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKLIST_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TOKEN_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_TRANSFER_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"READ_ADDRESSLIST_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_PKCHECK_PRECOMPILE_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b5061015a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c806355b01e4d1161006657806355b01e4d146100e35780635ea5df79146100f1578063947287cf1461010857806397e5230d14610111578063e0563ab11461011b57600080fd5b806307b3e25214610098578063284017f5146100c35780633b878c22146100cc57806351351d53146100d5575b600080fd5b6100a66004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a661202081565b6100a661101081565b6100a66002600160a01b0381565b6100a66004600160991b0181565b6100fa61138881565b6040519081526020016100ba565b6100fa61520881565b6100fa620249f081565b6100a66120308156fea2646970667358221220cdc81f82626224fb8a04246ca1d1898f8b03c160e9b2f63cd0bc4b5d0b55c3f964736f6c63430008130033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100935760003560e01c806355b01e4d1161006657806355b01e4d146100e35780635ea5df79146100f1578063947287cf1461010857806397e5230d14610111578063e0563ab11461011b57600080fd5b806307b3e25214610098578063284017f5146100c35780633b878c22146100cc57806351351d53146100d5575b600080fd5b6100a66004600360981b0181565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a661202081565b6100a661101081565b6100a66002600160a01b0381565b6100a66004600160991b0181565b6100fa61138881565b6040519081526020016100ba565b6100fa61520881565b6100fa620249f081565b6100a66120308156fea2646970667358221220cdc81f82626224fb8a04246ca1d1898f8b03c160e9b2f63cd0bc4b5d0b55c3f964736f6c63430008130033","linkReferences":{},"deployedLinkReferences":{}}` diff --git a/state/runtime/precompiled/precompiled.go b/state/runtime/precompiled/precompiled.go index a309113df6..8b33d5eb80 100644 --- a/state/runtime/precompiled/precompiled.go +++ b/state/runtime/precompiled/precompiled.go @@ -74,7 +74,7 @@ func (p *Precompiled) setupContracts() { p.register(contracts.NativeTransferPrecompile.String(), &nativeTransfer{}) // Console precompile - p.register(contracts.ConsolePrecompile.String(), &console{}) + // p.register(contracts.ConsolePrecompile.String(), &console{}) // BLS aggregated signatures verification precompile p.register(contracts.BLSAggSigsVerificationPrecompile.String(), &blsAggSignsVerification{}) From b1687df4946cca1762fdf521173c69715d0f7b4f Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Thu, 12 Oct 2023 10:40:26 +0200 Subject: [PATCH 13/27] remove flag --- command/genesis/params.go | 10 ---- command/helper/helper.go | 2 - command/server/config/config.go | 26 ++++------ command/server/init.go | 4 -- command/server/params.go | 9 ++-- command/server/server.go | 7 --- e2e-polybft/e2e/bridge_test.go | 72 --------------------------- e2e-polybft/framework/test-cluster.go | 15 +----- e2e-polybft/framework/test-server.go | 28 ++++------- server/config.go | 5 +- 10 files changed, 27 insertions(+), 151 deletions(-) diff --git a/command/genesis/params.go b/command/genesis/params.go index 1e202827fa..379c3eae17 100644 --- a/command/genesis/params.go +++ b/command/genesis/params.go @@ -534,16 +534,6 @@ func (p *genesisParams) validatePremineInfo() error { return errReserveAccMustBePremined } -// validateBlockTrackerPollInterval validates block tracker block interval -// which can not be 0 -func (p *genesisParams) validateBlockTrackerPollInterval() error { - if p.blockTrackerPollInterval == 0 { - return helper.ErrBlockTrackerPollInterval - } - - return nil -} - // validateBurnContract validates burn contract. If native token is mintable, // burn contract flag must not be set. If native token is non mintable only one burn contract // can be set and the specified address will be used to predeploy default EIP1559 burn contract. diff --git a/command/helper/helper.go b/command/helper/helper.go index b934dbd2d4..e4be18ce8f 100644 --- a/command/helper/helper.go +++ b/command/helper/helper.go @@ -23,8 +23,6 @@ import ( "google.golang.org/grpc/credentials/insecure" ) -var ErrBlockTrackerPollInterval = errors.New("block tracker poll interval must be greater than 0") - type ClientCloseResult struct { Message string `json:"message"` } diff --git a/command/server/config/config.go b/command/server/config/config.go index 072184c0eb..93b372bbf3 100644 --- a/command/server/config/config.go +++ b/command/server/config/config.go @@ -32,9 +32,8 @@ type Config struct { JSONLogFormat bool `json:"json_log_format" yaml:"json_log_format"` CorsAllowedOrigins []string `json:"cors_allowed_origins" yaml:"cors_allowed_origins"` - Relayer bool `json:"relayer" yaml:"relayer"` - NumBlockConfirmations uint64 `json:"num_block_confirmations" yaml:"num_block_confirmations"` - RelayerTrackerPollInterval time.Duration `json:"relayer_tracker_poll_interval" yaml:"relayer_tracker_poll_interval"` + Relayer bool `json:"relayer" yaml:"relayer"` + NumBlockConfirmations uint64 `json:"num_block_confirmations" yaml:"num_block_confirmations"` ConcurrentRequestsDebug uint64 `json:"concurrent_requests_debug" yaml:"concurrent_requests_debug"` WebSocketReadLimit uint64 `json:"web_socket_read_limit" yaml:"web_socket_read_limit"` @@ -94,10 +93,6 @@ const ( // the connection sends a close message to the peer and returns ErrReadLimit to the application. DefaultWebSocketReadLimit uint64 = 8192 - // DefaultRelayerTrackerPollInterval specifies time interval after which relayer node's event tracker - // polls child chain to get the latest block - DefaultRelayerTrackerPollInterval time.Duration = time.Second - // DefaultMetricsInterval specifies the time interval after which Prometheus metrics will be generated. // A value of 0 means the metrics are disabled. DefaultMetricsInterval time.Duration = time.Second * 8 @@ -132,15 +127,14 @@ func DefaultConfig() *Config { Headers: &Headers{ AccessControlAllowOrigins: []string{"*"}, }, - LogFilePath: "", - JSONRPCBatchRequestLimit: DefaultJSONRPCBatchRequestLimit, - JSONRPCBlockRangeLimit: DefaultJSONRPCBlockRangeLimit, - Relayer: false, - NumBlockConfirmations: DefaultNumBlockConfirmations, - ConcurrentRequestsDebug: DefaultConcurrentRequestsDebug, - WebSocketReadLimit: DefaultWebSocketReadLimit, - RelayerTrackerPollInterval: DefaultRelayerTrackerPollInterval, - MetricsInterval: DefaultMetricsInterval, + LogFilePath: "", + JSONRPCBatchRequestLimit: DefaultJSONRPCBatchRequestLimit, + JSONRPCBlockRangeLimit: DefaultJSONRPCBlockRangeLimit, + Relayer: false, + NumBlockConfirmations: DefaultNumBlockConfirmations, + ConcurrentRequestsDebug: DefaultConcurrentRequestsDebug, + WebSocketReadLimit: DefaultWebSocketReadLimit, + MetricsInterval: DefaultMetricsInterval, } } diff --git a/command/server/init.go b/command/server/init.go index 996a664477..216c4e28c1 100644 --- a/command/server/init.go +++ b/command/server/init.go @@ -58,10 +58,6 @@ func (p *serverParams) initRawParams() error { p.relayer = p.rawConfig.Relayer - if p.relayer && p.rawConfig.RelayerTrackerPollInterval == 0 { - return helper.ErrBlockTrackerPollInterval - } - return p.initAddresses() } diff --git a/command/server/params.go b/command/server/params.go index 43f39f76f5..da48b929e9 100644 --- a/command/server/params.go +++ b/command/server/params.go @@ -43,8 +43,6 @@ const ( concurrentRequestsDebugFlag = "concurrent-requests-debug" webSocketReadLimitFlag = "websocket-read-limit" - relayerTrackerPollIntervalFlag = "relayer-poll-interval" - metricsIntervalFlag = "metrics-interval" ) @@ -187,9 +185,8 @@ func (p *serverParams) generateConfig() *server.Config { JSONLogFormat: p.rawConfig.JSONLogFormat, LogFilePath: p.logFileLocation, - Relayer: p.relayer, - NumBlockConfirmations: p.rawConfig.NumBlockConfirmations, - RelayerTrackerPollInterval: p.rawConfig.RelayerTrackerPollInterval, - MetricsInterval: p.rawConfig.MetricsInterval, + Relayer: p.relayer, + NumBlockConfirmations: p.rawConfig.NumBlockConfirmations, + MetricsInterval: p.rawConfig.MetricsInterval, } } diff --git a/command/server/server.go b/command/server/server.go index aa64d2b248..f9c4ab4c6c 100644 --- a/command/server/server.go +++ b/command/server/server.go @@ -235,13 +235,6 @@ func setFlags(cmd *cobra.Command) { "maximum size in bytes for a message read from the peer by websocket", ) - cmd.Flags().DurationVar( - ¶ms.rawConfig.RelayerTrackerPollInterval, - relayerTrackerPollIntervalFlag, - defaultConfig.RelayerTrackerPollInterval, - "interval (number of seconds) at which relayer's tracker polls for latest block at childchain", - ) - cmd.Flags().DurationVar( ¶ms.rawConfig.MetricsInterval, metricsIntervalFlag, diff --git a/e2e-polybft/e2e/bridge_test.go b/e2e-polybft/e2e/bridge_test.go index 4a321b21ea..3750496058 100644 --- a/e2e-polybft/e2e/bridge_test.go +++ b/e2e-polybft/e2e/bridge_test.go @@ -1531,75 +1531,3 @@ func TestE2E_Bridge_Transfers_AccessLists(t *testing.T) { } }) } - -func TestE2E_Bridge_Transfers_WithBlockTrackerPollInterval(t *testing.T) { - var ( - numBlockConfirmations = uint64(2) - epochSize = 30 - sprintSize = uint64(5) - rootPollInterval = 5 * time.Second - relayerPollInterval = 5 * time.Second - numberOfAttempts = uint64(4) - stateSyncedLogsCount = 1 - ) - - cluster := framework.NewTestCluster(t, 5, - framework.WithEpochSize(epochSize), - framework.WithNumBlockConfirmations(numBlockConfirmations), - framework.WithRootTrackerPollInterval(rootPollInterval), - framework.WithRelayerTrackerPollInterval(relayerPollInterval), - ) - defer cluster.Stop() - - cluster.WaitForReady(t) - - polybftCfg, err := polybft.LoadPolyBFTConfig(path.Join(cluster.Config.TmpDir, chainConfigFileName)) - require.NoError(t, err) - - validatorSrv := cluster.Servers[0] - senderAccount, err := sidechain.GetAccountFromDir(validatorSrv.DataDir()) - require.NoError(t, err) - - childEthEndpoint := validatorSrv.JSONRPC().Eth() - - // bridge some tokens for first validator to child chain - tokensToDeposit := ethgo.Ether(10) - - require.NoError(t, cluster.Bridge.Deposit( - common.ERC20, - polybftCfg.Bridge.RootNativeERC20Addr, - polybftCfg.Bridge.RootERC20PredicateAddr, - rootHelper.TestAccountPrivKey, - senderAccount.Address().String(), - tokensToDeposit.String(), - "", - cluster.Bridge.JSONRPCAddr(), - rootHelper.TestAccountPrivKey, - false), - ) - - // wait for a couple of sprints - finalBlockNum := 5 * sprintSize - - // the transaction is processed and there should be a success event - var stateSyncedResult contractsapi.StateSyncResultEvent - - for i := uint64(0); i < numberOfAttempts; i++ { - logs, err := getFilteredLogs(stateSyncedResult.Sig(), 0, finalBlockNum+i*sprintSize, childEthEndpoint) - require.NoError(t, err) - - if len(logs) == stateSyncedLogsCount || i == numberOfAttempts-1 { - // assert that all deposits are executed successfully - checkStateSyncResultLogs(t, logs, stateSyncedLogsCount) - - break - } - - require.NoError(t, cluster.WaitForBlock(finalBlockNum+(i+1)*sprintSize, 2*time.Minute)) - } - - // check validator balance got increased by deposited amount - balance, err := childEthEndpoint.GetBalance(ethgo.Address(senderAccount.Address()), ethgo.Latest) - require.NoError(t, err) - require.Equal(t, tokensToDeposit, balance) -} diff --git a/e2e-polybft/framework/test-cluster.go b/e2e-polybft/framework/test-cluster.go index cce2586b18..77b583e573 100644 --- a/e2e-polybft/framework/test-cluster.go +++ b/e2e-polybft/framework/test-cluster.go @@ -131,8 +131,7 @@ type TestClusterConfig struct { IsPropertyTest bool TestRewardToken string - RootTrackerPollInterval time.Duration - RelayerTrackerPollInterval time.Duration + RootTrackerPollInterval time.Duration ProxyContractsAdmin string @@ -393,12 +392,6 @@ func WithRootTrackerPollInterval(pollInterval time.Duration) ClusterOption { } } -func WithRelayerTrackerPollInterval(pollInterval time.Duration) ClusterOption { - return func(h *TestClusterConfig) { - h.RelayerTrackerPollInterval = pollInterval - } -} - func WithProxyContractsAdmin(address string) ClusterOption { return func(h *TestClusterConfig) { h.ProxyContractsAdmin = address @@ -506,11 +499,6 @@ func NewTestCluster(t *testing.T, validatorsCount int, opts ...ClusterOption) *T cluster.Config.BlockTime.String()) } - if cluster.Config.RelayerTrackerPollInterval != 0 { - args = append(args, "--block-tracker-poll-interval", - cluster.Config.RelayerTrackerPollInterval.String()) - } - if cluster.Config.TestRewardToken != "" { args = append(args, "--reward-token-code", cluster.Config.TestRewardToken) } @@ -695,7 +683,6 @@ func (c *TestCluster) InitTestServer(t *testing.T, config.Relayer = nodeType.IsSet(Relayer) config.NumBlockConfirmations = c.Config.NumBlockConfirmations config.BridgeJSONRPC = bridgeJSONRPC - config.RelayerTrackerPollInterval = c.Config.RelayerTrackerPollInterval }) // watch the server for stop signals. It is important to fix the specific diff --git a/e2e-polybft/framework/test-server.go b/e2e-polybft/framework/test-server.go index ff4950938e..471759151e 100644 --- a/e2e-polybft/framework/test-server.go +++ b/e2e-polybft/framework/test-server.go @@ -27,18 +27,17 @@ import ( ) type TestServerConfig struct { - Name string - JSONRPCPort int64 - GRPCPort int64 - P2PPort int64 - Validator bool - DataDir string - Chain string - LogLevel string - Relayer bool - NumBlockConfirmations uint64 - BridgeJSONRPC string - RelayerTrackerPollInterval time.Duration + Name string + JSONRPCPort int64 + GRPCPort int64 + P2PPort int64 + Validator bool + DataDir string + Chain string + LogLevel string + Relayer bool + NumBlockConfirmations uint64 + BridgeJSONRPC string } type TestServerConfigCallback func(*TestServerConfig) @@ -175,11 +174,6 @@ func (t *TestServer) Start() { if config.Relayer { args = append(args, "--relayer") - - if config.RelayerTrackerPollInterval != 0 { - // only relayer node should have this setup if - args = append(args, "--relayer-poll-interval", config.RelayerTrackerPollInterval.String()) - } } // Start the server diff --git a/server/config.go b/server/config.go index ff725973b0..63240f6ddf 100644 --- a/server/config.go +++ b/server/config.go @@ -44,9 +44,8 @@ type Config struct { Relayer bool - NumBlockConfirmations uint64 - RelayerTrackerPollInterval time.Duration - MetricsInterval time.Duration + NumBlockConfirmations uint64 + MetricsInterval time.Duration } // Telemetry holds the config details for metric services From 496507008f5e184e81c3c673265cb3c25a927923 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Thu, 12 Oct 2023 16:59:18 +0200 Subject: [PATCH 14/27] refactor - tx confirmation --- consensus/polybft/state_store_state_sync.go | 75 ++++----- .../polybft/state_store_state_sync_test.go | 10 +- consensus/polybft/state_sync_manager.go | 1 - consensus/polybft/state_sync_manager_test.go | 44 ----- consensus/polybft/state_sync_relayer.go | 156 +++++++++--------- consensus/polybft/state_sync_relayer_test.go | 10 +- 6 files changed, 120 insertions(+), 176 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index 30735c0c5d..761435215a 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -97,28 +97,6 @@ func (s *StateSyncStore) insertStateSyncEvent(event *contractsapi.StateSyncedEve }) } -// removeStateSyncEventsAndProofs removes state sync events and their proofs from the buckets in db -func (s *StateSyncStore) removeStateSyncEventsAndProofs(stateSyncEventIDs []uint64) error { - return s.db.Update(func(tx *bolt.Tx) error { - eventsBucket := tx.Bucket(stateSyncEventsBucket) - proofsBucket := tx.Bucket(stateSyncProofsBucket) - - for _, stateSyncEventID := range stateSyncEventIDs { - stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) - - if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) - } - - if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) - } - } - - return nil - }) -} - // list iterates through all events in events bucket in db, un-marshals them, and returns as array func (s *StateSyncStore) list() ([]*contractsapi.StateSyncedEvent, error) { events := []*contractsapi.StateSyncedEvent{} @@ -387,21 +365,43 @@ func (s *StateSyncStore) getStateSyncProof(stateSyncID uint64) (*StateSyncProof, return ssp, err } -// insertStateSyncRelayerStateData inserts the state data for state sync relayer together with new events -func (s *StateSyncStore) insertStateSyncRelayerStateData( +// updateStateSyncRelayerStateData inserts the state data for state sync relayer together with new events and +// deletion of processed events +func (s *StateSyncStore) updateStateSyncRelayerStateData( data *StateSyncRelayerStateData, - newEvents []*StateSyncRelayerEventData) error { + newEvents []*StateSyncRelayerEventData, + deletedEventIds []uint64) error { return s.db.Update(func(tx *bolt.Tx) error { + relayerEventsBucket := tx.Bucket(stateSyncRelayerEventsBucket) + eventsBucket := tx.Bucket(stateSyncEventsBucket) + proofsBucket := tx.Bucket(stateSyncProofsBucket) + for _, evnt := range newEvents { raw, err := json.Marshal(evnt) if err != nil { - return err + return fmt.Errorf("failed to add state sync relayer event (ID=%d): %w", evnt.EventID, err) } key := common.EncodeUint64ToBytes(evnt.EventID) - if err := tx.Bucket(stateSyncRelayerEventsBucket).Put(key, raw); err != nil { - return err + if err := relayerEventsBucket.Put(key, raw); err != nil { + return fmt.Errorf("failed to add state sync relayer event (ID=%d): %w", evnt.EventID, err) + } + } + + for _, stateSyncEventID := range deletedEventIds { + stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) + + if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) + } + + if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) + } + + if err := relayerEventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync relayer event (ID=%d): %w", stateSyncEventID, err) } } @@ -455,22 +455,17 @@ func (s *StateSyncStore) updateStateSyncRelayerEvent(evnt *StateSyncRelayerEvent } // getAllAvailableEvents retrieves all StateSyncRelayerEventData that should be sent as a transactions -func (s *StateSyncStore) getAllAvailableEvents() (result []*StateSyncRelayerEventData, err error) { +func (s *StateSyncStore) getNextEvent() (event *StateSyncRelayerEventData, err error) { if err = s.db.View(func(tx *bolt.Tx) error { - return tx.Bucket(stateSyncRelayerEventsBucket).ForEach(func(k, v []byte) error { - var event *StateSyncRelayerEventData - - if err := json.Unmarshal(v, &event); err != nil { - return err - } - - result = append(result, event) - + k, v := tx.Bucket(stateSyncRelayerEventsBucket).Cursor().First() + if k == nil { return nil - }) + } + + return json.Unmarshal(v, &event) }); err != nil { return nil, err } - return result, nil + return event, nil } diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 8343a89b6f..1caaaed800 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -310,7 +310,7 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { assert.Nil(t, ssrStateData) // insert - require.NoError(t, state.StateSyncStore.insertStateSyncRelayerStateData( + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerStateData( &StateSyncRelayerStateData{ LastBlockNumber: 100, }, @@ -319,6 +319,7 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { {EventID: 4}, {EventID: 7, SentStatus: true, BlockNumber: 100}, }, + []uint64{}, )) // get after insert @@ -328,11 +329,8 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { assert.Equal(t, uint64(100), ssrStateData.LastBlockNumber) // get available events - events, err := state.StateSyncStore.getAllAvailableEvents() + event, err := state.StateSyncStore.getNextEvent() require.NoError(t, err) - require.Len(t, events, 3) - require.Equal(t, uint64(2), events[0].EventID) - require.Equal(t, uint64(4), events[1].EventID) - require.Equal(t, uint64(7), events[2].EventID) + require.Equal(t, uint64(2), event.EventID) } diff --git a/consensus/polybft/state_sync_manager.go b/consensus/polybft/state_sync_manager.go index d29680a4f4..5e10fa3de1 100644 --- a/consensus/polybft/state_sync_manager.go +++ b/consensus/polybft/state_sync_manager.go @@ -16,7 +16,6 @@ import ( bls "github.com/0xPolygon/polygon-edge/consensus/polybft/signer" "github.com/0xPolygon/polygon-edge/consensus/polybft/validator" "github.com/0xPolygon/polygon-edge/consensus/polybft/wallet" - "github.com/0xPolygon/polygon-edge/contracts" "github.com/0xPolygon/polygon-edge/tracker" "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" diff --git a/consensus/polybft/state_sync_manager_test.go b/consensus/polybft/state_sync_manager_test.go index 4748f074ac..cea28419fd 100644 --- a/consensus/polybft/state_sync_manager_test.go +++ b/consensus/polybft/state_sync_manager_test.go @@ -326,50 +326,6 @@ func TestStateSyncerManager_BuildProofs(t *testing.T) { } } -func TestStateSyncerManager_RemoveProcessedEventsAndProofs(t *testing.T) { - const stateSyncEventsCount = 5 - - vals := validator.NewTestValidators(t, 5) - - s := newTestStateSyncManager(t, vals.GetValidator("0"), &mockRuntime{isActiveValidator: true}) - stateSyncEvents := generateStateSyncEvents(t, stateSyncEventsCount, 0) - - for _, event := range stateSyncEvents { - require.NoError(t, s.state.StateSyncStore.insertStateSyncEvent(event)) - } - - require.NoError(t, s.buildProofs(&contractsapi.StateSyncCommitment{ - StartID: stateSyncEvents[0].ID, - EndID: stateSyncEvents[len(stateSyncEvents)-1].ID, - }, nil)) - - stateSyncEventsBefore, err := s.state.StateSyncStore.list() - require.NoError(t, err) - require.Equal(t, stateSyncEventsCount, len(stateSyncEventsBefore)) - - for _, event := range stateSyncEvents { - proof, err := s.state.StateSyncStore.getStateSyncProof(event.ID.Uint64()) - require.NoError(t, err) - require.NotNil(t, proof) - } - - for _, event := range stateSyncEvents { - eventLog := createTestLogForStateSyncResultEvent(t, event.ID.Uint64()) - require.NoError(t, s.ProcessLog(&types.Header{Number: 10}, convertLog(eventLog), nil)) - } - - // all state sync events and their proofs should be removed from the store - stateSyncEventsAfter, err := s.state.StateSyncStore.list() - require.NoError(t, err) - require.Equal(t, 0, len(stateSyncEventsAfter)) - - for _, event := range stateSyncEvents { - proof, err := s.state.StateSyncStore.getStateSyncProof(event.ID.Uint64()) - require.NoError(t, err) - require.Nil(t, proof) - } -} - func TestStateSyncerManager_AddLog_BuildCommitments(t *testing.T) { t.Parallel() diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 37a696342e..25759cf6fe 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -9,7 +9,6 @@ import ( "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" "github.com/0xPolygon/polygon-edge/contracts" - "github.com/0xPolygon/polygon-edge/state/runtime" "github.com/0xPolygon/polygon-edge/txrelayer" "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" @@ -17,13 +16,14 @@ import ( ) const ( + // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try again to send transaction + maxBlocksToWaitForResend = uint64(30) // maxAttemptsToSend specifies how many sending retries for one transaction maxAttemptsToSend = 6 ) var ( - errFailedToExecuteStateSync = errors.New("failed to execute state sync") - errAlreadyProcessedStateSync = errors.New("StateReceiver: STATE_SYNC_IS_PROCESSED") + errFailedToExecuteStateSync = errors.New("failed to execute state sync") ) // StateSyncRelayer is an interface that defines functions for state sync relayer @@ -65,16 +65,20 @@ type StateSyncRelayerEventData struct { } type stateSyncRelayerImpl struct { - txRelayer txrelayer.TxRelayer - key ethgo.Key - store stateSyncProofRetriever - state *State - eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] - logger hclog.Logger - blockchain blockchainBackend + txRelayer txrelayer.TxRelayer + key ethgo.Key + store stateSyncProofRetriever + state *State + logger hclog.Logger + blockchain blockchainBackend notifyCh chan struct{} closeCh chan struct{} + + // eventsGetter gets contractsapi.NewCommitmentEvent from blocks + eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] + // eventsGetter gets StateSyncResult events (missed or current) from blocks + eventsGetterResults *eventsGetter[*contractsapi.StateSyncResultEvent] } func NewStateSyncRelayer( @@ -107,6 +111,18 @@ func NewStateSyncRelayer( return &commitEvent, doesMatch, err }, }, + eventsGetterResults: &eventsGetter[*contractsapi.StateSyncResultEvent]{ + blockchain: blockchain, + isValidLogFn: func(l *types.Log) bool { + return l.Address == contracts.StateReceiverContract + }, + parseEventFn: func(h *types.Header, l *ethgo.Log) (*contractsapi.StateSyncResultEvent, bool, error) { + var stateSyncResultEvent contractsapi.StateSyncResultEvent + matches, err := stateSyncResultEvent.ParseLog(l) + + return &stateSyncResultEvent, matches, err + }, + }, logger: logger, } } @@ -119,7 +135,11 @@ func (ssr *stateSyncRelayerImpl) Init() error { case <-ssr.closeCh: return case <-ssr.notifyCh: - ssr.processBatch() + if ed, err := ssr.processEvent(); err != nil { + ssr.logger.Error("failed to process event", "event", ed.EventID, "err", err) + } else if ed != nil { + ssr.logger.Info("event has been successfully sent", "event", ed.EventID) + } } } }() @@ -142,6 +162,24 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { state = &StateSyncRelayerStateData{LastBlockNumber: 0} } + resultEvents, err := ssr.eventsGetterResults.getFromBlocks(state.LastBlockNumber, req.FullBlock) + if err != nil { + return fmt.Errorf("failed to retrieve processed state sync result events from block: %w", err) + } + + processedStateSyncEventIDs := make([]uint64, 0, len(resultEvents)) + failedStateSyncEventIDs := make([]uint64, 0, len(resultEvents)) + failedReasons := make([]string, 0, len(resultEvents)) + + for _, event := range resultEvents { + if event.Status { + processedStateSyncEventIDs = append(processedStateSyncEventIDs, event.Counter.Uint64()) + } else { + failedStateSyncEventIDs = append(failedStateSyncEventIDs, event.Counter.Uint64()) + failedReasons = append(failedReasons, string(event.Message)) + } + } + events, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) if err != nil { return fmt.Errorf("state sync relayer: %w", err) @@ -149,11 +187,16 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { state.LastBlockNumber = req.FullBlock.Block.Number() - if err = ssr.state.StateSyncStore.insertStateSyncRelayerStateData(state, getConvertedEvents(events)); err != nil { + if err = ssr.state.StateSyncStore.updateStateSyncRelayerStateData( + state, + getConvertedEvents(events), processedStateSyncEventIDs); err != nil { return fmt.Errorf("state sync relayer insert state failed: %w", err) } - ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber) + // maybe change state of failed events to Sent=false + ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber, + "processed", processedStateSyncEventIDs, + "failed", failedStateSyncEventIDs, "reasons", failedReasons) select { case ssr.notifyCh <- struct{}{}: @@ -163,60 +206,45 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { return nil } -func (ssr *stateSyncRelayerImpl) processBatch() { - events, err := ssr.state.StateSyncStore.getAllAvailableEvents() +func (ssr *stateSyncRelayerImpl) processEvent() (*StateSyncRelayerEventData, error) { + eventData, err := ssr.state.StateSyncStore.getNextEvent() if err != nil { - ssr.logger.Error("error while reading available events", "err", err) + return eventData, err + } else if eventData == nil { + return nil, nil // nothing to process right now + } else if eventData.SentStatus && + eventData.BlockNumber+maxBlocksToWaitForResend > ssr.blockchain.CurrentHeader().Number { + return nil, nil // nothing to process right now, still waiting for confirmation + } else if eventData.CountTries+1 > maxAttemptsToSend { + _ = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) - return - } + ssr.logger.Info("failed to send event too many times", "eventID", eventData.EventID) - for _, eventData := range events { - if err := ssr.processEvent(eventData); err != nil { - ssr.logger.Error("error while processing event", "err", err) - } + return ssr.processEvent() // process next } -} -func (ssr *stateSyncRelayerImpl) processEvent(eventData *StateSyncRelayerEventData) error { ssr.logger.Info("state sync relayer processing event", "eventID", eventData.EventID) - eventData.CountTries++ - - if eventData.CountTries > maxAttemptsToSend { - _ = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) - - return fmt.Errorf("failed to send event too many times: %d", eventData.EventID) - } - - tx, err := ssr.createTx(eventData.EventID) + txn, err := ssr.createTx(eventData.EventID) if err != nil { _ = ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData) - return fmt.Errorf("failed to create tx: %d, %w", eventData.EventID, err) + return eventData, fmt.Errorf("failed to create tx: %w", err) } + eventData.CountTries++ eventData.BlockNumber = ssr.blockchain.CurrentHeader().Number eventData.SentStatus = true if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { - return fmt.Errorf("failed to move to sent: %d, %w", eventData.EventID, err) + return eventData, fmt.Errorf("failed to move to sent: %w", err) } - // it is successful if there is no error or if it was successful first time we sent it but db update failed - if err := ssr.sendTx(tx, eventData.EventID); err == nil || errors.Is(err, errAlreadyProcessedStateSync) { - ssr.logger.Info("state sync relayer has successfully sent the event", "eventID", eventData.EventID) + ssr.logger.Info("state sync relayer sending event", "eventID", eventData.EventID) - if err := ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID); err != nil { - ssr.logger.Error("failed to update store", "eventID", eventData.EventID, "err", err) - } - } else { - // do not update database on error (change SentStatus for example) - // event sending will be retried eventually after maxBlocksToWaitForResend blocks - ssr.logger.Error("failed to execute tx", "eventID", eventData.EventID, "err", err) - } + _, err = ssr.txRelayer.SendTransaction(txn, ssr.key) - return nil + return eventData, err } func (ssr *stateSyncRelayerImpl) createTx(eventID uint64) (*ethgo.Transaction, error) { @@ -257,38 +285,6 @@ func (ssr *stateSyncRelayerImpl) createTx(eventID uint64) (*ethgo.Transaction, e }, nil } -func (ssr *stateSyncRelayerImpl) sendTx(txn *ethgo.Transaction, eventID uint64) error { - ssr.logger.Info("state sync relayer sending event", "eventID", eventID) - - receipt, err := ssr.txRelayer.SendTransaction(txn, ssr.key) - if err != nil { - return err - } - - if receipt.Status == uint64(types.ReceiptFailed) { - return runtime.ErrExecutionReverted - } - - var stateSyncResult contractsapi.StateSyncResultEvent - for _, log := range receipt.Logs { - matches, err := stateSyncResult.ParseLog(log) - if err != nil { - return err - } - - if !matches { - continue - } - - if !stateSyncResult.Status { - return fmt.Errorf("Error: %w, Message: %s", errFailedToExecuteStateSync, - string(stateSyncResult.Message)) - } - } - - return nil -} - func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.TxRelayer, error) { if rpcEndpoint == "" || strings.Contains(rpcEndpoint, "0.0.0.0") { _, port, err := net.SplitHostPort(rpcEndpoint) @@ -300,7 +296,7 @@ func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.T } return txrelayer.NewTxRelayer( - txrelayer.WithIPAddress(rpcEndpoint), + txrelayer.WithIPAddress(rpcEndpoint), txrelayer.WithNumRetries(-1), txrelayer.WithWriter(logger.StandardWriter(&hclog.StandardLoggerOptions{}))) } diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 681311c044..fea69e9f91 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -88,12 +88,12 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { blockhainMock.On("CurrentHeader").Return(&types.Header{ Hash: block1Hash, Number: 1, - }) + }).Maybe() // post block 2, last state sync fails blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{ Hash: block1Hash, - }).Once() - blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receiptsBlock1, nil).Once() + }).Twice() + blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receiptsBlock1, nil).Twice() // fail on stateSyncID == 6 -> last one in first try dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(5) @@ -154,10 +154,10 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { require.NoError(t, err) require.Equal(t, uint64(3), ssrStateData.LastBlockNumber) - events, err := state.StateSyncStore.getAllAvailableEvents() + event, err := state.StateSyncStore.getNextEvent() require.NoError(t, err) - require.Len(t, events, 0) + require.Nil(t, event) } type mockStateSyncProofRetriever struct { From 3fc1cea0b0c32ba0495ef2c3915a13b2ce0dfd7e Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Fri, 13 Oct 2023 13:29:57 +0200 Subject: [PATCH 15/27] changes... --- consensus/polybft/consensus_runtime.go | 1 + consensus/polybft/state_store_state_sync.go | 31 +++- .../polybft/state_store_state_sync_test.go | 59 ++++++- consensus/polybft/state_sync_relayer.go | 157 ++++++++++------- consensus/polybft/state_sync_relayer_test.go | 160 +++++++++++------- 5 files changed, 269 insertions(+), 139 deletions(-) diff --git a/consensus/polybft/consensus_runtime.go b/consensus/polybft/consensus_runtime.go index 4a194ea1ec..15be6f41cf 100644 --- a/consensus/polybft/consensus_runtime.go +++ b/consensus/polybft/consensus_runtime.go @@ -265,6 +265,7 @@ func (c *consensusRuntime) initStateSyncRelayer(logger hcf.Logger) error { c, c.config.blockchain, wallet.NewEcdsaSigner(c.config.Key), + nil, logger.Named("state_sync_relayer")) } else { c.stateSyncRelayer = &dummyStakeSyncRelayer{} diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index 761435215a..3dde7335f8 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -436,6 +436,14 @@ func (s *StateSyncStore) removeStateSyncRelayerEvent(eventID uint64) error { return s.db.Update(func(tx *bolt.Tx) error { key := common.EncodeUint64ToBytes(eventID) + if err := tx.Bucket(stateSyncEventsBucket).Delete(key); err != nil { + return fmt.Errorf("failed to remove state sync event (ID=%d): %w", eventID, err) + } + + if err := tx.Bucket(stateSyncProofsBucket).Delete(key); err != nil { + return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", eventID, err) + } + return tx.Bucket(stateSyncRelayerEventsBucket).Delete(key) }) } @@ -455,17 +463,28 @@ func (s *StateSyncStore) updateStateSyncRelayerEvent(evnt *StateSyncRelayerEvent } // getAllAvailableEvents retrieves all StateSyncRelayerEventData that should be sent as a transactions -func (s *StateSyncStore) getNextEvent() (event *StateSyncRelayerEventData, err error) { +func (s *StateSyncStore) getAllAvailableEvents(limit int) (result []*StateSyncRelayerEventData, err error) { if err = s.db.View(func(tx *bolt.Tx) error { - k, v := tx.Bucket(stateSyncRelayerEventsBucket).Cursor().First() - if k == nil { - return nil + cursor := tx.Bucket(stateSyncRelayerEventsBucket).Cursor() + + for k, v := cursor.First(); k != nil; k, v = cursor.Next() { + var event *StateSyncRelayerEventData + + if err := json.Unmarshal(v, &event); err != nil { + return err + } + + result = append(result, event) + + if limit > 0 && len(result) >= limit { + break + } } - return json.Unmarshal(v, &event) + return nil }); err != nil { return nil, err } - return event, nil + return result, nil } diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 1caaaed800..561c206aa7 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -298,18 +298,18 @@ func createTestStateSync(index int64) *contractsapi.StateSyncedEvent { } } -func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { +func TestState_StateSync_StateSyncRelayerDataAndEvents(t *testing.T) { t.Parallel() state := newTestState(t) - // get before insert - should return initialized values + // get before update ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() require.NoError(t, err) assert.Nil(t, ssrStateData) - // insert + // update require.NoError(t, state.StateSyncStore.updateStateSyncRelayerStateData( &StateSyncRelayerStateData{ LastBlockNumber: 100, @@ -322,15 +322,62 @@ func TestState_StateSync_StateSyncRelayerStateData(t *testing.T) { []uint64{}, )) - // get after insert + // get after update ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() require.NoError(t, err) assert.Equal(t, uint64(100), ssrStateData.LastBlockNumber) // get available events - event, err := state.StateSyncStore.getNextEvent() + events, err := state.StateSyncStore.getAllAvailableEvents(0) require.NoError(t, err) - require.Equal(t, uint64(2), event.EventID) + require.Len(t, events, 3) + require.Equal(t, uint64(2), events[0].EventID) + require.Equal(t, uint64(4), events[1].EventID) + require.Equal(t, uint64(7), events[2].EventID) + + // update again + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerStateData( + &StateSyncRelayerStateData{ + LastBlockNumber: 200, + }, + []*StateSyncRelayerEventData{ + {EventID: 10}, + {EventID: 12}, + {EventID: 11}, + }, + []uint64{4, 7}, + )) + + // get after update + ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() + + require.NoError(t, err) + assert.Equal(t, uint64(200), ssrStateData.LastBlockNumber) + + // get available events + events, err = state.StateSyncStore.getAllAvailableEvents(1000) + + require.NoError(t, err) + require.Len(t, events, 4) + require.Equal(t, uint64(2), events[0].EventID) + require.Equal(t, uint64(10), events[1].EventID) + require.Equal(t, false, events[1].SentStatus) + require.Equal(t, uint64(11), events[2].EventID) + require.Equal(t, uint64(12), events[3].EventID) + + events[1].SentStatus = true + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvent(events[1])) + + require.NoError(t, state.StateSyncStore.removeStateSyncRelayerEvent(2)) + + // get available events with limit + events, err = state.StateSyncStore.getAllAvailableEvents(2) + + require.NoError(t, err) + require.Len(t, events, 2) + require.Equal(t, uint64(10), events[0].EventID) + require.Equal(t, true, events[0].SentStatus) + require.Equal(t, uint64(11), events[1].EventID) } diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 25759cf6fe..f7d9bb5a56 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -16,10 +16,11 @@ import ( ) const ( - // maxBlocksToWaitForResend specifies how many blocks should be wait in order to try again to send transaction - maxBlocksToWaitForResend = uint64(30) - // maxAttemptsToSend specifies how many sending retries for one transaction - maxAttemptsToSend = 6 + // defaultMaxBlocksToWaitForResend specifies how many blocks should be wait + // in order to try again to send transaction + defaultMaxBlocksToWaitForResend = uint64(30) + // defaultMaxAttemptsToSend specifies how many sending retries for one transaction + defaultMaxAttemptsToSend = 6 ) var ( @@ -57,13 +58,21 @@ type StateSyncRelayerStateData struct { // StateSyncRelayerEventData keeps information about an event type StateSyncRelayerEventData struct { - EventID uint64 `json:"eventID"` - CountTries uint64 `json:"countTries"` - // block when state sync is sent - BlockNumber uint64 `json:"blockNumber"` + EventID uint64 `json:"eventID"` + CountTries uint64 `json:"countTries"` + BlockNumber uint64 `json:"blockNumber"` // block when state sync is sent SentStatus bool `json:"sentStatus"` } +func (ed StateSyncRelayerEventData) String() string { + return fmt.Sprintf("%d", ed.EventID) +} + +type stateSyncRelayerConfig struct { + maxBlocksToWaitForResend uint64 + maxAttemptsToSend uint64 +} + type stateSyncRelayerImpl struct { txRelayer txrelayer.TxRelayer key ethgo.Key @@ -75,6 +84,8 @@ type stateSyncRelayerImpl struct { notifyCh chan struct{} closeCh chan struct{} + config *stateSyncRelayerConfig + // eventsGetter gets contractsapi.NewCommitmentEvent from blocks eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] // eventsGetter gets StateSyncResult events (missed or current) from blocks @@ -88,8 +99,16 @@ func NewStateSyncRelayer( store stateSyncProofRetriever, blockchain blockchainBackend, key ethgo.Key, + config *stateSyncRelayerConfig, logger hclog.Logger, ) StateSyncRelayer { + if config == nil { + config = &stateSyncRelayerConfig{ + maxBlocksToWaitForResend: defaultMaxBlocksToWaitForResend, + maxAttemptsToSend: defaultMaxAttemptsToSend, + } + } + return &stateSyncRelayerImpl{ txRelayer: txRelayer, key: key, @@ -123,6 +142,7 @@ func NewStateSyncRelayer( return &stateSyncResultEvent, matches, err }, }, + config: config, logger: logger, } } @@ -135,11 +155,7 @@ func (ssr *stateSyncRelayerImpl) Init() error { case <-ssr.closeCh: return case <-ssr.notifyCh: - if ed, err := ssr.processEvent(); err != nil { - ssr.logger.Error("failed to process event", "event", ed.EventID, "err", err) - } else if ed != nil { - ssr.logger.Info("event has been successfully sent", "event", ed.EventID) - } + ssr.processEvents() } } }() @@ -154,7 +170,7 @@ func (ssr *stateSyncRelayerImpl) Close() { func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { state, err := ssr.state.StateSyncStore.getStateSyncRelayerStateData() if err != nil { - return fmt.Errorf("state sync relayer get state failed: %w", err) + return fmt.Errorf("failed to get state sync relayer data: %w", err) } // create default state data if this is the first time @@ -167,36 +183,45 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { return fmt.Errorf("failed to retrieve processed state sync result events from block: %w", err) } - processedStateSyncEventIDs := make([]uint64, 0, len(resultEvents)) - failedStateSyncEventIDs := make([]uint64, 0, len(resultEvents)) + events, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) + if err != nil { + return fmt.Errorf("failed to retrieve events from block: %w", err) + } + + newEvents := make([]*StateSyncRelayerEventData, 0) + processedEventIDs := make([]uint64, 0, len(resultEvents)) + failedEventIDs := make([]uint64, 0, len(resultEvents)) failedReasons := make([]string, 0, len(resultEvents)) + // process new events + for _, event := range events { + for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { + newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) + } + } + + // process results for _, event := range resultEvents { if event.Status { - processedStateSyncEventIDs = append(processedStateSyncEventIDs, event.Counter.Uint64()) + processedEventIDs = append(processedEventIDs, event.Counter.Uint64()) } else { - failedStateSyncEventIDs = append(failedStateSyncEventIDs, event.Counter.Uint64()) + // maybe add failed events as new ones (that would overwrite in db) + // newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: event.Counter.Uint64()}) + failedEventIDs = append(failedEventIDs, event.Counter.Uint64()) failedReasons = append(failedReasons, string(event.Message)) } } - events, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) - if err != nil { - return fmt.Errorf("state sync relayer: %w", err) - } - state.LastBlockNumber = req.FullBlock.Block.Number() - if err = ssr.state.StateSyncStore.updateStateSyncRelayerStateData( - state, - getConvertedEvents(events), processedStateSyncEventIDs); err != nil { + err = ssr.state.StateSyncStore.updateStateSyncRelayerStateData(state, newEvents, processedEventIDs) + if err != nil { return fmt.Errorf("state sync relayer insert state failed: %w", err) } - // maybe change state of failed events to Sent=false ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber, - "processed", processedStateSyncEventIDs, - "failed", failedStateSyncEventIDs, "reasons", failedReasons) + "new", newEvents, "processed", processedEventIDs, + "failed", failedEventIDs, "reasons", failedReasons) select { case ssr.notifyCh <- struct{}{}: @@ -206,45 +231,63 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { return nil } -func (ssr *stateSyncRelayerImpl) processEvent() (*StateSyncRelayerEventData, error) { - eventData, err := ssr.state.StateSyncStore.getNextEvent() +func (ssr *stateSyncRelayerImpl) processEvents() { + // we need two events because the first one is possible tried maxAttemptsToSend times + events, err := ssr.state.StateSyncStore.getAllAvailableEvents(2) if err != nil { - return eventData, err - } else if eventData == nil { - return nil, nil // nothing to process right now - } else if eventData.SentStatus && - eventData.BlockNumber+maxBlocksToWaitForResend > ssr.blockchain.CurrentHeader().Number { - return nil, nil // nothing to process right now, still waiting for confirmation - } else if eventData.CountTries+1 > maxAttemptsToSend { - _ = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) - - ssr.logger.Info("failed to send event too many times", "eventID", eventData.EventID) - - return ssr.processEvent() // process next + ssr.logger.Error("retrieving events failed", "err", err) + + return } - ssr.logger.Info("state sync relayer processing event", "eventID", eventData.EventID) + if len(events) == 0 { + return // nothing to process + } - txn, err := ssr.createTx(eventData.EventID) - if err != nil { - _ = ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData) + currentBlockNumber := ssr.blockchain.CurrentHeader().Number + eventData := events[0] + // return if we are still waiting for confirmation for the event + if eventData.SentStatus && eventData.BlockNumber+ssr.config.maxBlocksToWaitForResend > currentBlockNumber { + return + } + + // if current event is processed to many times, remove it and try the next one + if eventData.CountTries+1 > ssr.config.maxAttemptsToSend { + err = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) - return eventData, fmt.Errorf("failed to create tx: %w", err) + ssr.logger.Info("failed to send event too many times", "eventID", eventData.EventID, "err", err) + // return if there is no next + if len(events) == 1 { + return + } + + eventData = events[1] // next one to process } + if err := ssr.sendEventTx(eventData, currentBlockNumber); err != nil { + ssr.logger.Error("failed to send tx event", "event", eventData.EventID, "err", err) + } else { + ssr.logger.Info("event tx has been successfully sent", "event", eventData.EventID) + } +} + +func (ssr *stateSyncRelayerImpl) sendEventTx(eventData *StateSyncRelayerEventData, blockNumber uint64) error { eventData.CountTries++ - eventData.BlockNumber = ssr.blockchain.CurrentHeader().Number + eventData.BlockNumber = blockNumber eventData.SentStatus = true if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { - return eventData, fmt.Errorf("failed to move to sent: %w", err) + return fmt.Errorf("failed to update event: %w", err) } - ssr.logger.Info("state sync relayer sending event", "eventID", eventData.EventID) + txn, err := ssr.createTx(eventData.EventID) + if err != nil { + return fmt.Errorf("failed to create tx: %w", err) + } _, err = ssr.txRelayer.SendTransaction(txn, ssr.key) - return eventData, err + return err } func (ssr *stateSyncRelayerImpl) createTx(eventID uint64) (*ethgo.Transaction, error) { @@ -299,13 +342,3 @@ func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.T txrelayer.WithIPAddress(rpcEndpoint), txrelayer.WithNumRetries(-1), txrelayer.WithWriter(logger.StandardWriter(&hclog.StandardLoggerOptions{}))) } - -func getConvertedEvents(events []*contractsapi.NewCommitmentEvent) (newEvents []*StateSyncRelayerEventData) { - for _, event := range events { - for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { - newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) - } - } - - return newEvents -} diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index fea69e9f91..3624e90bd8 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -1,6 +1,7 @@ package polybft import ( + "errors" "math/big" "testing" "time" @@ -21,37 +22,53 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { successStatus := types.ReceiptSuccess block1Hash := types.StringToHash("x087887823ff23423") stateSyncAddr := types.StringToAddress("0x56563") - commitment1Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 1, 2, types.StringToHash("0x1")) - commitment2Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 3, 3, types.StringToHash("0x2")) - commitment3Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 4, 6, types.StringToHash("0x3")) - commitment4Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 7, 7, types.StringToHash("0x4")) - receiptsBlock1 := []*types.Receipt{ + + result1Log := createTestLogForStateSyncResultEvent(t, 1) + result2Log := createTestLogForStateSyncResultEvent(t, 2) + result3Log := createTestLogForStateSyncResultEvent(t, 3) + result4Log := createTestLogForStateSyncResultEvent(t, 4) + commitment1Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 2, 3, types.StringToHash("0x2")) + commitment2Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 4, 4, types.StringToHash("0x3")) + receipts := [][]*types.Receipt{ { - Status: &successStatus, - Logs: []*types.Log{ - {}, commitment1Log, + { + Status: &successStatus, + Logs: []*types.Log{ + {}, commitment1Log, result1Log, + }, }, }, - } - receiptsBlock2 := []*types.Receipt{ { - Status: &successStatus, - Logs: []*types.Log{ - {}, commitment2Log, + { + Status: &successStatus, + Logs: []*types.Log{ + {}, commitment2Log, + }, }, }, { - Status: &successStatus, - Logs: []*types.Log{ - commitment3Log, + { + Status: &successStatus, + Logs: []*types.Log{ + result2Log, + }, }, }, - } - receiptsBlock3 := []*types.Receipt{ { - Status: &successStatus, - Logs: []*types.Log{ - {}, commitment4Log, + { + Status: &successStatus, + Logs: []*types.Log{ + result3Log, + }, + }, + }, + {}, + { + { + Status: &successStatus, + Logs: []*types.Log{ + result4Log, + }, }, }, } @@ -82,29 +99,26 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { proofMock, blockhainMock, testKey, + &stateSyncRelayerConfig{ + maxAttemptsToSend: 6, + maxBlocksToWaitForResend: 1, + }, hclog.Default(), ) - blockhainMock.On("CurrentHeader").Return(&types.Header{ - Hash: block1Hash, - Number: 1, - }).Maybe() - // post block 2, last state sync fails - blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{ - Hash: block1Hash, - }).Twice() - blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receiptsBlock1, nil).Twice() - // fail on stateSyncID == 6 -> last one in first try - dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( - ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(5) - dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( - ðgo.Receipt{ - Status: uint64(types.ReceiptFailed), - }, nil).Once() + blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 2}).Once() + blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 3}).Once() + blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 4}).Once() + blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 6}).Once() + blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receipts[0], nil).Twice() + blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{Hash: block1Hash}).Twice() + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), nil).Times(2) + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), errors.New("e")).Once() + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), nil).Once() require.NoError(t, stateSyncRelayer.Init()) - // post first block + // post first block (number 2) require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ FullBlock: &types.FullBlock{ Block: &types.Block{ @@ -112,52 +126,68 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { Number: 2, }, }, - Receipts: receiptsBlock2, + Receipts: receipts[1], }, })) time.Sleep(time.Second * 2) // wait for some time - // we need to be sure that 5 events are processed and last one failed + // check if everything is correct, 3 events should be in database, first one should be marked as sent ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() - blockhainMock.AssertExpectations(t) require.NoError(t, err) require.Equal(t, uint64(2), ssrStateData.LastBlockNumber) - time.Sleep(time.Second * 2) // wait for some time - - // post block 3, all the events should be processed and everything should pass - dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( - ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Times(2) + events, err := state.StateSyncStore.getAllAvailableEvents(0) - // post another block - require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ - FullBlock: &types.FullBlock{ - Block: &types.Block{ - Header: &types.Header{ - Number: 3, + require.NoError(t, err) + require.Len(t, events, 3) + require.True(t, events[0].SentStatus) + require.False(t, events[1].SentStatus) + require.False(t, events[2].SentStatus) + + for bn := uint64(3); bn <= uint64(6); bn++ { + t.Logf("processing block %d", bn) + + // post second block + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ + FullBlock: &types.FullBlock{ + Block: &types.Block{ + Header: &types.Header{ + Number: bn, + }, }, + Receipts: receipts[bn-1], }, - Receipts: receiptsBlock3, - }, - })) + })) + time.Sleep(time.Second * 2) // wait for some time - stateSyncRelayer.Close() + // check if everything is correct, 3 events should be in database, first one should be marked as sent + ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() - time.Sleep(time.Second * 2) // wait for some time + require.NoError(t, err) + require.Equal(t, bn, ssrStateData.LastBlockNumber) - // we need to be sure that 5 events are processed and last one failed - ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() + events, err := state.StateSyncStore.getAllAvailableEvents(0) - blockhainMock.AssertExpectations(t) - require.NoError(t, err) - require.Equal(t, uint64(3), ssrStateData.LastBlockNumber) + require.NoError(t, err) - event, err := state.StateSyncStore.getNextEvent() + if bn < 5 { // on block 5 sending fails + require.Len(t, events, 5-int(bn)) + } else { + require.Len(t, events, 6-int(bn)) + } - require.NoError(t, err) - require.Nil(t, event) + for i, e := range events { + require.Equal(t, i == 0, e.SentStatus) + } + } + + stateSyncRelayer.Close() + time.Sleep(time.Second) + + blockhainMock.AssertExpectations(t) + dummyTxRelayer.AssertExpectations(t) } type mockStateSyncProofRetriever struct { From 23081bc0b1b6ffc3d900fc01278703851b60cd07 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 16 Oct 2023 12:36:42 +0200 Subject: [PATCH 16/27] cr fix --- consensus/polybft/state_sync_relayer.go | 91 +++++++++----------- consensus/polybft/state_sync_relayer_test.go | 4 +- 2 files changed, 45 insertions(+), 50 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index f7d9bb5a56..673825859c 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -24,7 +24,8 @@ const ( ) var ( - errFailedToExecuteStateSync = errors.New("failed to execute state sync") + errFailedToExecuteStateSync = errors.New("failed to execute state sync") + errUnkownStateSyncRelayerEvent = errors.New("unknown event") ) // StateSyncRelayer is an interface that defines functions for state sync relayer @@ -86,10 +87,8 @@ type stateSyncRelayerImpl struct { config *stateSyncRelayerConfig - // eventsGetter gets contractsapi.NewCommitmentEvent from blocks - eventsGetter *eventsGetter[*contractsapi.NewCommitmentEvent] - // eventsGetter gets StateSyncResult events (missed or current) from blocks - eventsGetterResults *eventsGetter[*contractsapi.StateSyncResultEvent] + // eventsGetter gets contractsapi.NewCommitmentEvent and contractsapi.StateSyncResultEvent from blocks + eventsGetter *eventsGetter[contractsapi.EventAbi] } func NewStateSyncRelayer( @@ -117,29 +116,29 @@ func NewStateSyncRelayer( closeCh: make(chan struct{}), notifyCh: make(chan struct{}, 1), blockchain: blockchain, - eventsGetter: &eventsGetter[*contractsapi.NewCommitmentEvent]{ + eventsGetter: &eventsGetter[contractsapi.EventAbi]{ blockchain: blockchain, isValidLogFn: func(l *types.Log) bool { - return l.Address == stateReceiverAddr + return l.Address == stateReceiverAddr || l.Address == contracts.StateReceiverContract }, - parseEventFn: func(_ *types.Header, log *ethgo.Log) (*contractsapi.NewCommitmentEvent, bool, error) { - var commitEvent contractsapi.NewCommitmentEvent - - doesMatch, err := commitEvent.ParseLog(log) - - return &commitEvent, doesMatch, err - }, - }, - eventsGetterResults: &eventsGetter[*contractsapi.StateSyncResultEvent]{ - blockchain: blockchain, - isValidLogFn: func(l *types.Log) bool { - return l.Address == contracts.StateReceiverContract - }, - parseEventFn: func(h *types.Header, l *ethgo.Log) (*contractsapi.StateSyncResultEvent, bool, error) { - var stateSyncResultEvent contractsapi.StateSyncResultEvent - matches, err := stateSyncResultEvent.ParseLog(l) - - return &stateSyncResultEvent, matches, err + parseEventFn: func(_ *types.Header, log *ethgo.Log) (contractsapi.EventAbi, bool, error) { + var ( + commitEvent contractsapi.NewCommitmentEvent + stateSyncResultEvent contractsapi.StateSyncResultEvent + ) + + switch log.Topics[0] { + case commitEvent.Sig(): + doesMatch, err := commitEvent.ParseLog(log) + + return &commitEvent, doesMatch, err + case stateSyncResultEvent.Sig(): + doesMatch, err := stateSyncResultEvent.ParseLog(log) + + return &stateSyncResultEvent, doesMatch, err + default: + return nil, false, errUnkownStateSyncRelayerEvent + } }, }, config: config, @@ -178,37 +177,33 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { state = &StateSyncRelayerStateData{LastBlockNumber: 0} } - resultEvents, err := ssr.eventsGetterResults.getFromBlocks(state.LastBlockNumber, req.FullBlock) - if err != nil { - return fmt.Errorf("failed to retrieve processed state sync result events from block: %w", err) - } - - events, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) + allEvents, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) if err != nil { return fmt.Errorf("failed to retrieve events from block: %w", err) } newEvents := make([]*StateSyncRelayerEventData, 0) - processedEventIDs := make([]uint64, 0, len(resultEvents)) - failedEventIDs := make([]uint64, 0, len(resultEvents)) - failedReasons := make([]string, 0, len(resultEvents)) + processedEventIDs := make([]uint64, 0) + failedEventIDs := make([]uint64, 0) + failedReasons := make([]string, 0) // process new events - for _, event := range events { - for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { - newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) - } - } + for _, genEvent := range allEvents { + switch event := genEvent.(type) { + case *contractsapi.NewCommitmentEvent: + for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { + newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) + } - // process results - for _, event := range resultEvents { - if event.Status { - processedEventIDs = append(processedEventIDs, event.Counter.Uint64()) - } else { - // maybe add failed events as new ones (that would overwrite in db) - // newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: event.Counter.Uint64()}) - failedEventIDs = append(failedEventIDs, event.Counter.Uint64()) - failedReasons = append(failedReasons, string(event.Message)) + case *contractsapi.StateSyncResultEvent: + if event.Status { + processedEventIDs = append(processedEventIDs, event.Counter.Uint64()) + } else { + // maybe add failed events as new ones (that would overwrite in db) + // newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: event.Counter.Uint64()}) + failedEventIDs = append(failedEventIDs, event.Counter.Uint64()) + failedReasons = append(failedReasons, string(event.Message)) + } } } diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 3624e90bd8..95a98ffd4e 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -110,8 +110,8 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 3}).Once() blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 4}).Once() blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 6}).Once() - blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receipts[0], nil).Twice() - blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{Hash: block1Hash}).Twice() + blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receipts[0], nil).Once() + blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{Hash: block1Hash}).Once() dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), nil).Times(2) dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), errors.New("e")).Once() dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), nil).Once() From 665f71c86e04544a881b6e2d895d311d731bf8f9 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 16 Oct 2023 14:53:11 +0200 Subject: [PATCH 17/27] batchExecute --- .../polybft/contractsapi/bindings-gen/main.go | 1 + .../polybft/contractsapi/contractsapi.go | 17 +++ consensus/polybft/state_store_state_sync.go | 84 +++++------ .../polybft/state_store_state_sync_test.go | 4 +- consensus/polybft/state_sync_relayer.go | 133 ++++++++++-------- consensus/polybft/state_sync_relayer_test.go | 2 + 6 files changed, 135 insertions(+), 106 deletions(-) diff --git a/consensus/polybft/contractsapi/bindings-gen/main.go b/consensus/polybft/contractsapi/bindings-gen/main.go index d302d15b6e..aa8785c3b9 100644 --- a/consensus/polybft/contractsapi/bindings-gen/main.go +++ b/consensus/polybft/contractsapi/bindings-gen/main.go @@ -48,6 +48,7 @@ func main() { []string{ "commit", "execute", + "batchExecute", }, []string{ "StateSyncResult", diff --git a/consensus/polybft/contractsapi/contractsapi.go b/consensus/polybft/contractsapi/contractsapi.go index 36ce2faeb5..b84045e6c2 100644 --- a/consensus/polybft/contractsapi/contractsapi.go +++ b/consensus/polybft/contractsapi/contractsapi.go @@ -77,6 +77,23 @@ func (e *ExecuteStateReceiverFn) DecodeAbi(buf []byte) error { return decodeMethod(StateReceiver.Abi.Methods["execute"], buf, e) } +type BatchExecuteStateReceiverFn struct { + Proofs [][]types.Hash `abi:"proofs"` + Objs []*StateSync `abi:"objs"` +} + +func (b *BatchExecuteStateReceiverFn) Sig() []byte { + return StateReceiver.Abi.Methods["batchExecute"].ID() +} + +func (b *BatchExecuteStateReceiverFn) EncodeAbi() ([]byte, error) { + return StateReceiver.Abi.Methods["batchExecute"].Encode(b) +} + +func (b *BatchExecuteStateReceiverFn) DecodeAbi(buf []byte) error { + return decodeMethod(StateReceiver.Abi.Methods["batchExecute"], buf, b) +} + type StateSyncResultEvent struct { Counter *big.Int `abi:"counter"` Status bool `abi:"status"` diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index 3dde7335f8..097d2a43f4 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -365,16 +365,14 @@ func (s *StateSyncStore) getStateSyncProof(stateSyncID uint64) (*StateSyncProof, return ssp, err } -// updateStateSyncRelayerStateData inserts the state data for state sync relayer together with new events and -// deletion of processed events +// updateStateSyncRelayerStateData inserts the state data for state sync relayer together +// with insertion of a new events and deletion of processed events func (s *StateSyncStore) updateStateSyncRelayerStateData( data *StateSyncRelayerStateData, newEvents []*StateSyncRelayerEventData, - deletedEventIds []uint64) error { + deletedEventIDs []uint64) error { return s.db.Update(func(tx *bolt.Tx) error { relayerEventsBucket := tx.Bucket(stateSyncRelayerEventsBucket) - eventsBucket := tx.Bucket(stateSyncEventsBucket) - proofsBucket := tx.Bucket(stateSyncProofsBucket) for _, evnt := range newEvents { raw, err := json.Marshal(evnt) @@ -389,20 +387,8 @@ func (s *StateSyncStore) updateStateSyncRelayerStateData( } } - for _, stateSyncEventID := range deletedEventIds { - stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) - - if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) - } - - if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) - } - - if err := relayerEventsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync relayer event (ID=%d): %w", stateSyncEventID, err) - } + if err := s.removeEvents(tx, deletedEventIDs); err != nil { + return err } raw, err := json.Marshal(data) @@ -431,34 +417,26 @@ func (s *StateSyncStore) getStateSyncRelayerStateData() (*StateSyncRelayerStateD return data, err } -// updateStateSyncRelayerEvent removes StateSyncRelayerEventData from database -func (s *StateSyncStore) removeStateSyncRelayerEvent(eventID uint64) error { +// updateStateSyncRelayerEvents updates/remove desired events +func (s *StateSyncStore) updateStateSyncRelayerEvents( + events []*StateSyncRelayerEventData, removeIDs []uint64) error { return s.db.Update(func(tx *bolt.Tx) error { - key := common.EncodeUint64ToBytes(eventID) - - if err := tx.Bucket(stateSyncEventsBucket).Delete(key); err != nil { - return fmt.Errorf("failed to remove state sync event (ID=%d): %w", eventID, err) - } + bucket := tx.Bucket(stateSyncRelayerEventsBucket) - if err := tx.Bucket(stateSyncProofsBucket).Delete(key); err != nil { - return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", eventID, err) - } + for _, evnt := range events { + raw, err := json.Marshal(evnt) + if err != nil { + return err + } - return tx.Bucket(stateSyncRelayerEventsBucket).Delete(key) - }) -} + key := common.EncodeUint64ToBytes(evnt.EventID) -// updateStateSyncRelayerEvent updates StateSyncRelayerEventData -func (s *StateSyncStore) updateStateSyncRelayerEvent(evnt *StateSyncRelayerEventData) error { - return s.db.Update(func(tx *bolt.Tx) error { - raw, err := json.Marshal(evnt) - if err != nil { - return err + if err := bucket.Put(key, raw); err != nil { + return err + } } - key := common.EncodeUint64ToBytes(evnt.EventID) - - return tx.Bucket(stateSyncRelayerEventsBucket).Put(key, raw) + return s.removeEvents(tx, removeIDs) }) } @@ -488,3 +466,27 @@ func (s *StateSyncStore) getAllAvailableEvents(limit int) (result []*StateSyncRe return result, nil } + +func (s *StateSyncStore) removeEvents(tx *bolt.Tx, eventIDs []uint64) error { + eventsBucket := tx.Bucket(stateSyncEventsBucket) + proofsBucket := tx.Bucket(stateSyncProofsBucket) + relayerEventsBucket := tx.Bucket(stateSyncRelayerEventsBucket) + + for _, stateSyncEventID := range eventIDs { + stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) + + if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) + } + + if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) + } + + if err := relayerEventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync relayer event (ID=%d): %w", stateSyncEventID, err) + } + } + + return nil +} diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 561c206aa7..0c102f1c53 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -368,9 +368,7 @@ func TestState_StateSync_StateSyncRelayerDataAndEvents(t *testing.T) { require.Equal(t, uint64(12), events[3].EventID) events[1].SentStatus = true - require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvent(events[1])) - - require.NoError(t, state.StateSyncStore.removeStateSyncRelayerEvent(2)) + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvents(events[1:2], []uint64{2})) // get available events with limit events, err = state.StateSyncStore.getAllAvailableEvents(2) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 673825859c..3838a2de25 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -21,6 +21,8 @@ const ( defaultMaxBlocksToWaitForResend = uint64(30) // defaultMaxAttemptsToSend specifies how many sending retries for one transaction defaultMaxAttemptsToSend = 6 + // defaultMaxEventsPerBatch specifies maximum events per one batchExecute tx + defaultMaxEventsPerBatch = 10 ) var ( @@ -72,6 +74,7 @@ func (ed StateSyncRelayerEventData) String() string { type stateSyncRelayerConfig struct { maxBlocksToWaitForResend uint64 maxAttemptsToSend uint64 + maxEventsPerBatch uint64 } type stateSyncRelayerImpl struct { @@ -105,6 +108,7 @@ func NewStateSyncRelayer( config = &stateSyncRelayerConfig{ maxBlocksToWaitForResend: defaultMaxBlocksToWaitForResend, maxAttemptsToSend: defaultMaxAttemptsToSend, + maxEventsPerBatch: defaultMaxEventsPerBatch, } } @@ -187,7 +191,7 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { failedEventIDs := make([]uint64, 0) failedReasons := make([]string, 0) - // process new events + // process all the events for _, genEvent := range allEvents { switch event := genEvent.(type) { case *contractsapi.NewCommitmentEvent: @@ -227,100 +231,105 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { } func (ssr *stateSyncRelayerImpl) processEvents() { - // we need two events because the first one is possible tried maxAttemptsToSend times - events, err := ssr.state.StateSyncStore.getAllAvailableEvents(2) + // we need twice as batch size because events from first batch are possible already sent maxAttemptsToSend times + events, err := ssr.state.StateSyncStore.getAllAvailableEvents(int(ssr.config.maxEventsPerBatch) * 2) if err != nil { ssr.logger.Error("retrieving events failed", "err", err) return } - if len(events) == 0 { - return // nothing to process - } - + removedEventIDs := []uint64{} + sendingEvents := []*StateSyncRelayerEventData{} currentBlockNumber := ssr.blockchain.CurrentHeader().Number - eventData := events[0] - // return if we are still waiting for confirmation for the event - if eventData.SentStatus && eventData.BlockNumber+ssr.config.maxBlocksToWaitForResend > currentBlockNumber { - return - } - // if current event is processed to many times, remove it and try the next one - if eventData.CountTries+1 > ssr.config.maxAttemptsToSend { - err = ssr.state.StateSyncStore.removeStateSyncRelayerEvent(eventData.EventID) - - ssr.logger.Info("failed to send event too many times", "eventID", eventData.EventID, "err", err) - // return if there is no next - if len(events) == 1 { + // check already processed events + for _, evnt := range events { + // quit if we are still waiting for some old event confirmation (there is no paralelization right now!) + if evnt.SentStatus && evnt.BlockNumber+ssr.config.maxBlocksToWaitForResend > currentBlockNumber { return } - eventData = events[1] // next one to process - } + // remove event if it is processed too many times + if evnt.CountTries+1 > ssr.config.maxAttemptsToSend { + removedEventIDs = append(removedEventIDs, evnt.EventID) + } else { + evnt.CountTries++ + evnt.BlockNumber = currentBlockNumber + evnt.SentStatus = true - if err := ssr.sendEventTx(eventData, currentBlockNumber); err != nil { - ssr.logger.Error("failed to send tx event", "event", eventData.EventID, "err", err) - } else { - ssr.logger.Info("event tx has been successfully sent", "event", eventData.EventID) + sendingEvents = append(sendingEvents, evnt) + if len(sendingEvents) == int(ssr.config.maxEventsPerBatch) { + break + } + } } -} -func (ssr *stateSyncRelayerImpl) sendEventTx(eventData *StateSyncRelayerEventData, blockNumber uint64) error { - eventData.CountTries++ - eventData.BlockNumber = blockNumber - eventData.SentStatus = true + // update state only if needed + if len(sendingEvents)+len(removedEventIDs) > 0 { + ssr.logger.Info("sending events", "events", sendingEvents, "removed", removedEventIDs) - if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvent(eventData); err != nil { - return fmt.Errorf("failed to update event: %w", err) - } + if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvents(sendingEvents, removedEventIDs); err != nil { + ssr.logger.Error("updating events failed", + "events", sendingEvents, "removed", removedEventIDs, "err", err) - txn, err := ssr.createTx(eventData.EventID) - if err != nil { - return fmt.Errorf("failed to create tx: %w", err) + return + } } - _, err = ssr.txRelayer.SendTransaction(txn, ssr.key) - - return err + // send tx only if needed + if len(sendingEvents) > 0 { + if err := ssr.sendTx(sendingEvents); err != nil { + ssr.logger.Error("failed to send tx", "events", sendingEvents, "err", err) + } else { + ssr.logger.Info("tx has been successfully sent", "events", sendingEvents) + } + } } -func (ssr *stateSyncRelayerImpl) createTx(eventID uint64) (*ethgo.Transaction, error) { - var sse *contractsapi.StateSync +func (ssr *stateSyncRelayerImpl) sendTx(events []*StateSyncRelayerEventData) error { + proofs := make([][]types.Hash, len(events)) + objs := make([]*contractsapi.StateSync, len(events)) - proof, err := ssr.store.GetStateSyncProof(eventID) - if err != nil { - return nil, err - } + for i, event := range events { + proof, err := ssr.store.GetStateSyncProof(event.EventID) + if err != nil { + return fmt.Errorf("failed to get proof for %d: %w", event.EventID, err) + } - // since state sync event is a map in the jsonrpc response, - // to not have custom logic of converting the map to state sync event - // json encoding is used, since it manages to successfully unmarshal the - // event from the marshaled map - raw, err := json.Marshal(proof.Metadata["StateSync"]) - if err != nil { - return nil, fmt.Errorf("failed to marshal: %w", err) - } + // since state sync event is a map in the jsonrpc response, + // to not have custom logic of converting the map to state sync event + // json encoding is used, since it manages to successfully unmarshal the + // event from the marshaled map + raw, err := json.Marshal(proof.Metadata["StateSync"]) + if err != nil { + return fmt.Errorf("failed to marshal event %d: %w", event.EventID, err) + } - if err = json.Unmarshal(raw, &sse); err != nil { - return nil, fmt.Errorf("failed to unmarshal: %w", err) + if err = json.Unmarshal(raw, &objs[i]); err != nil { + return fmt.Errorf("failed to unmarshal event %d: %w", event.EventID, err) + } + + proofs[i] = proof.Data } - input, err := (&contractsapi.ExecuteStateReceiverFn{ - Proof: proof.Data, - Obj: sse, + input, err := (&contractsapi.BatchExecuteStateReceiverFn{ + Proofs: proofs, + Objs: objs, }).EncodeAbi() if err != nil { - return nil, err + return err } - // execute the state sync - return ðgo.Transaction{ + // send batchExecute state sync + _, err = ssr.txRelayer.SendTransaction(ðgo.Transaction{ From: ssr.key.Address(), To: (*ethgo.Address)(&contracts.StateReceiverContract), Gas: types.StateTransactionGasLimit, Input: input, - }, nil + }, ssr.key) + + return err } func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.TxRelayer, error) { diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 95a98ffd4e..b723218367 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -102,6 +102,7 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { &stateSyncRelayerConfig{ maxAttemptsToSend: 6, maxBlocksToWaitForResend: 1, + maxEventsPerBatch: 1, }, hclog.Default(), ) @@ -109,6 +110,7 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 2}).Once() blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 3}).Once() blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 4}).Once() + blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 5}).Once() blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 6}).Once() blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receipts[0], nil).Once() blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{Hash: block1Hash}).Once() From 94e0f5881315d0bd933d503c24264c409065a44b Mon Sep 17 00:00:00 2001 From: Goran Rojovic Date: Mon, 16 Oct 2023 16:35:34 +0200 Subject: [PATCH 18/27] Rebase fix --- consensus/polybft/consensus_runtime.go | 2 + consensus/polybft/state_store_state_sync.go | 110 +++-------- .../polybft/state_store_state_sync_test.go | 42 +--- consensus/polybft/state_sync_manager.go | 41 ---- consensus/polybft/state_sync_relayer.go | 182 ++++++++++-------- consensus/polybft/state_sync_relayer_test.go | 12 -- 6 files changed, 134 insertions(+), 255 deletions(-) diff --git a/consensus/polybft/consensus_runtime.go b/consensus/polybft/consensus_runtime.go index 15be6f41cf..3ab2d5d73b 100644 --- a/consensus/polybft/consensus_runtime.go +++ b/consensus/polybft/consensus_runtime.go @@ -271,6 +271,8 @@ func (c *consensusRuntime) initStateSyncRelayer(logger hcf.Logger) error { c.stateSyncRelayer = &dummyStakeSyncRelayer{} } + c.eventProvider.Subscribe(c.stateSyncRelayer) + return c.stateSyncRelayer.Init() } diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index 097d2a43f4..f5015a7d53 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -19,8 +19,6 @@ var ( stateSyncProofsBucket = []byte("stateSyncProofs") // bucket to store message votes (signatures) messageVotesBucket = []byte("votes") - // bucket to store all state sync relayer data - stateSyncRelayerDataBucket = []byte("relayerData") // bucket to store all state sync relayer events stateSyncRelayerEventsBucket = []byte("relayerEvents") @@ -30,9 +28,6 @@ var ( errCommitmentNotBuilt = errors.New("there is no built commitment to register") // errNoCommitmentForStateSync error message errNoCommitmentForStateSync = errors.New("no commitment found for given state sync event") - - // stateSyncRelayerStateDataKey is db key for serialized state of state sync relayer data - stateSyncRelayerStateDataKey = []byte("data") ) /* @@ -72,10 +67,6 @@ func (s *StateSyncStore) initialize(tx *bolt.Tx) error { return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncProofsBucket), err) } - if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerDataBucket); err != nil { - return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerDataBucket), err) - } - if _, err := tx.CreateBucketIfNotExists(stateSyncRelayerEventsBucket); err != nil { return fmt.Errorf("failed to create bucket=%s: %w", string(stateSyncRelayerEventsBucket), err) } @@ -365,79 +356,54 @@ func (s *StateSyncStore) getStateSyncProof(stateSyncID uint64) (*StateSyncProof, return ssp, err } -// updateStateSyncRelayerStateData inserts the state data for state sync relayer together -// with insertion of a new events and deletion of processed events -func (s *StateSyncStore) updateStateSyncRelayerStateData( - data *StateSyncRelayerStateData, - newEvents []*StateSyncRelayerEventData, - deletedEventIDs []uint64) error { - return s.db.Update(func(tx *bolt.Tx) error { +// updateStateSyncRelayerEvents updates/remove desired events +func (s *StateSyncStore) updateStateSyncRelayerEvents( + events []*StateSyncRelayerEventData, removeIDs []uint64, dbTx *bolt.Tx) error { + updateFn := func(tx *bolt.Tx) error { relayerEventsBucket := tx.Bucket(stateSyncRelayerEventsBucket) - for _, evnt := range newEvents { + for _, evnt := range events { raw, err := json.Marshal(evnt) if err != nil { - return fmt.Errorf("failed to add state sync relayer event (ID=%d): %w", evnt.EventID, err) + return err } key := common.EncodeUint64ToBytes(evnt.EventID) if err := relayerEventsBucket.Put(key, raw); err != nil { - return fmt.Errorf("failed to add state sync relayer event (ID=%d): %w", evnt.EventID, err) + return err } } - if err := s.removeEvents(tx, deletedEventIDs); err != nil { - return err - } + eventsBucket := tx.Bucket(stateSyncEventsBucket) + proofsBucket := tx.Bucket(stateSyncProofsBucket) - raw, err := json.Marshal(data) - if err != nil { - return err - } + for _, stateSyncEventID := range removeIDs { + stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) - return tx.Bucket(stateSyncRelayerDataBucket).Put(stateSyncRelayerStateDataKey, raw) - }) -} + if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) + } -// getStateSyncRelayerStateData gets the state data for state sync relayer -func (s *StateSyncStore) getStateSyncRelayerStateData() (*StateSyncRelayerStateData, error) { - var data *StateSyncRelayerStateData + if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) + } - err := s.db.View(func(tx *bolt.Tx) error { - if v := tx.Bucket(stateSyncRelayerDataBucket).Get(stateSyncRelayerStateDataKey); v != nil { - if err := json.Unmarshal(v, &data); err != nil { - return err + if err := relayerEventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync relayer event (ID=%d): %w", stateSyncEventID, err) } } return nil - }) - - return data, err -} - -// updateStateSyncRelayerEvents updates/remove desired events -func (s *StateSyncStore) updateStateSyncRelayerEvents( - events []*StateSyncRelayerEventData, removeIDs []uint64) error { - return s.db.Update(func(tx *bolt.Tx) error { - bucket := tx.Bucket(stateSyncRelayerEventsBucket) - - for _, evnt := range events { - raw, err := json.Marshal(evnt) - if err != nil { - return err - } - - key := common.EncodeUint64ToBytes(evnt.EventID) + } - if err := bucket.Put(key, raw); err != nil { - return err - } - } + if dbTx == nil { + return s.db.Update(func(tx *bolt.Tx) error { + return updateFn(tx) + }) + } - return s.removeEvents(tx, removeIDs) - }) + return updateFn(dbTx) } // getAllAvailableEvents retrieves all StateSyncRelayerEventData that should be sent as a transactions @@ -466,27 +432,3 @@ func (s *StateSyncStore) getAllAvailableEvents(limit int) (result []*StateSyncRe return result, nil } - -func (s *StateSyncStore) removeEvents(tx *bolt.Tx, eventIDs []uint64) error { - eventsBucket := tx.Bucket(stateSyncEventsBucket) - proofsBucket := tx.Bucket(stateSyncProofsBucket) - relayerEventsBucket := tx.Bucket(stateSyncRelayerEventsBucket) - - for _, stateSyncEventID := range eventIDs { - stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) - - if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) - } - - if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) - } - - if err := relayerEventsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync relayer event (ID=%d): %w", stateSyncEventID, err) - } - } - - return nil -} diff --git a/consensus/polybft/state_store_state_sync_test.go b/consensus/polybft/state_store_state_sync_test.go index 0c102f1c53..698c5c8356 100644 --- a/consensus/polybft/state_store_state_sync_test.go +++ b/consensus/polybft/state_store_state_sync_test.go @@ -303,30 +303,12 @@ func TestState_StateSync_StateSyncRelayerDataAndEvents(t *testing.T) { state := newTestState(t) - // get before update - ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() - - require.NoError(t, err) - assert.Nil(t, ssrStateData) - // update - require.NoError(t, state.StateSyncStore.updateStateSyncRelayerStateData( - &StateSyncRelayerStateData{ - LastBlockNumber: 100, - }, - []*StateSyncRelayerEventData{ - {EventID: 2}, - {EventID: 4}, - {EventID: 7, SentStatus: true, BlockNumber: 100}, - }, - []uint64{}, - )) - - // get after update - ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() - - require.NoError(t, err) - assert.Equal(t, uint64(100), ssrStateData.LastBlockNumber) + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvents([]*StateSyncRelayerEventData{ + {EventID: 2}, + {EventID: 4}, + {EventID: 7, SentStatus: true, BlockNumber: 100}, + }, []uint64{}, nil)) // get available events events, err := state.StateSyncStore.getAllAvailableEvents(0) @@ -338,24 +320,16 @@ func TestState_StateSync_StateSyncRelayerDataAndEvents(t *testing.T) { require.Equal(t, uint64(7), events[2].EventID) // update again - require.NoError(t, state.StateSyncStore.updateStateSyncRelayerStateData( - &StateSyncRelayerStateData{ - LastBlockNumber: 200, - }, + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvents( []*StateSyncRelayerEventData{ {EventID: 10}, {EventID: 12}, {EventID: 11}, }, []uint64{4, 7}, + nil, )) - // get after update - ssrStateData, err = state.StateSyncStore.getStateSyncRelayerStateData() - - require.NoError(t, err) - assert.Equal(t, uint64(200), ssrStateData.LastBlockNumber) - // get available events events, err = state.StateSyncStore.getAllAvailableEvents(1000) @@ -368,7 +342,7 @@ func TestState_StateSync_StateSyncRelayerDataAndEvents(t *testing.T) { require.Equal(t, uint64(12), events[3].EventID) events[1].SentStatus = true - require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvents(events[1:2], []uint64{2})) + require.NoError(t, state.StateSyncStore.updateStateSyncRelayerEvents(events[1:2], []uint64{2}, nil)) // get available events with limit events, err = state.StateSyncStore.getAllAvailableEvents(2) diff --git a/consensus/polybft/state_sync_manager.go b/consensus/polybft/state_sync_manager.go index 5e10fa3de1..6d0f97e090 100644 --- a/consensus/polybft/state_sync_manager.go +++ b/consensus/polybft/state_sync_manager.go @@ -36,7 +36,6 @@ type StateSyncProof struct { // StateSyncManager is an interface that defines functions for state sync workflow type StateSyncManager interface { - EventSubscriber Init() error Close() Commitment(blockNumber uint64) (*CommitmentMessageSigned, error) @@ -61,15 +60,6 @@ func (d *dummyStateSyncManager) GetStateSyncProof(stateSyncID uint64) (types.Pro return types.Proof{}, nil } -// EventSubscriber implementation -func (d *dummyStateSyncManager) GetLogFilters() map[types.Address][]types.Hash { - return make(map[types.Address][]types.Hash) -} -func (d *dummyStateSyncManager) ProcessLog(header *types.Header, - log *ethgo.Log, dbTx *bolt.Tx) error { - return nil -} - // stateSyncConfig holds the configuration data of state sync manager type stateSyncConfig struct { stateSenderAddr types.Address @@ -615,34 +605,3 @@ func (s *stateSyncManager) multicast(msg interface{}) { s.logger.Warn("failed to gossip bridge message", "err", err) } } - -// EventSubscriber implementation - -// GetLogFilters returns a map of log filters for getting desired events, -// where the key is the address of contract that emits desired events, -// and the value is a slice of signatures of events we want to get. -// This function is the implementation of EventSubscriber interface -func (s *stateSyncManager) GetLogFilters() map[types.Address][]types.Hash { - var stateSyncResultEvent contractsapi.StateSyncResultEvent - - return map[types.Address][]types.Hash{ - contracts.StateReceiverContract: {types.Hash(stateSyncResultEvent.Sig())}, - } -} - -// ProcessLog is the implementation of EventSubscriber interface, -// used to handle a log defined in GetLogFilters, provided by event provider -func (s *stateSyncManager) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { - var stateSyncResultEvent contractsapi.StateSyncResultEvent - - doesMatch, err := stateSyncResultEvent.ParseLog(log) - if err != nil { - return err - } - - if !doesMatch { - return nil - } - - return s.state.StateSyncStore.removeStateSyncEventsAndProofs([]uint64{stateSyncResultEvent.Counter.Uint64()}) -} diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 3838a2de25..6c42b94cdd 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -13,6 +13,7 @@ import ( "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" "github.com/umbracle/ethgo" + bolt "go.etcd.io/bbolt" ) const ( @@ -26,12 +27,13 @@ const ( ) var ( - errFailedToExecuteStateSync = errors.New("failed to execute state sync") - errUnkownStateSyncRelayerEvent = errors.New("unknown event") + errFailedToExecuteStateSync = errors.New("failed to execute state sync") + errUnknownStateSyncRelayerEvent = errors.New("unknown event") ) // StateSyncRelayer is an interface that defines functions for state sync relayer type StateSyncRelayer interface { + EventSubscriber PostBlock(req *PostBlockRequest) error Init() error Close() @@ -52,6 +54,14 @@ func (d *dummyStakeSyncRelayer) PostBlock(req *PostBlockRequest) error { return func (d *dummyStakeSyncRelayer) Init() error { return nil } func (d *dummyStakeSyncRelayer) Close() {} +// EventSubscriber implementation +func (d *dummyStakeSyncRelayer) GetLogFilters() map[types.Address][]types.Hash { + return make(map[types.Address][]types.Hash) +} +func (d *dummyStakeSyncRelayer) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { + return nil +} + var _ StateSyncRelayer = (*stateSyncRelayerImpl)(nil) // StateSyncRelayerStateData is used to keep state of state sync relayer @@ -89,9 +99,6 @@ type stateSyncRelayerImpl struct { closeCh chan struct{} config *stateSyncRelayerConfig - - // eventsGetter gets contractsapi.NewCommitmentEvent and contractsapi.StateSyncResultEvent from blocks - eventsGetter *eventsGetter[contractsapi.EventAbi] } func NewStateSyncRelayer( @@ -120,33 +127,8 @@ func NewStateSyncRelayer( closeCh: make(chan struct{}), notifyCh: make(chan struct{}, 1), blockchain: blockchain, - eventsGetter: &eventsGetter[contractsapi.EventAbi]{ - blockchain: blockchain, - isValidLogFn: func(l *types.Log) bool { - return l.Address == stateReceiverAddr || l.Address == contracts.StateReceiverContract - }, - parseEventFn: func(_ *types.Header, log *ethgo.Log) (contractsapi.EventAbi, bool, error) { - var ( - commitEvent contractsapi.NewCommitmentEvent - stateSyncResultEvent contractsapi.StateSyncResultEvent - ) - - switch log.Topics[0] { - case commitEvent.Sig(): - doesMatch, err := commitEvent.ParseLog(log) - - return &commitEvent, doesMatch, err - case stateSyncResultEvent.Sig(): - doesMatch, err := stateSyncResultEvent.ParseLog(log) - - return &stateSyncResultEvent, doesMatch, err - default: - return nil, false, errUnkownStateSyncRelayerEvent - } - }, - }, - config: config, - logger: logger, + config: config, + logger: logger, } } @@ -171,57 +153,6 @@ func (ssr *stateSyncRelayerImpl) Close() { } func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { - state, err := ssr.state.StateSyncStore.getStateSyncRelayerStateData() - if err != nil { - return fmt.Errorf("failed to get state sync relayer data: %w", err) - } - - // create default state data if this is the first time - if state == nil { - state = &StateSyncRelayerStateData{LastBlockNumber: 0} - } - - allEvents, err := ssr.eventsGetter.getFromBlocks(state.LastBlockNumber, req.FullBlock) - if err != nil { - return fmt.Errorf("failed to retrieve events from block: %w", err) - } - - newEvents := make([]*StateSyncRelayerEventData, 0) - processedEventIDs := make([]uint64, 0) - failedEventIDs := make([]uint64, 0) - failedReasons := make([]string, 0) - - // process all the events - for _, genEvent := range allEvents { - switch event := genEvent.(type) { - case *contractsapi.NewCommitmentEvent: - for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { - newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) - } - - case *contractsapi.StateSyncResultEvent: - if event.Status { - processedEventIDs = append(processedEventIDs, event.Counter.Uint64()) - } else { - // maybe add failed events as new ones (that would overwrite in db) - // newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: event.Counter.Uint64()}) - failedEventIDs = append(failedEventIDs, event.Counter.Uint64()) - failedReasons = append(failedReasons, string(event.Message)) - } - } - } - - state.LastBlockNumber = req.FullBlock.Block.Number() - - err = ssr.state.StateSyncStore.updateStateSyncRelayerStateData(state, newEvents, processedEventIDs) - if err != nil { - return fmt.Errorf("state sync relayer insert state failed: %w", err) - } - - ssr.logger.Info("state sync relayer updated state", "block", state.LastBlockNumber, - "new", newEvents, "processed", processedEventIDs, - "failed", failedEventIDs, "reasons", failedReasons) - select { case ssr.notifyCh <- struct{}{}: default: @@ -269,7 +200,7 @@ func (ssr *stateSyncRelayerImpl) processEvents() { if len(sendingEvents)+len(removedEventIDs) > 0 { ssr.logger.Info("sending events", "events", sendingEvents, "removed", removedEventIDs) - if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvents(sendingEvents, removedEventIDs); err != nil { + if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvents(sendingEvents, removedEventIDs, nil); err != nil { ssr.logger.Error("updating events failed", "events", sendingEvents, "removed", removedEventIDs, "err", err) @@ -332,6 +263,63 @@ func (ssr *stateSyncRelayerImpl) sendTx(events []*StateSyncRelayerEventData) err return err } +// EventSubscriber implementation + +// GetLogFilters returns a map of log filters for getting desired events, +// where the key is the address of contract that emits desired events, +// and the value is a slice of signatures of events we want to get. +// This function is the implementation of EventSubscriber interface +func (ssr *stateSyncRelayerImpl) GetLogFilters() map[types.Address][]types.Hash { + var ( + stateSyncResultEvent contractsapi.StateSyncResultEvent + newCommitmentEvent contractsapi.NewCommitmentEvent + ) + + return map[types.Address][]types.Hash{ + contracts.StateReceiverContract: { + types.Hash(stateSyncResultEvent.Sig()), + types.Hash(newCommitmentEvent.Sig()), + }, + } +} + +// ProcessLog is the implementation of EventSubscriber interface, +// used to handle a log defined in GetLogFilters, provided by event provider +func (ssr *stateSyncRelayerImpl) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { + genEvent, err := parseRelayerEvent(log) + if err != nil { + return err + } + + var ( + newEvents = make([]*StateSyncRelayerEventData, 0) + processedEventIDs = make([]uint64, 0) + failedEventID uint64 + failedReason string + ) + + switch event := genEvent.(type) { + case *contractsapi.NewCommitmentEvent: + for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { + newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) + } + + case *contractsapi.StateSyncResultEvent: + if event.Status { + processedEventIDs = append(processedEventIDs, event.Counter.Uint64()) + } else { + failedEventID = event.Counter.Uint64() + failedReason = string(event.Message) + } + } + + ssr.logger.Info("state sync relayer updated state", "block", header.Number, + "new", newEvents, "processed", processedEventIDs, + "failed", failedEventID, "reasons", failedReason) + + return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(newEvents, processedEventIDs, dbTx) +} + func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.TxRelayer, error) { if rpcEndpoint == "" || strings.Contains(rpcEndpoint, "0.0.0.0") { _, port, err := net.SplitHostPort(rpcEndpoint) @@ -346,3 +334,29 @@ func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.T txrelayer.WithIPAddress(rpcEndpoint), txrelayer.WithNumRetries(-1), txrelayer.WithWriter(logger.StandardWriter(&hclog.StandardLoggerOptions{}))) } + +func parseRelayerEvent(log *ethgo.Log) (contractsapi.EventAbi, error) { + var ( + commitEvent contractsapi.NewCommitmentEvent + stateSyncResultEvent contractsapi.StateSyncResultEvent + ) + + switch log.Topics[0] { + case commitEvent.Sig(): + _, err := commitEvent.ParseLog(log) + if err != nil { + return nil, err + } + + return &commitEvent, nil + case stateSyncResultEvent.Sig(): + _, err := stateSyncResultEvent.ParseLog(log) + if err != nil { + return nil, err + } + + return &stateSyncResultEvent, nil + default: + return nil, errUnknownStateSyncRelayerEvent + } +} diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index b723218367..ec29d861bc 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -134,12 +134,6 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { time.Sleep(time.Second * 2) // wait for some time - // check if everything is correct, 3 events should be in database, first one should be marked as sent - ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() - - require.NoError(t, err) - require.Equal(t, uint64(2), ssrStateData.LastBlockNumber) - events, err := state.StateSyncStore.getAllAvailableEvents(0) require.NoError(t, err) @@ -164,12 +158,6 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { })) time.Sleep(time.Second * 2) // wait for some time - // check if everything is correct, 3 events should be in database, first one should be marked as sent - ssrStateData, err := state.StateSyncStore.getStateSyncRelayerStateData() - - require.NoError(t, err) - require.Equal(t, bn, ssrStateData.LastBlockNumber) - events, err := state.StateSyncStore.getAllAvailableEvents(0) require.NoError(t, err) From 1703046d99698cf34886b94cfee49eb411758ed1 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Mon, 16 Oct 2023 17:28:50 +0200 Subject: [PATCH 19/27] test fix --- consensus/polybft/state_sync_relayer.go | 96 +++++----- consensus/polybft/state_sync_relayer_test.go | 173 +++++++++---------- 2 files changed, 121 insertions(+), 148 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 6c42b94cdd..4100a8b9cc 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -110,7 +110,7 @@ func NewStateSyncRelayer( key ethgo.Key, config *stateSyncRelayerConfig, logger hclog.Logger, -) StateSyncRelayer { +) *stateSyncRelayerImpl { if config == nil { config = &stateSyncRelayerConfig{ maxBlocksToWaitForResend: defaultMaxBlocksToWaitForResend, @@ -200,7 +200,8 @@ func (ssr *stateSyncRelayerImpl) processEvents() { if len(sendingEvents)+len(removedEventIDs) > 0 { ssr.logger.Info("sending events", "events", sendingEvents, "removed", removedEventIDs) - if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvents(sendingEvents, removedEventIDs, nil); err != nil { + if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvents( + sendingEvents, removedEventIDs, nil); err != nil { ssr.logger.Error("updating events failed", "events", sendingEvents, "removed", removedEventIDs, "err", err) @@ -211,9 +212,9 @@ func (ssr *stateSyncRelayerImpl) processEvents() { // send tx only if needed if len(sendingEvents) > 0 { if err := ssr.sendTx(sendingEvents); err != nil { - ssr.logger.Error("failed to send tx", "events", sendingEvents, "err", err) + ssr.logger.Error("failed to send tx", "block", currentBlockNumber, "events", sendingEvents, "err", err) } else { - ssr.logger.Info("tx has been successfully sent", "events", sendingEvents) + ssr.logger.Info("tx has been successfully sent", "block", currentBlockNumber, "events", sendingEvents) } } } @@ -286,38 +287,53 @@ func (ssr *stateSyncRelayerImpl) GetLogFilters() map[types.Address][]types.Hash // ProcessLog is the implementation of EventSubscriber interface, // used to handle a log defined in GetLogFilters, provided by event provider func (ssr *stateSyncRelayerImpl) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { - genEvent, err := parseRelayerEvent(log) - if err != nil { - return err - } - var ( - newEvents = make([]*StateSyncRelayerEventData, 0) - processedEventIDs = make([]uint64, 0) - failedEventID uint64 - failedReason string + commitEvent contractsapi.NewCommitmentEvent + stateSyncResultEvent contractsapi.StateSyncResultEvent ) - switch event := genEvent.(type) { - case *contractsapi.NewCommitmentEvent: - for i := event.StartID.Uint64(); i <= event.EndID.Uint64(); i++ { + switch log.Topics[0] { + case commitEvent.Sig(): + _, err := commitEvent.ParseLog(log) + if err != nil { + return err + } + + newEvents := []*StateSyncRelayerEventData{} + + for i := commitEvent.StartID.Uint64(); i <= commitEvent.EndID.Uint64(); i++ { newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) } - case *contractsapi.StateSyncResultEvent: - if event.Status { - processedEventIDs = append(processedEventIDs, event.Counter.Uint64()) - } else { - failedEventID = event.Counter.Uint64() - failedReason = string(event.Message) + ssr.logger.Info("new events has been arrived", "block", header.Number, "events", newEvents) + + return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(newEvents, nil, dbTx) + + case stateSyncResultEvent.Sig(): + _, err := stateSyncResultEvent.ParseLog(log) + if err != nil { + return err + } + + eventID := stateSyncResultEvent.Counter.Uint64() + + if stateSyncResultEvent.Status { + ssr.logger.Info("event has been processed", "block", header.Number, "event", eventID) + + return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(nil, []uint64{eventID}, dbTx) } - } - ssr.logger.Info("state sync relayer updated state", "block", header.Number, - "new", newEvents, "processed", processedEventIDs, - "failed", failedEventID, "reasons", failedReason) + // maybe add failed events as new ones (that would overwrite in db) + // return ssr.state.StateSyncStore.updateStateSyncRelayerEvents( + // &StateSyncRelayerEventData{EventID: eventID}, nil, dbTx) + ssr.logger.Info("event has been failed to process", "block", header.Number, + "event", eventID, "reason", string(stateSyncResultEvent.Message)) - return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(newEvents, processedEventIDs, dbTx) + return nil + + default: + return errUnknownStateSyncRelayerEvent + } } func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.TxRelayer, error) { @@ -334,29 +350,3 @@ func getStateSyncTxRelayer(rpcEndpoint string, logger hclog.Logger) (txrelayer.T txrelayer.WithIPAddress(rpcEndpoint), txrelayer.WithNumRetries(-1), txrelayer.WithWriter(logger.StandardWriter(&hclog.StandardLoggerOptions{}))) } - -func parseRelayerEvent(log *ethgo.Log) (contractsapi.EventAbi, error) { - var ( - commitEvent contractsapi.NewCommitmentEvent - stateSyncResultEvent contractsapi.StateSyncResultEvent - ) - - switch log.Topics[0] { - case commitEvent.Sig(): - _, err := commitEvent.ParseLog(log) - if err != nil { - return nil, err - } - - return &commitEvent, nil - case stateSyncResultEvent.Sig(): - _, err := stateSyncResultEvent.ParseLog(log) - if err != nil { - return nil, err - } - - return &stateSyncResultEvent, nil - default: - return nil, errUnknownStateSyncRelayerEvent - } -} diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index ec29d861bc..60a540085c 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -15,62 +15,25 @@ import ( "github.com/umbracle/ethgo/abi" ) -func TestStateSyncRelayer_PostBlock(t *testing.T) { +func TestStateSyncRelayer_FullWorkflow(t *testing.T) { t.Parallel() testKey := createTestKey(t) - successStatus := types.ReceiptSuccess - block1Hash := types.StringToHash("x087887823ff23423") stateSyncAddr := types.StringToAddress("0x56563") - result1Log := createTestLogForStateSyncResultEvent(t, 1) - result2Log := createTestLogForStateSyncResultEvent(t, 2) - result3Log := createTestLogForStateSyncResultEvent(t, 3) - result4Log := createTestLogForStateSyncResultEvent(t, 4) - commitment1Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 2, 3, types.StringToHash("0x2")) - commitment2Log := createTestLogForNewCommitmentEvent(t, stateSyncAddr, 4, 4, types.StringToHash("0x3")) - receipts := [][]*types.Receipt{ - { - { - Status: &successStatus, - Logs: []*types.Log{ - {}, commitment1Log, result1Log, - }, - }, - }, - { - { - Status: &successStatus, - Logs: []*types.Log{ - {}, commitment2Log, - }, - }, - }, - { - { - Status: &successStatus, - Logs: []*types.Log{ - result2Log, - }, - }, - }, - { - { - Status: &successStatus, - Logs: []*types.Log{ - result3Log, - }, - }, - }, - {}, - { - { - Status: &successStatus, - Logs: []*types.Log{ - result4Log, - }, - }, - }, + resultLogs := []*types.Log{ + createTestLogForStateSyncResultEvent(t, 1), createTestLogForStateSyncResultEvent(t, 2), + createTestLogForStateSyncResultEvent(t, 3), createTestLogForStateSyncResultEvent(t, 4), + createTestLogForStateSyncResultEvent(t, 5), + } + commitmentLogs := []*types.Log{ + createTestLogForNewCommitmentEvent(t, stateSyncAddr, 1, 1, types.StringToHash("0x2")), + createTestLogForNewCommitmentEvent(t, stateSyncAddr, 2, 3, types.StringToHash("0x2")), + createTestLogForNewCommitmentEvent(t, stateSyncAddr, 4, 5, types.StringToHash("0x2")), + } + + headers := []*types.Header{ + {Number: 2}, {Number: 3}, {Number: 4}, {Number: 5}, {Number: 5}, } proofMock := &mockStateSyncProofRetriever{ @@ -107,30 +70,24 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { hclog.Default(), ) - blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 2}).Once() - blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 3}).Once() - blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 4}).Once() - blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 5}).Once() - blockhainMock.On("CurrentHeader").Return(&types.Header{Number: 6}).Once() - blockhainMock.On("GetReceiptsByHash", block1Hash).Return(receipts[0], nil).Once() - blockhainMock.On("GetHeaderByNumber", uint64(1)).Return(&types.Header{Hash: block1Hash}).Once() + for _, h := range headers { + blockhainMock.On("CurrentHeader").Return(h).Once() + } + + // send first two events without errors dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), nil).Times(2) - dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), errors.New("e")).Once() + // fail 3rd time + dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return( + (*ethgo.Receipt)(nil), errors.New("e")).Once() + // send 3 events all at once at the end dummyTxRelayer.On("SendTransaction", mock.Anything, testKey).Return((*ethgo.Receipt)(nil), nil).Once() require.NoError(t, stateSyncRelayer.Init()) - // post first block (number 2) - require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ - FullBlock: &types.FullBlock{ - Block: &types.Block{ - Header: &types.Header{ - Number: 2, - }, - }, - Receipts: receipts[1], - }, - })) + // post 1st block + require.NoError(t, stateSyncRelayer.ProcessLog(headers[0], convertLog(commitmentLogs[0]), nil)) + require.NoError(t, stateSyncRelayer.ProcessLog(headers[0], convertLog(commitmentLogs[1]), nil)) + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{})) time.Sleep(time.Second * 2) // wait for some time @@ -138,40 +95,66 @@ func TestStateSyncRelayer_PostBlock(t *testing.T) { require.NoError(t, err) require.Len(t, events, 3) + require.Equal(t, uint64(1), events[0].EventID) require.True(t, events[0].SentStatus) require.False(t, events[1].SentStatus) require.False(t, events[2].SentStatus) - for bn := uint64(3); bn <= uint64(6); bn++ { - t.Logf("processing block %d", bn) + // post 2nd block + require.NoError(t, stateSyncRelayer.ProcessLog(headers[1], convertLog(resultLogs[0]), nil)) + require.NoError(t, stateSyncRelayer.ProcessLog(headers[1], convertLog(commitmentLogs[2]), nil)) + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{})) - // post second block - require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{ - FullBlock: &types.FullBlock{ - Block: &types.Block{ - Header: &types.Header{ - Number: bn, - }, - }, - Receipts: receipts[bn-1], - }, - })) - time.Sleep(time.Second * 2) // wait for some time + time.Sleep(time.Second * 2) // wait for some time + + events, err = state.StateSyncStore.getAllAvailableEvents(0) + + require.NoError(t, err) + require.Len(t, events, 4) + require.True(t, events[0].SentStatus) + require.Equal(t, uint64(2), events[0].EventID) + require.False(t, events[1].SentStatus) + require.False(t, events[2].SentStatus) - events, err := state.StateSyncStore.getAllAvailableEvents(0) + // post 3rd block + require.NoError(t, stateSyncRelayer.ProcessLog(headers[2], convertLog(resultLogs[1]), nil)) + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{})) - require.NoError(t, err) + time.Sleep(time.Second * 2) // wait for some time - if bn < 5 { // on block 5 sending fails - require.Len(t, events, 5-int(bn)) - } else { - require.Len(t, events, 6-int(bn)) - } + events, err = state.StateSyncStore.getAllAvailableEvents(0) - for i, e := range events { - require.Equal(t, i == 0, e.SentStatus) - } - } + require.NoError(t, err) + require.Len(t, events, 3) + require.True(t, events[0].SentStatus) + require.Equal(t, uint64(3), events[0].EventID) + require.False(t, events[1].SentStatus) + + // post 4th block - will not provide result, so one more SendTransaction will be triggered + stateSyncRelayer.config.maxEventsPerBatch = 3 // send all 3 left events at once + + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{})) + + time.Sleep(time.Second * 2) // wait for some time + + events, err = state.StateSyncStore.getAllAvailableEvents(0) + + require.NoError(t, err) + require.Len(t, events, 3) + require.True(t, events[0].SentStatus && events[1].SentStatus && events[2].SentStatus) + + // post 5th block + require.NoError(t, stateSyncRelayer.ProcessLog(headers[4], convertLog(resultLogs[2]), nil)) + require.NoError(t, stateSyncRelayer.ProcessLog(headers[4], convertLog(resultLogs[3]), nil)) + require.NoError(t, stateSyncRelayer.ProcessLog(headers[4], convertLog(resultLogs[4]), nil)) + require.NoError(t, stateSyncRelayer.PostBlock(&PostBlockRequest{})) + + time.Sleep(time.Second * 2) // wait for some time + + events, err = state.StateSyncStore.getAllAvailableEvents(0) + + require.NoError(t, err) + require.Len(t, events, 0) stateSyncRelayer.Close() time.Sleep(time.Second) From 5cfa1e2b757c7c5f5dea4acba3c942403f03c754 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 09:48:42 +0200 Subject: [PATCH 20/27] removing unnecessary things --- consensus/polybft/state_sync_relayer.go | 5 - .../statesyncrelayer/state_sync_relayer.go | 240 ------------------ .../state_sync_relayer_test.go | 131 ---------- 3 files changed, 376 deletions(-) delete mode 100644 consensus/polybft/statesyncrelayer/state_sync_relayer.go delete mode 100644 consensus/polybft/statesyncrelayer/state_sync_relayer_test.go diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 4100a8b9cc..8c8820e352 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -64,11 +64,6 @@ func (d *dummyStakeSyncRelayer) ProcessLog(header *types.Header, log *ethgo.Log, var _ StateSyncRelayer = (*stateSyncRelayerImpl)(nil) -// StateSyncRelayerStateData is used to keep state of state sync relayer -type StateSyncRelayerStateData struct { - LastBlockNumber uint64 `json:"lastBlockNumber"` -} - // StateSyncRelayerEventData keeps information about an event type StateSyncRelayerEventData struct { EventID uint64 `json:"eventID"` diff --git a/consensus/polybft/statesyncrelayer/state_sync_relayer.go b/consensus/polybft/statesyncrelayer/state_sync_relayer.go deleted file mode 100644 index 62c901b376..0000000000 --- a/consensus/polybft/statesyncrelayer/state_sync_relayer.go +++ /dev/null @@ -1,240 +0,0 @@ -package statesyncrelayer - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net" - "path" - "strings" - "time" - - "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" - "github.com/0xPolygon/polygon-edge/contracts" - "github.com/0xPolygon/polygon-edge/tracker" - "github.com/0xPolygon/polygon-edge/txrelayer" - "github.com/0xPolygon/polygon-edge/types" - - hcf "github.com/hashicorp/go-hclog" - "github.com/umbracle/ethgo" - "github.com/umbracle/ethgo/jsonrpc" -) - -type StateSyncRelayer struct { - dataDir string - rpcEndpoint string - stateReceiverAddr ethgo.Address - eventTrackerStartBlock uint64 - logger hcf.Logger - client *jsonrpc.Client - txRelayer txrelayer.TxRelayer - key ethgo.Key - closeCh chan struct{} - pollInterval time.Duration -} - -func sanitizeRPCEndpoint(rpcEndpoint string) string { - if rpcEndpoint == "" || strings.Contains(rpcEndpoint, "0.0.0.0") { - _, port, err := net.SplitHostPort(rpcEndpoint) - if err == nil { - rpcEndpoint = fmt.Sprintf("http://%s:%s", "127.0.0.1", port) - } else { - rpcEndpoint = txrelayer.DefaultRPCAddress - } - } - - return rpcEndpoint -} - -func NewRelayer( - dataDir string, - rpcEndpoint string, - stateReceiverAddr ethgo.Address, - stateReceiverTrackerStartBlock uint64, - logger hcf.Logger, - key ethgo.Key, - pollInterval time.Duration, -) *StateSyncRelayer { - endpoint := sanitizeRPCEndpoint(rpcEndpoint) - - // create the JSON RPC client - client, err := jsonrpc.NewClient(endpoint) - if err != nil { - logger.Error("Failed to create the JSON RPC client", "err", err) - - return nil - } - - txRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithClient(client)) - if err != nil { - logger.Error("Failed to create the tx relayer", "err", err) - } - - return &StateSyncRelayer{ - dataDir: dataDir, - rpcEndpoint: endpoint, - stateReceiverAddr: stateReceiverAddr, - logger: logger, - client: client, - txRelayer: txRelayer, - key: key, - closeCh: make(chan struct{}), - eventTrackerStartBlock: stateReceiverTrackerStartBlock, - pollInterval: pollInterval, - } -} - -func (r *StateSyncRelayer) Start() error { - et := tracker.NewEventTracker( - path.Join(r.dataDir, "/relayer.db"), - r.rpcEndpoint, - r.stateReceiverAddr, - r, - 0, // sidechain (Polygon POS) is instant finality, so no need to wait - r.eventTrackerStartBlock, - r.logger, - r.pollInterval, - ) - - ctx, cancelFn := context.WithCancel(context.Background()) - - go func() { - <-r.closeCh - cancelFn() - }() - - return et.Start(ctx) -} - -// Stop function is used to tear down all the allocated resources -func (r *StateSyncRelayer) Stop() { - close(r.closeCh) -} - -func (r *StateSyncRelayer) AddLog(log *ethgo.Log) error { - r.logger.Debug("Received a log", "log", log) - - var commitEvent contractsapi.NewCommitmentEvent - - doesMatch, err := commitEvent.ParseLog(log) - if !doesMatch { - return nil - } - - if err != nil { - r.logger.Error("Failed to parse log", "err", err) - - return err - } - - startID := commitEvent.StartID.Uint64() - endID := commitEvent.EndID.Uint64() - - r.logger.Info("Execute commitment", "Block", log.BlockNumber, "StartID", startID, "EndID", endID) - - // we don't return errors if some client logic fails, - // only if event is not parsed - for i := startID; i <= endID; i++ { - // query the state sync proof - stateSyncProof, err := r.queryStateSyncProof(fmt.Sprintf("0x%x", i)) - if err != nil { - r.logger.Error("Failed to query state sync proof", "err", err) - - continue - } - - if err := r.executeStateSync(stateSyncProof); err != nil { - r.logger.Error("State sync execution failed", "err", err) - - continue - } - - r.logger.Info("State sync executed", "ID", i) - } - - return nil -} - -// queryStateSyncProof queries the state sync proof -func (r *StateSyncRelayer) queryStateSyncProof(stateSyncID string) (*types.Proof, error) { - // retrieve state sync proof - var stateSyncProof types.Proof - - err := r.client.Call("bridge_getStateSyncProof", &stateSyncProof, stateSyncID) - if err != nil { - return nil, err - } - - r.logger.Debug(fmt.Sprintf("state sync proof: %v", stateSyncProof)) - - return &stateSyncProof, nil -} - -// executeStateSync executes the state sync -func (r *StateSyncRelayer) executeStateSync(proof *types.Proof) error { - sseMap, ok := proof.Metadata["StateSync"].(map[string]interface{}) - if !ok { - return errors.New("could not get state sync event from proof") - } - - var sse *contractsapi.StateSync - - // since state sync event is a map in the jsonrpc response, - // to not have custom logic of converting the map to state sync event - // json encoding is used, since it manages to successfully unmarshal the - // event from the marshaled map - raw, err := json.Marshal(sseMap) - if err != nil { - return fmt.Errorf("failed to marshal state sync map into JSON. Error: %w", err) - } - - if err = json.Unmarshal(raw, &sse); err != nil { - return fmt.Errorf("failed to unmarshal state sync event from JSON. Error: %w", err) - } - - execute := &contractsapi.ExecuteStateReceiverFn{ - Proof: proof.Data, - Obj: sse, - } - - input, err := execute.EncodeAbi() - if err != nil { - return err - } - - // execute the state sync - txn := ðgo.Transaction{ - From: r.key.Address(), - To: (*ethgo.Address)(&contracts.StateReceiverContract), - Gas: types.StateTransactionGasLimit, - Input: input, - } - - receipt, err := r.txRelayer.SendTransaction(txn, r.key) - if err != nil { - return fmt.Errorf("failed to send execute state sync transaction for id %d: %w", sse.ID, err) - } - - if receipt.Status == uint64(types.ReceiptFailed) { - return fmt.Errorf("transaction execution reverted for state sync id: %d", sse.ID) - } - - var stateSyncResult contractsapi.StateSyncResultEvent - for _, log := range receipt.Logs { - matches, err := stateSyncResult.ParseLog(log) - if err != nil { - return fmt.Errorf("failed to find state sync event result log for state sync id: %d", sse.ID) - } - - if !matches { - continue - } - - if !stateSyncResult.Status { - return fmt.Errorf("failed to execute state sync id: %d", sse.ID) - } - } - - return nil -} diff --git a/consensus/polybft/statesyncrelayer/state_sync_relayer_test.go b/consensus/polybft/statesyncrelayer/state_sync_relayer_test.go deleted file mode 100644 index 65341dcc91..0000000000 --- a/consensus/polybft/statesyncrelayer/state_sync_relayer_test.go +++ /dev/null @@ -1,131 +0,0 @@ -package statesyncrelayer - -import ( - "math/big" - "testing" - "time" - - "github.com/0xPolygon/polygon-edge/contracts" - "github.com/0xPolygon/polygon-edge/txrelayer" - "github.com/0xPolygon/polygon-edge/types" - "github.com/hashicorp/go-hclog" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "github.com/umbracle/ethgo" - "github.com/umbracle/ethgo/jsonrpc" - "github.com/umbracle/ethgo/wallet" -) - -var _ txrelayer.TxRelayer = (*txRelayerMock)(nil) - -type txRelayerMock struct { - mock.Mock -} - -func (t *txRelayerMock) Call(from ethgo.Address, to ethgo.Address, input []byte) (string, error) { - args := t.Called(from, to, input) - - return args.String(0), args.Error(1) -} - -func (t *txRelayerMock) SendTransaction(txn *ethgo.Transaction, key ethgo.Key) (*ethgo.Receipt, error) { - args := t.Called(txn, key) - - return args.Get(0).(*ethgo.Receipt), args.Error(1) //nolint:forcetypeassert -} - -func (t *txRelayerMock) SendTransactionLocal(txn *ethgo.Transaction) (*ethgo.Receipt, error) { - args := t.Called(txn) - - return nil, args.Error(1) -} - -func (t *txRelayerMock) Client() *jsonrpc.Client { - return nil -} - -func Test_executeStateSync(t *testing.T) { - t.Parallel() - - txRelayer := &txRelayerMock{} - key, _ := wallet.GenerateKey() - - r := &StateSyncRelayer{ - txRelayer: txRelayer, - key: key, - } - - txRelayer.On("SendTransaction", mock.Anything, mock.Anything). - Return(ðgo.Receipt{Status: uint64(types.ReceiptSuccess)}, nil).Once() - - proof := &types.Proof{ - Data: []types.Hash{}, - Metadata: map[string]interface{}{ - "StateSync": map[string]interface{}{ - "ID": big.NewInt(1), - "Sender": types.ZeroAddress, - "Receiver": types.ZeroAddress, - "Data": []byte{}, - }, - }, - } - - require.NoError(t, r.executeStateSync(proof)) - - txRelayer.AssertExpectations(t) -} - -// Test sanitizeRPCEndpoint -func Test_sanitizeRPCEndpoint(t *testing.T) { - t.Parallel() - - tests := []struct { - name string - endpoint string - want string - }{ - { - "url with port", - "http://localhost:10001", - "http://localhost:10001", - }, - { - "all interfaces with port without schema", - "0.0.0.0:10001", - "http://127.0.0.1:10001", - }, - { - "url without port", - "http://127.0.0.1", - "http://127.0.0.1", - }, - { - "empty endpoint", - "", - txrelayer.DefaultRPCAddress, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - - if got := sanitizeRPCEndpoint(tt.endpoint); got != tt.want { - t.Errorf("sanitizeRPCEndpoint() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestStateSyncRelayer_Stop(t *testing.T) { - t.Parallel() - - key, err := wallet.GenerateKey() - require.NoError(t, err) - - r := NewRelayer("test-chain-1", txrelayer.DefaultRPCAddress, ethgo.Address(contracts.StateReceiverContract), - 0, hclog.NewNullLogger(), key, time.Second) - - require.NotPanics(t, func() { r.Stop() }) -} From 48c0d9af6ae9f58467e893deb2ebddea86989845 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 10:23:29 +0200 Subject: [PATCH 21/27] cr fix --- consensus/polybft/state_sync_relayer.go | 35 +++++++++++-------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 8c8820e352..b3e8ec8c2a 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -83,12 +83,12 @@ type stateSyncRelayerConfig struct { } type stateSyncRelayerImpl struct { - txRelayer txrelayer.TxRelayer - key ethgo.Key - store stateSyncProofRetriever - state *State - logger hclog.Logger - blockchain blockchainBackend + txRelayer txrelayer.TxRelayer + key ethgo.Key + proofRetriever stateSyncProofRetriever + state *State + logger hclog.Logger + blockchain blockchainBackend notifyCh chan struct{} closeCh chan struct{} @@ -115,15 +115,15 @@ func NewStateSyncRelayer( } return &stateSyncRelayerImpl{ - txRelayer: txRelayer, - key: key, - store: store, - state: state, - closeCh: make(chan struct{}), - notifyCh: make(chan struct{}, 1), - blockchain: blockchain, - config: config, - logger: logger, + txRelayer: txRelayer, + key: key, + proofRetriever: store, + state: state, + closeCh: make(chan struct{}), + notifyCh: make(chan struct{}, 1), + blockchain: blockchain, + config: config, + logger: logger, } } @@ -219,7 +219,7 @@ func (ssr *stateSyncRelayerImpl) sendTx(events []*StateSyncRelayerEventData) err objs := make([]*contractsapi.StateSync, len(events)) for i, event := range events { - proof, err := ssr.store.GetStateSyncProof(event.EventID) + proof, err := ssr.proofRetriever.GetStateSyncProof(event.EventID) if err != nil { return fmt.Errorf("failed to get proof for %d: %w", event.EventID, err) } @@ -318,9 +318,6 @@ func (ssr *stateSyncRelayerImpl) ProcessLog(header *types.Header, log *ethgo.Log return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(nil, []uint64{eventID}, dbTx) } - // maybe add failed events as new ones (that would overwrite in db) - // return ssr.state.StateSyncStore.updateStateSyncRelayerEvents( - // &StateSyncRelayerEventData{EventID: eventID}, nil, dbTx) ssr.logger.Info("event has been failed to process", "block", header.Number, "event", eventID, "reason", string(stateSyncResultEvent.Message)) From ab5a2348f676eb2c6c3876bc341a1852a2dfd46f Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 10:50:32 +0200 Subject: [PATCH 22/27] deleting proofs should stay at state sync manager - every node is not a relayer --- consensus/polybft/state_store_state_sync.go | 33 ++++++++++----- consensus/polybft/state_sync_manager.go | 32 ++++++++++++++ consensus/polybft/state_sync_manager_test.go | 44 ++++++++++++++++++++ 3 files changed, 98 insertions(+), 11 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index f5015a7d53..e8a5efca2f 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -88,6 +88,28 @@ func (s *StateSyncStore) insertStateSyncEvent(event *contractsapi.StateSyncedEve }) } +// removeStateSyncEventsAndProofs removes state sync events and their proofs from the buckets in db +func (s *StateSyncStore) removeStateSyncEventsAndProofs(stateSyncEventIDs []uint64) error { + return s.db.Update(func(tx *bolt.Tx) error { + eventsBucket := tx.Bucket(stateSyncEventsBucket) + proofsBucket := tx.Bucket(stateSyncProofsBucket) + + for _, stateSyncEventID := range stateSyncEventIDs { + stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) + + if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) + } + + if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { + return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) + } + } + + return nil + }) +} + // list iterates through all events in events bucket in db, un-marshals them, and returns as array func (s *StateSyncStore) list() ([]*contractsapi.StateSyncedEvent, error) { events := []*contractsapi.StateSyncedEvent{} @@ -375,20 +397,9 @@ func (s *StateSyncStore) updateStateSyncRelayerEvents( } } - eventsBucket := tx.Bucket(stateSyncEventsBucket) - proofsBucket := tx.Bucket(stateSyncProofsBucket) - for _, stateSyncEventID := range removeIDs { stateSyncEventIDKey := common.EncodeUint64ToBytes(stateSyncEventID) - if err := eventsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event (ID=%d): %w", stateSyncEventID, err) - } - - if err := proofsBucket.Delete(stateSyncEventIDKey); err != nil { - return fmt.Errorf("failed to remove state sync event proof (ID=%d): %w", stateSyncEventID, err) - } - if err := relayerEventsBucket.Delete(stateSyncEventIDKey); err != nil { return fmt.Errorf("failed to remove state sync relayer event (ID=%d): %w", stateSyncEventID, err) } diff --git a/consensus/polybft/state_sync_manager.go b/consensus/polybft/state_sync_manager.go index 6d0f97e090..a919a881e3 100644 --- a/consensus/polybft/state_sync_manager.go +++ b/consensus/polybft/state_sync_manager.go @@ -16,6 +16,7 @@ import ( bls "github.com/0xPolygon/polygon-edge/consensus/polybft/signer" "github.com/0xPolygon/polygon-edge/consensus/polybft/validator" "github.com/0xPolygon/polygon-edge/consensus/polybft/wallet" + "github.com/0xPolygon/polygon-edge/contracts" "github.com/0xPolygon/polygon-edge/tracker" "github.com/0xPolygon/polygon-edge/types" "github.com/hashicorp/go-hclog" @@ -605,3 +606,34 @@ func (s *stateSyncManager) multicast(msg interface{}) { s.logger.Warn("failed to gossip bridge message", "err", err) } } + +// EventSubscriber implementation + +// GetLogFilters returns a map of log filters for getting desired events, +// where the key is the address of contract that emits desired events, +// and the value is a slice of signatures of events we want to get. +// This function is the implementation of EventSubscriber interface +func (s *stateSyncManager) GetLogFilters() map[types.Address][]types.Hash { + var stateSyncResultEvent contractsapi.StateSyncResultEvent + + return map[types.Address][]types.Hash{ + contracts.StateReceiverContract: {types.Hash(stateSyncResultEvent.Sig())}, + } +} + +// ProcessLog is the implementation of EventSubscriber interface, +// used to handle a log defined in GetLogFilters, provided by event provider +func (s *stateSyncManager) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { + var stateSyncResultEvent contractsapi.StateSyncResultEvent + + doesMatch, err := stateSyncResultEvent.ParseLog(log) + if err != nil { + return err + } + + if !doesMatch { + return nil + } + + return s.state.StateSyncStore.removeStateSyncEventsAndProofs([]uint64{stateSyncResultEvent.Counter.Uint64()}) +} diff --git a/consensus/polybft/state_sync_manager_test.go b/consensus/polybft/state_sync_manager_test.go index cea28419fd..4748f074ac 100644 --- a/consensus/polybft/state_sync_manager_test.go +++ b/consensus/polybft/state_sync_manager_test.go @@ -326,6 +326,50 @@ func TestStateSyncerManager_BuildProofs(t *testing.T) { } } +func TestStateSyncerManager_RemoveProcessedEventsAndProofs(t *testing.T) { + const stateSyncEventsCount = 5 + + vals := validator.NewTestValidators(t, 5) + + s := newTestStateSyncManager(t, vals.GetValidator("0"), &mockRuntime{isActiveValidator: true}) + stateSyncEvents := generateStateSyncEvents(t, stateSyncEventsCount, 0) + + for _, event := range stateSyncEvents { + require.NoError(t, s.state.StateSyncStore.insertStateSyncEvent(event)) + } + + require.NoError(t, s.buildProofs(&contractsapi.StateSyncCommitment{ + StartID: stateSyncEvents[0].ID, + EndID: stateSyncEvents[len(stateSyncEvents)-1].ID, + }, nil)) + + stateSyncEventsBefore, err := s.state.StateSyncStore.list() + require.NoError(t, err) + require.Equal(t, stateSyncEventsCount, len(stateSyncEventsBefore)) + + for _, event := range stateSyncEvents { + proof, err := s.state.StateSyncStore.getStateSyncProof(event.ID.Uint64()) + require.NoError(t, err) + require.NotNil(t, proof) + } + + for _, event := range stateSyncEvents { + eventLog := createTestLogForStateSyncResultEvent(t, event.ID.Uint64()) + require.NoError(t, s.ProcessLog(&types.Header{Number: 10}, convertLog(eventLog), nil)) + } + + // all state sync events and their proofs should be removed from the store + stateSyncEventsAfter, err := s.state.StateSyncStore.list() + require.NoError(t, err) + require.Equal(t, 0, len(stateSyncEventsAfter)) + + for _, event := range stateSyncEvents { + proof, err := s.state.StateSyncStore.getStateSyncProof(event.ID.Uint64()) + require.NoError(t, err) + require.Nil(t, proof) + } +} + func TestStateSyncerManager_AddLog_BuildCommitments(t *testing.T) { t.Parallel() From 648a4f5c02d020891a5e3f1d3c9be482dc8c8639 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 13:03:35 +0200 Subject: [PATCH 23/27] cr fixes --- consensus/polybft/consensus_runtime.go | 7 ++-- consensus/polybft/consensus_runtime_test.go | 2 +- consensus/polybft/polybft_test.go | 2 +- consensus/polybft/state_sync_relayer.go | 43 +++++++++++--------- consensus/polybft/state_sync_relayer_test.go | 2 +- 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/consensus/polybft/consensus_runtime.go b/consensus/polybft/consensus_runtime.go index 3ab2d5d73b..238b004bd5 100644 --- a/consensus/polybft/consensus_runtime.go +++ b/consensus/polybft/consensus_runtime.go @@ -249,10 +249,9 @@ func (c *consensusRuntime) initCheckpointManager(logger hcf.Logger) error { } // initStateSyncRelayer initializes state sync relayer -// if not enabled, then a dummy checkpoint manager will be used +// if not enabled, then a dummy state sync relayer will be used func (c *consensusRuntime) initStateSyncRelayer(logger hcf.Logger) error { if c.config.IsRelayer { - // enable checkpoint manager txRelayer, err := getStateSyncTxRelayer(c.config.RPCEndpoint, logger) if err != nil { return err @@ -261,14 +260,14 @@ func (c *consensusRuntime) initStateSyncRelayer(logger hcf.Logger) error { c.stateSyncRelayer = NewStateSyncRelayer( txRelayer, contracts.StateReceiverContract, - c.state, + c.state.StateSyncStore, c, c.config.blockchain, wallet.NewEcdsaSigner(c.config.Key), nil, logger.Named("state_sync_relayer")) } else { - c.stateSyncRelayer = &dummyStakeSyncRelayer{} + c.stateSyncRelayer = &dummyStateSyncRelayer{} } c.eventProvider.Subscribe(c.stateSyncRelayer) diff --git a/consensus/polybft/consensus_runtime_test.go b/consensus/polybft/consensus_runtime_test.go index 01654879ce..cc1895e641 100644 --- a/consensus/polybft/consensus_runtime_test.go +++ b/consensus/polybft/consensus_runtime_test.go @@ -232,7 +232,7 @@ func TestConsensusRuntime_OnBlockInserted_EndOfEpoch(t *testing.T) { checkpointManager: &dummyCheckpointManager{}, stakeManager: &dummyStakeManager{}, eventProvider: NewEventProvider(blockchainMock), - stateSyncRelayer: &dummyStakeSyncRelayer{}, + stateSyncRelayer: &dummyStateSyncRelayer{}, } runtime.OnBlockInserted(&types.FullBlock{Block: builtBlock}) diff --git a/consensus/polybft/polybft_test.go b/consensus/polybft/polybft_test.go index 0216eb5f0c..8d8f44f10f 100644 --- a/consensus/polybft/polybft_test.go +++ b/consensus/polybft/polybft_test.go @@ -210,7 +210,7 @@ func TestPolybft_Close(t *testing.T) { syncer: syncer, runtime: &consensusRuntime{ stateSyncManager: &dummyStateSyncManager{}, - stateSyncRelayer: &dummyStakeSyncRelayer{}, + stateSyncRelayer: &dummyStateSyncRelayer{}, }, } diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index b3e8ec8c2a..239259d175 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -29,6 +29,9 @@ const ( var ( errFailedToExecuteStateSync = errors.New("failed to execute state sync") errUnknownStateSyncRelayerEvent = errors.New("unknown event") + + commitmentEventSignature = new(contractsapi.NewCommitmentEvent).Sig() + stateSyncResultEventSignnature = new(contractsapi.StateSyncResultEvent).Sig() ) // StateSyncRelayer is an interface that defines functions for state sync relayer @@ -44,21 +47,21 @@ type stateSyncProofRetriever interface { GetStateSyncProof(stateSyncID uint64) (types.Proof, error) } -var _ StateSyncRelayer = (*dummyStakeSyncRelayer)(nil) +var _ StateSyncRelayer = (*dummyStateSyncRelayer)(nil) -// dummyStakeSyncRelayer is a dummy implementation of a StateSyncRelayer -type dummyStakeSyncRelayer struct{} +// dummyStateSyncRelayer is a dummy implementation of a StateSyncRelayer +type dummyStateSyncRelayer struct{} -func (d *dummyStakeSyncRelayer) PostBlock(req *PostBlockRequest) error { return nil } +func (d *dummyStateSyncRelayer) PostBlock(req *PostBlockRequest) error { return nil } -func (d *dummyStakeSyncRelayer) Init() error { return nil } -func (d *dummyStakeSyncRelayer) Close() {} +func (d *dummyStateSyncRelayer) Init() error { return nil } +func (d *dummyStateSyncRelayer) Close() {} // EventSubscriber implementation -func (d *dummyStakeSyncRelayer) GetLogFilters() map[types.Address][]types.Hash { +func (d *dummyStateSyncRelayer) GetLogFilters() map[types.Address][]types.Hash { return make(map[types.Address][]types.Hash) } -func (d *dummyStakeSyncRelayer) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { +func (d *dummyStateSyncRelayer) ProcessLog(header *types.Header, log *ethgo.Log, dbTx *bolt.Tx) error { return nil } @@ -86,7 +89,7 @@ type stateSyncRelayerImpl struct { txRelayer txrelayer.TxRelayer key ethgo.Key proofRetriever stateSyncProofRetriever - state *State + state *StateSyncStore logger hclog.Logger blockchain blockchainBackend @@ -99,7 +102,7 @@ type stateSyncRelayerImpl struct { func NewStateSyncRelayer( txRelayer txrelayer.TxRelayer, stateReceiverAddr types.Address, - state *State, + state *StateSyncStore, store stateSyncProofRetriever, blockchain blockchainBackend, key ethgo.Key, @@ -158,7 +161,7 @@ func (ssr *stateSyncRelayerImpl) PostBlock(req *PostBlockRequest) error { func (ssr *stateSyncRelayerImpl) processEvents() { // we need twice as batch size because events from first batch are possible already sent maxAttemptsToSend times - events, err := ssr.state.StateSyncStore.getAllAvailableEvents(int(ssr.config.maxEventsPerBatch) * 2) + events, err := ssr.state.getAllAvailableEvents(int(ssr.config.maxEventsPerBatch) * 2) if err != nil { ssr.logger.Error("retrieving events failed", "err", err) @@ -195,8 +198,7 @@ func (ssr *stateSyncRelayerImpl) processEvents() { if len(sendingEvents)+len(removedEventIDs) > 0 { ssr.logger.Info("sending events", "events", sendingEvents, "removed", removedEventIDs) - if err := ssr.state.StateSyncStore.updateStateSyncRelayerEvents( - sendingEvents, removedEventIDs, nil); err != nil { + if err := ssr.state.updateStateSyncRelayerEvents(sendingEvents, removedEventIDs, nil); err != nil { ssr.logger.Error("updating events failed", "events", sendingEvents, "removed", removedEventIDs, "err", err) @@ -288,23 +290,24 @@ func (ssr *stateSyncRelayerImpl) ProcessLog(header *types.Header, log *ethgo.Log ) switch log.Topics[0] { - case commitEvent.Sig(): + case commitmentEventSignature: _, err := commitEvent.ParseLog(log) if err != nil { return err } - newEvents := []*StateSyncRelayerEventData{} + firstID, lastID := commitEvent.StartID.Uint64(), commitEvent.EndID.Uint64() + newEvents := make([]*StateSyncRelayerEventData, lastID-firstID+1) - for i := commitEvent.StartID.Uint64(); i <= commitEvent.EndID.Uint64(); i++ { - newEvents = append(newEvents, &StateSyncRelayerEventData{EventID: i}) + for eventID := firstID; eventID <= lastID; eventID++ { + newEvents[eventID-firstID] = &StateSyncRelayerEventData{EventID: eventID} } ssr.logger.Info("new events has been arrived", "block", header.Number, "events", newEvents) - return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(newEvents, nil, dbTx) + return ssr.state.updateStateSyncRelayerEvents(newEvents, nil, dbTx) - case stateSyncResultEvent.Sig(): + case stateSyncResultEventSignnature: _, err := stateSyncResultEvent.ParseLog(log) if err != nil { return err @@ -315,7 +318,7 @@ func (ssr *stateSyncRelayerImpl) ProcessLog(header *types.Header, log *ethgo.Log if stateSyncResultEvent.Status { ssr.logger.Info("event has been processed", "block", header.Number, "event", eventID) - return ssr.state.StateSyncStore.updateStateSyncRelayerEvents(nil, []uint64{eventID}, dbTx) + return ssr.state.updateStateSyncRelayerEvents(nil, []uint64{eventID}, dbTx) } ssr.logger.Info("event has been failed to process", "block", header.Number, diff --git a/consensus/polybft/state_sync_relayer_test.go b/consensus/polybft/state_sync_relayer_test.go index 60a540085c..d07d89e8e0 100644 --- a/consensus/polybft/state_sync_relayer_test.go +++ b/consensus/polybft/state_sync_relayer_test.go @@ -58,7 +58,7 @@ func TestStateSyncRelayer_FullWorkflow(t *testing.T) { stateSyncRelayer := NewStateSyncRelayer( dummyTxRelayer, stateSyncAddr, - state, + state.StateSyncStore, proofMock, blockhainMock, testKey, From b78a6e22aaf18ebcaf78d1b07c8404df19124717 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 13:28:32 +0200 Subject: [PATCH 24/27] more cr fixes --- command/genesis/params.go | 10 ++++ command/helper/helper.go | 2 + consensus/polybft/consensus_runtime.go | 8 +-- consensus/polybft/polybft.go | 3 +- consensus/polybft/state_sync_manager.go | 10 ++++ e2e-polybft/e2e/bridge_test.go | 72 +++++++++++++++++++++++++ e2e-polybft/framework/test-cluster.go | 5 ++ 7 files changed, 104 insertions(+), 6 deletions(-) diff --git a/command/genesis/params.go b/command/genesis/params.go index 379c3eae17..1e202827fa 100644 --- a/command/genesis/params.go +++ b/command/genesis/params.go @@ -534,6 +534,16 @@ func (p *genesisParams) validatePremineInfo() error { return errReserveAccMustBePremined } +// validateBlockTrackerPollInterval validates block tracker block interval +// which can not be 0 +func (p *genesisParams) validateBlockTrackerPollInterval() error { + if p.blockTrackerPollInterval == 0 { + return helper.ErrBlockTrackerPollInterval + } + + return nil +} + // validateBurnContract validates burn contract. If native token is mintable, // burn contract flag must not be set. If native token is non mintable only one burn contract // can be set and the specified address will be used to predeploy default EIP1559 burn contract. diff --git a/command/helper/helper.go b/command/helper/helper.go index e4be18ce8f..b934dbd2d4 100644 --- a/command/helper/helper.go +++ b/command/helper/helper.go @@ -23,6 +23,8 @@ import ( "google.golang.org/grpc/credentials/insecure" ) +var ErrBlockTrackerPollInterval = errors.New("block tracker poll interval must be greater than 0") + type ClientCloseResult struct { Message string `json:"message"` } diff --git a/consensus/polybft/consensus_runtime.go b/consensus/polybft/consensus_runtime.go index 238b004bd5..288a810daf 100644 --- a/consensus/polybft/consensus_runtime.go +++ b/consensus/polybft/consensus_runtime.go @@ -10,6 +10,7 @@ import ( "sync/atomic" "time" + "github.com/0xPolygon/polygon-edge/consensus" "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" bls "github.com/0xPolygon/polygon-edge/consensus/polybft/signer" "github.com/0xPolygon/polygon-edge/consensus/polybft/validator" @@ -82,8 +83,7 @@ type runtimeConfig struct { txPool txPoolInterface bridgeTopic topic numBlockConfirmations uint64 - IsRelayer bool - RPCEndpoint string + consensusConfig *consensus.Config } // consensusRuntime is a struct that provides consensus runtime features like epoch, state and event management @@ -251,8 +251,8 @@ func (c *consensusRuntime) initCheckpointManager(logger hcf.Logger) error { // initStateSyncRelayer initializes state sync relayer // if not enabled, then a dummy state sync relayer will be used func (c *consensusRuntime) initStateSyncRelayer(logger hcf.Logger) error { - if c.config.IsRelayer { - txRelayer, err := getStateSyncTxRelayer(c.config.RPCEndpoint, logger) + if c.config.consensusConfig.IsRelayer { + txRelayer, err := getStateSyncTxRelayer(c.config.consensusConfig.RPCEndpoint, logger) if err != nil { return err } diff --git a/consensus/polybft/polybft.go b/consensus/polybft/polybft.go index 978ef62144..9e77c545c1 100644 --- a/consensus/polybft/polybft.go +++ b/consensus/polybft/polybft.go @@ -552,8 +552,7 @@ func (p *Polybft) initRuntime() error { txPool: p.txPool, bridgeTopic: p.bridgeTopic, numBlockConfirmations: p.config.NumBlockConfirmations, - IsRelayer: p.config.Config.IsRelayer, - RPCEndpoint: p.config.Config.RPCEndpoint, + consensusConfig: p.config.Config, } runtime, err := newConsensusRuntime(p.logger, runtimeConfig) diff --git a/consensus/polybft/state_sync_manager.go b/consensus/polybft/state_sync_manager.go index a919a881e3..d29680a4f4 100644 --- a/consensus/polybft/state_sync_manager.go +++ b/consensus/polybft/state_sync_manager.go @@ -37,6 +37,7 @@ type StateSyncProof struct { // StateSyncManager is an interface that defines functions for state sync workflow type StateSyncManager interface { + EventSubscriber Init() error Close() Commitment(blockNumber uint64) (*CommitmentMessageSigned, error) @@ -61,6 +62,15 @@ func (d *dummyStateSyncManager) GetStateSyncProof(stateSyncID uint64) (types.Pro return types.Proof{}, nil } +// EventSubscriber implementation +func (d *dummyStateSyncManager) GetLogFilters() map[types.Address][]types.Hash { + return make(map[types.Address][]types.Hash) +} +func (d *dummyStateSyncManager) ProcessLog(header *types.Header, + log *ethgo.Log, dbTx *bolt.Tx) error { + return nil +} + // stateSyncConfig holds the configuration data of state sync manager type stateSyncConfig struct { stateSenderAddr types.Address diff --git a/e2e-polybft/e2e/bridge_test.go b/e2e-polybft/e2e/bridge_test.go index 3750496058..3907ac58f4 100644 --- a/e2e-polybft/e2e/bridge_test.go +++ b/e2e-polybft/e2e/bridge_test.go @@ -1531,3 +1531,75 @@ func TestE2E_Bridge_Transfers_AccessLists(t *testing.T) { } }) } + +func TestE2E_Bridge_Transfers_WithRootTrackerPollInterval(t *testing.T) { + var ( + numBlockConfirmations = uint64(2) + epochSize = 30 + sprintSize = uint64(5) + rootPollInterval = 5 * time.Second + relayerPollInterval = 5 * time.Second + numberOfAttempts = uint64(4) + stateSyncedLogsCount = 1 + ) + + cluster := framework.NewTestCluster(t, 5, + framework.WithEpochSize(epochSize), + framework.WithNumBlockConfirmations(numBlockConfirmations), + framework.WithRootTrackerPollInterval(rootPollInterval), + framework.WithRootTrackerPollInterval(relayerPollInterval), + ) + defer cluster.Stop() + + cluster.WaitForReady(t) + + polybftCfg, err := polybft.LoadPolyBFTConfig(path.Join(cluster.Config.TmpDir, chainConfigFileName)) + require.NoError(t, err) + + validatorSrv := cluster.Servers[0] + senderAccount, err := sidechain.GetAccountFromDir(validatorSrv.DataDir()) + require.NoError(t, err) + + childEthEndpoint := validatorSrv.JSONRPC().Eth() + + // bridge some tokens for first validator to child chain + tokensToDeposit := ethgo.Ether(10) + + require.NoError(t, cluster.Bridge.Deposit( + common.ERC20, + polybftCfg.Bridge.RootNativeERC20Addr, + polybftCfg.Bridge.RootERC20PredicateAddr, + rootHelper.TestAccountPrivKey, + senderAccount.Address().String(), + tokensToDeposit.String(), + "", + cluster.Bridge.JSONRPCAddr(), + rootHelper.TestAccountPrivKey, + false), + ) + + // wait for a couple of sprints + finalBlockNum := 5 * sprintSize + + // the transaction is processed and there should be a success event + var stateSyncedResult contractsapi.StateSyncResultEvent + + for i := uint64(0); i < numberOfAttempts; i++ { + logs, err := getFilteredLogs(stateSyncedResult.Sig(), 0, finalBlockNum+i*sprintSize, childEthEndpoint) + require.NoError(t, err) + + if len(logs) == stateSyncedLogsCount || i == numberOfAttempts-1 { + // assert that all deposits are executed successfully + checkStateSyncResultLogs(t, logs, stateSyncedLogsCount) + + break + } + + require.NoError(t, cluster.WaitForBlock(finalBlockNum+(i+1)*sprintSize, 2*time.Minute)) + } + + // check validator balance got increased by deposited amount + balance, err := childEthEndpoint.GetBalance(ethgo.Address(senderAccount.Address()), ethgo.Latest) + require.NoError(t, err) + require.Equal(t, tokensToDeposit, balance) +} diff --git a/e2e-polybft/framework/test-cluster.go b/e2e-polybft/framework/test-cluster.go index 77b583e573..345a3432ec 100644 --- a/e2e-polybft/framework/test-cluster.go +++ b/e2e-polybft/framework/test-cluster.go @@ -499,6 +499,11 @@ func NewTestCluster(t *testing.T, validatorsCount int, opts ...ClusterOption) *T cluster.Config.BlockTime.String()) } + if cluster.Config.RootTrackerPollInterval != 0 { + args = append(args, "--block-tracker-poll-interval", + cluster.Config.RootTrackerPollInterval.String()) + } + if cluster.Config.TestRewardToken != "" { args = append(args, "--reward-token-code", cluster.Config.TestRewardToken) } From 3d716fd874706eefcf897051657b5587ad8b8186 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 13:33:07 +0200 Subject: [PATCH 25/27] small --- e2e-polybft/e2e/bridge_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/e2e-polybft/e2e/bridge_test.go b/e2e-polybft/e2e/bridge_test.go index 3907ac58f4..2ea8d0dc8d 100644 --- a/e2e-polybft/e2e/bridge_test.go +++ b/e2e-polybft/e2e/bridge_test.go @@ -1538,7 +1538,6 @@ func TestE2E_Bridge_Transfers_WithRootTrackerPollInterval(t *testing.T) { epochSize = 30 sprintSize = uint64(5) rootPollInterval = 5 * time.Second - relayerPollInterval = 5 * time.Second numberOfAttempts = uint64(4) stateSyncedLogsCount = 1 ) @@ -1547,7 +1546,6 @@ func TestE2E_Bridge_Transfers_WithRootTrackerPollInterval(t *testing.T) { framework.WithEpochSize(epochSize), framework.WithNumBlockConfirmations(numBlockConfirmations), framework.WithRootTrackerPollInterval(rootPollInterval), - framework.WithRootTrackerPollInterval(relayerPollInterval), ) defer cluster.Stop() From 0640a887e50892f18ea17ca4554ceba4a4a438f9 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 13:58:16 +0200 Subject: [PATCH 26/27] test fix --- consensus/polybft/consensus_runtime_test.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/consensus/polybft/consensus_runtime_test.go b/consensus/polybft/consensus_runtime_test.go index cc1895e641..6909bf3839 100644 --- a/consensus/polybft/consensus_runtime_test.go +++ b/consensus/polybft/consensus_runtime_test.go @@ -475,13 +475,14 @@ func Test_NewConsensusRuntime(t *testing.T) { tmpDir := t.TempDir() config := &runtimeConfig{ - polybftBackend: polybftBackendMock, - State: newTestState(t), - PolyBFTConfig: polyBftConfig, - DataDir: tmpDir, - Key: createTestKey(t), - blockchain: blockchainMock, - bridgeTopic: &mockTopic{}, + polybftBackend: polybftBackendMock, + State: newTestState(t), + PolyBFTConfig: polyBftConfig, + DataDir: tmpDir, + Key: createTestKey(t), + blockchain: blockchainMock, + bridgeTopic: &mockTopic{}, + consensusConfig: &consensus.Config{}, } require.NoError(t, config.State.StakeStore.insertFullValidatorSet(validatorSetState{ From 610a69a944e18ce8ece28ffa9a1085a08ba175b4 Mon Sep 17 00:00:00 2001 From: Igor Crevar Date: Tue, 17 Oct 2023 15:03:37 +0200 Subject: [PATCH 27/27] more fixes --- consensus/polybft/state_store_state_sync.go | 3 --- consensus/polybft/state_sync_relayer.go | 10 +++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/consensus/polybft/state_store_state_sync.go b/consensus/polybft/state_store_state_sync.go index e8a5efca2f..71e37f80ab 100644 --- a/consensus/polybft/state_store_state_sync.go +++ b/consensus/polybft/state_store_state_sync.go @@ -42,9 +42,6 @@ commitments/ stateSyncProofs/ |--> stateSyncProof.StateSync.Id -> *StateSyncProof (json marshalled) -relayerData/ -|--> data -> *StateSyncRelayerStateData (json marshalled) - relayerEvents/ |--> StateSyncRelayerEventData.EventID -> *StateSyncRelayerEventData (json marshalled) */ diff --git a/consensus/polybft/state_sync_relayer.go b/consensus/polybft/state_sync_relayer.go index 239259d175..8c38a5ed94 100644 --- a/consensus/polybft/state_sync_relayer.go +++ b/consensus/polybft/state_sync_relayer.go @@ -21,17 +21,17 @@ const ( // in order to try again to send transaction defaultMaxBlocksToWaitForResend = uint64(30) // defaultMaxAttemptsToSend specifies how many sending retries for one transaction - defaultMaxAttemptsToSend = 6 + defaultMaxAttemptsToSend = uint64(15) // defaultMaxEventsPerBatch specifies maximum events per one batchExecute tx - defaultMaxEventsPerBatch = 10 + defaultMaxEventsPerBatch = uint64(10) ) var ( errFailedToExecuteStateSync = errors.New("failed to execute state sync") errUnknownStateSyncRelayerEvent = errors.New("unknown event") - commitmentEventSignature = new(contractsapi.NewCommitmentEvent).Sig() - stateSyncResultEventSignnature = new(contractsapi.StateSyncResultEvent).Sig() + commitmentEventSignature = new(contractsapi.NewCommitmentEvent).Sig() + stateSyncResultEventSignature = new(contractsapi.StateSyncResultEvent).Sig() ) // StateSyncRelayer is an interface that defines functions for state sync relayer @@ -307,7 +307,7 @@ func (ssr *stateSyncRelayerImpl) ProcessLog(header *types.Header, log *ethgo.Log return ssr.state.updateStateSyncRelayerEvents(newEvents, nil, dbTx) - case stateSyncResultEventSignnature: + case stateSyncResultEventSignature: _, err := stateSyncResultEvent.ParseLog(log) if err != nil { return err