From ee35129bd1a4b386410f4780b1958b87814e490b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Negovanovi=C4=87?= <93934272+Stefan-Ethernal@users.noreply.github.com> Date: Thu, 2 Mar 2023 15:49:34 +0100 Subject: [PATCH] ERC20 token bridge (deposit workflow) (#1242) * Update smart contracts submodule * Introduce new contracts and generate go bindings * Update to the latest SC spec * Add predefined addresses for ChildERC20 and ChildERC20Predicate contracts * Add NativeERC20 artifact * Deploy and initialize RootERC20Predicate * Deploy and init ChildERC20Predicate, ChildERC20 and NativeERC20 contracts on child chain * Deploy missing contracts, change encoding * Deposit workflow * Update TestE2E_Bridge_MultipleCommitmentsPerEpoch assertions * Update smart contracts * Rename NativeTokenContract to NativeERC20TokenContract * Update smart contracts * - Provide correct receiver address for deposits - Print sender address in deposit command * Remove token type value comments * Move bridge workflow commands to a separate package * Fix assertions * SC logging * Fix assertions 2nd part * Remove leftover log * Rename bridge command * Scientific notation for default mint value * Address comments * Rename admin key to depositor key * Use scientific notation for defaultAllowanceValue * Fix deposit flags descriptions * Rebase fix * Update smart contracts * Generate function bindings for RootERC20Predicate and RootERC20 Rename RootERC20 * Approve RootERC20Predicate as spender only in test mode --- command/bridge/README.md | 14 + command/bridge/bridge.go | 25 ++ command/bridge/deposit/deposit.go | 295 ++++++++++++++++++ command/bridge/deposit/params.go | 61 ++++ command/bridge/deposit/result.go | 32 ++ command/genesis/polybft_params.go | 16 +- command/root/root.go | 2 + command/rootchain/README.md | 18 +- command/rootchain/emit/emit.go | 187 ----------- command/rootchain/emit/params.go | 51 --- command/rootchain/emit/result.go | 30 -- command/rootchain/helper/metadata.go | 23 +- .../rootchain/initcontracts/init_contracts.go | 155 +++++++-- command/rootchain/rootchain.go | 8 +- consensus/polybft/contracts_initializer.go | 44 ++- .../contractsapi/artifacts-gen/main.go | 48 ++- .../polybft/contractsapi/bindings-gen/main.go | 32 ++ .../polybft/contractsapi/contractsapi.go | 61 ++++ consensus/polybft/contractsapi/gen_sc_data.go | 22 +- consensus/polybft/contractsapi/helper.go | 8 +- consensus/polybft/contractsapi/init.go | 55 +++- consensus/polybft/polybft.go | 28 +- consensus/polybft/polybft_config.go | 31 +- contracts/system_addresses.go | 12 +- core-contracts | 2 +- e2e-polybft/bridge_test.go | 121 +++---- e2e-polybft/framework/test-bridge.go | 92 ++++-- e2e-polybft/framework/test-cluster.go | 26 +- state/runtime/precompiled/native_transfer.go | 2 +- .../precompiled/native_transfer_test.go | 4 +- 30 files changed, 988 insertions(+), 517 deletions(-) create mode 100644 command/bridge/README.md create mode 100644 command/bridge/bridge.go create mode 100644 command/bridge/deposit/deposit.go create mode 100644 command/bridge/deposit/params.go create mode 100644 command/bridge/deposit/result.go delete mode 100644 command/rootchain/emit/emit.go delete mode 100644 command/rootchain/emit/params.go delete mode 100644 command/rootchain/emit/result.go diff --git a/command/bridge/README.md b/command/bridge/README.md new file mode 100644 index 0000000000..d17d563d9a --- /dev/null +++ b/command/bridge/README.md @@ -0,0 +1,14 @@ +# Bridge helper command + +This is a helper command, which allows sending deposits from root to child chain and make withdrawals from child chain to root chain. + +## Deposit +This is a helper command which bridges assets from rootchain to the child chain (allows depositing) + +```bash +$ polygon-edge bridge deposit + --depositor-key + --token + --receivers + --amounts +``` \ No newline at end of file diff --git a/command/bridge/bridge.go b/command/bridge/bridge.go new file mode 100644 index 0000000000..6e48b8a254 --- /dev/null +++ b/command/bridge/bridge.go @@ -0,0 +1,25 @@ +package bridge + +import ( + "github.com/0xPolygon/polygon-edge/command/bridge/deposit" + "github.com/spf13/cobra" +) + +// GetCommand creates "bridge" helper command +func GetCommand() *cobra.Command { + bridgeCmd := &cobra.Command{ + Use: "bridge", + Short: "Top level bridge command.", + } + + registerSubcommands(bridgeCmd) + + return bridgeCmd +} + +func registerSubcommands(baseCmd *cobra.Command) { + baseCmd.AddCommand( + // bridge deposit + deposit.GetCommand(), + ) +} diff --git a/command/bridge/deposit/deposit.go b/command/bridge/deposit/deposit.go new file mode 100644 index 0000000000..fa5c7d3bc7 --- /dev/null +++ b/command/bridge/deposit/deposit.go @@ -0,0 +1,295 @@ +package deposit + +import ( + "fmt" + "math/big" + "strings" + + "github.com/spf13/cobra" + "github.com/umbracle/ethgo" + "golang.org/x/sync/errgroup" + + "github.com/0xPolygon/polygon-edge/command" + "github.com/0xPolygon/polygon-edge/command/rootchain/helper" + "github.com/0xPolygon/polygon-edge/consensus/polybft" + "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" + "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi/artifact" + "github.com/0xPolygon/polygon-edge/contracts" + "github.com/0xPolygon/polygon-edge/txrelayer" + "github.com/0xPolygon/polygon-edge/types" +) + +type TokenType int + +const ( + ERC20 TokenType = iota + ERC721 + ERC1155 +) + +const ( + // defaultMintValue represents amount of tokens which are going to be minted to depositor + defaultMintValue = int64(1e18) +) + +var ( + params depositParams + + manifest *polybft.Manifest + + tokenTypesMap = map[string]TokenType{ + "erc20": ERC20, + "erc721": ERC721, + "erc1155": ERC1155, + } + + configs = map[TokenType]*bridgeConfig{} +) + +// GetCommand returns the bridge deposit command +func GetCommand() *cobra.Command { + depositCmd := &cobra.Command{ + Use: "deposit", + Short: "Deposits tokens from root chain to child chain", + PreRunE: runPreRun, + Run: runCommand, + } + + setFlags(depositCmd) + + return depositCmd +} + +func setFlags(cmd *cobra.Command) { + cmd.Flags().StringVar( + ¶ms.manifestPath, + manifestPathFlag, + "./manifest.json", + "the manifest file path, which contains genesis metadata", + ) + + cmd.Flags().StringVar( + ¶ms.tokenTypeRaw, + tokenFlag, + "erc20", + "token type which is being deposited", + ) + + cmd.Flags().StringSliceVar( + ¶ms.receivers, + receiversFlag, + nil, + "receiving accounts addresses on child chain", + ) + + cmd.Flags().StringSliceVar( + ¶ms.amounts, + amountsFlag, + nil, + "amounts to send to child chain receiving accounts", + ) + + cmd.Flags().StringVar( + ¶ms.jsonRPCAddress, + jsonRPCFlag, + "http://127.0.0.1:8545", + "the JSON RPC rootchain IP address (e.g. http://127.0.0.1:8545)", + ) + + cmd.Flags().StringVar( + ¶ms.depositorKey, + depositorKeyFlag, + helper.DefaultPrivateKeyRaw, + "hex encoded private key of the account which sends rootchain deposit transactions", + ) +} + +func runPreRun(_ *cobra.Command, _ []string) error { + var err error + if err = params.validateFlags(); err != nil { + return err + } + + manifest, err = polybft.LoadManifest(params.manifestPath) + if err != nil { + return fmt.Errorf("failed to load manifest file from '%s': %w", params.manifestPath, err) + } + + // populate bridge configs based on token types + configs[ERC20] = newBridgeConfig( + contractsapi.RootERC20Predicate, + "depositTo", + contractsapi.RootERC20, + "mint", + manifest.RootchainConfig.RootNativeERC20Address, + manifest.RootchainConfig.RootERC20PredicateAddress, + contracts.ChildERC20PredicateContract) + + return nil +} + +func runCommand(cmd *cobra.Command, _ []string) { + outputter := command.InitializeOutputter(cmd) + defer outputter.WriteOutput() + + if err := helper.InitRootchainPrivateKey(params.depositorKey); err != nil { + outputter.SetError(err) + + return + } + + tokenType, _ := lookupTokenType(params.tokenTypeRaw) + + config, exists := configs[tokenType] + if !exists { + outputter.SetError(fmt.Errorf("not found bridge config for provided token type: %s", params.tokenTypeRaw)) + + return + } + + txRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithIPAddress(params.jsonRPCAddress)) + if err != nil { + outputter.SetError(fmt.Errorf("could not create rootchain interactor: %w", err)) + + return + } + + g, ctx := errgroup.WithContext(cmd.Context()) + + for i := range params.receivers { + receiver := params.receivers[i] + amount := params.amounts[i] + + g.Go(func() error { + select { + case <-ctx.Done(): + return ctx.Err() + default: + if helper.IsTestMode(params.depositorKey) { + // mint tokens to depositor + txn, err := createMintTxn(config, big.NewInt(defaultMintValue)) + if err != nil { + return fmt.Errorf("mint transaction creation failed: %w", err) + } + receipt, err := txRelayer.SendTransaction(txn, helper.GetRootchainPrivateKey()) + if err != nil { + return fmt.Errorf("failed to send mint transaction to depositor %s", helper.GetRootchainPrivateKey().Address()) + } + + if receipt.Status == uint64(types.ReceiptFailed) { + return fmt.Errorf("failed to mint tokens to depositor %s", helper.GetRootchainPrivateKey().Address()) + } + } + + // deposit tokens + amountBig, err := types.ParseUint256orHex(&amount) + if err != nil { + return fmt.Errorf("failed to decode provided amount %s: %w", amount, err) + } + txn, err := createDepositTxn(config, ethgo.BytesToAddress([]byte(receiver)), amountBig) + if err != nil { + return fmt.Errorf("failed to create tx input: %w", err) + } + + receipt, err := txRelayer.SendTransaction(txn, helper.GetRootchainPrivateKey()) + if err != nil { + return fmt.Errorf("receiver: %s, amount: %s, error: %w", + receiver, amount, err) + } + + if receipt.Status == uint64(types.ReceiptFailed) { + return fmt.Errorf("receiver: %s, amount: %s", + receiver, amount) + } + + return nil + } + }) + } + + if err = g.Wait(); err != nil { + outputter.SetError(fmt.Errorf("sending transactions to rootchain failed: %w", err)) + + return + } + + outputter.SetCommandResult(&result{ + TokenType: params.tokenTypeRaw, + Sender: helper.GetRootchainPrivateKey().Address().String(), + Receivers: params.receivers, + Amounts: params.amounts, + }) +} + +// createDepositTxn encodes parameters for deposit function on rootchain predicate contract +func createDepositTxn(config *bridgeConfig, receiver ethgo.Address, amount *big.Int) (*ethgo.Transaction, error) { + input, err := config.rootPredicate.Abi.Methods[config.depositFnName].Encode([]interface{}{ + config.rootTokenAddr, + receiver, + amount, + }) + if err != nil { + return nil, fmt.Errorf("failed to encode provided parameters: %w", err) + } + + addr := ethgo.Address(config.rootPredicateAddr) + + return ðgo.Transaction{ + To: &addr, + Input: input, + }, nil +} + +// createMintTxn encodes parameters for mint function on rootchain token contract +func createMintTxn(config *bridgeConfig, amount *big.Int) (*ethgo.Transaction, error) { + input, err := config.rootToken.Abi.Methods[config.mintFnName].Encode([]interface{}{ + helper.GetRootchainPrivateKey().Address(), + amount, + }) + if err != nil { + return nil, fmt.Errorf("failed to encode provided parameters: %w", err) + } + + addr := ethgo.Address(config.rootTokenAddr) + + return ðgo.Transaction{ + To: &addr, + Input: input, + }, nil +} + +// bridgeConfig contains parameterizable parameters for assets bridging +type bridgeConfig struct { + rootPredicate *artifact.Artifact + depositFnName string + rootToken *artifact.Artifact + mintFnName string + rootTokenAddr types.Address + rootPredicateAddr types.Address + childPredicateAddr types.Address +} + +func newBridgeConfig(rootPredicate *artifact.Artifact, + depositFnName string, + rootToken *artifact.Artifact, + mintFnName string, + rootTokenAddr types.Address, + rootPredicateAddr types.Address, + childPredicateAddr types.Address) *bridgeConfig { + return &bridgeConfig{ + rootPredicate: rootPredicate, + depositFnName: depositFnName, + rootToken: rootToken, + mintFnName: mintFnName, + rootTokenAddr: rootTokenAddr, + rootPredicateAddr: rootPredicateAddr, + childPredicateAddr: childPredicateAddr, + } +} + +// lookupTokenType looks up for provided token type string and returns resolved enum value if found +func lookupTokenType(tokenTypeRaw string) (TokenType, bool) { + tokenType, ok := tokenTypesMap[strings.ToLower(tokenTypeRaw)] + + return tokenType, ok +} diff --git a/command/bridge/deposit/params.go b/command/bridge/deposit/params.go new file mode 100644 index 0000000000..2ecbd4933e --- /dev/null +++ b/command/bridge/deposit/params.go @@ -0,0 +1,61 @@ +package deposit + +import ( + "errors" + "fmt" + "os" +) + +const ( + manifestPathFlag = "manifest" + tokenFlag = "token" + contractFlag = "contract" + receiversFlag = "receivers" + amountsFlag = "amounts" + jsonRPCFlag = "json-rpc" + depositorKeyFlag = "depositor-key" +) + +var ( + errReceiversMissing = errors.New("receivers flag value is not provided") + errAmountsMissing = errors.New("amount flag value is not provided") + errInconsistentAccounts = errors.New("receivers and amounts must be provided in pairs") + errDepositorKeyMissing = errors.New("depositor private key is not provided") +) + +type depositParams struct { + manifestPath string + tokenTypeRaw string + receivers []string + amounts []string + jsonRPCAddress string + depositorKey string +} + +func (dp *depositParams) validateFlags() error { + if dp.depositorKey == "" { + return errDepositorKeyMissing + } + + if _, err := os.Stat(dp.manifestPath); errors.Is(err, os.ErrNotExist) { + return fmt.Errorf("provided manifest path '%s' doesn't exist", dp.manifestPath) + } + + if len(dp.receivers) == 0 { + return errReceiversMissing + } + + if len(dp.amounts) == 0 { + return errAmountsMissing + } + + if len(dp.receivers) != len(dp.amounts) { + return errInconsistentAccounts + } + + if _, exists := lookupTokenType(dp.tokenTypeRaw); !exists { + return fmt.Errorf("unrecognized token type provided: %s", dp.tokenTypeRaw) + } + + return nil +} diff --git a/command/bridge/deposit/result.go b/command/bridge/deposit/result.go new file mode 100644 index 0000000000..c3a570e362 --- /dev/null +++ b/command/bridge/deposit/result.go @@ -0,0 +1,32 @@ +package deposit + +import ( + "bytes" + "fmt" + "strings" + + "github.com/0xPolygon/polygon-edge/command/helper" +) + +type result struct { + TokenType string `json:"tokenType"` + Sender string `json:"sender"` + Receivers []string `json:"receivers"` + Amounts []string `json:"amounts"` +} + +func (r *result) GetOutput() string { + var buffer bytes.Buffer + + vals := make([]string, 0, 4) + vals = append(vals, fmt.Sprintf("Token Type|%s", r.TokenType)) + vals = append(vals, fmt.Sprintf("Sender|%s", r.Sender)) + vals = append(vals, fmt.Sprintf("Receivers|%s", strings.Join(r.Receivers, ", "))) + vals = append(vals, fmt.Sprintf("Amounts|%s", strings.Join(r.Amounts, ", "))) + + buffer.WriteString("\n[DEPOSIT]\n") + buffer.WriteString(helper.FormatKV(vals)) + buffer.WriteString("\n") + + return buffer.String() +} diff --git a/command/genesis/polybft_params.go b/command/genesis/polybft_params.go index f00149dbac..2be27d19ff 100644 --- a/command/genesis/polybft_params.go +++ b/command/genesis/polybft_params.go @@ -191,9 +191,19 @@ func (p *genesisParams) deployContracts(totalStake *big.Int) (map[types.Address] address: contracts.StateReceiverContract, }, { - // Native Token contract (Matic ERC-20) - artifact: contractsapi.MRC20, - address: contracts.NativeTokenContract, + // NativeERC20 Token contract + artifact: contractsapi.NativeERC20, + address: contracts.NativeERC20TokenContract, + }, + { + // ChildERC20 token contract + artifact: contractsapi.ChildERC20, + address: contracts.ChildERC20Contract, + }, + { + // ChildERC20Predicate contract + artifact: contractsapi.ChildERC20Predicate, + address: contracts.ChildERC20PredicateContract, }, { // BLS contract diff --git a/command/root/root.go b/command/root/root.go index 3b4802bc9f..e0ff39fc86 100644 --- a/command/root/root.go +++ b/command/root/root.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/0xPolygon/polygon-edge/command/backup" + "github.com/0xPolygon/polygon-edge/command/bridge" "github.com/0xPolygon/polygon-edge/command/genesis" "github.com/0xPolygon/polygon-edge/command/helper" "github.com/0xPolygon/polygon-edge/command/ibft" @@ -61,6 +62,7 @@ func (rc *RootCommand) registerSubCommands() { polybftsecrets.GetCommand(), polybft.GetCommand(), polybftmanifest.GetCommand(), + bridge.GetCommand(), ) } diff --git a/command/rootchain/README.md b/command/rootchain/README.md index 674636f55c..40a9ce60f8 100644 --- a/command/rootchain/README.md +++ b/command/rootchain/README.md @@ -1,9 +1,10 @@ -# RootChain Helper +# Rootchain helper command + +Top level command for manipulating rootchain server. ## Start rootchain server -This command starts `ethereum/client-go` container which is basically geth node, -and deploys the rootchain bridge and the checkpoint manager contracts. +This command starts `ethereum/client-go` container which is basically geth node. ```bash $ polygon-edge rootchain server @@ -11,7 +12,7 @@ $ polygon-edge rootchain server ## Fund initialized accounts -This command funds the initialized accounts via `polygon-edge secrets init ...` command. +This command funds the initialized accounts via `polygon-edge polybft-secrets` command. ```bash $ polygon-edge rootchain fund --data-dir data-dir- --num 2 @@ -21,10 +22,13 @@ Or $ polygon-edge rootchain fund --data-dir data-dir-1 ``` -## Emit event +## Deploy and initialize contracts -This command emits the event from the bridge side which invokes the wallets funding logic. +This command deploys and initializes rootchain contracts. Transactions are being sent to given `--json-rpc` endpoint and are signed by private key provided by `--adminKey` flag. ```bash -$ polygon-edge rootchain emit --contract --wallets --amounts +$ polygon-edge rootchain init-contracts + --manifest + --json-rpc + --adminKey ``` \ No newline at end of file diff --git a/command/rootchain/emit/emit.go b/command/rootchain/emit/emit.go deleted file mode 100644 index cd7b6ed1a8..0000000000 --- a/command/rootchain/emit/emit.go +++ /dev/null @@ -1,187 +0,0 @@ -package emit - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/umbracle/ethgo" - "github.com/umbracle/ethgo/abi" - "golang.org/x/sync/errgroup" - - "github.com/0xPolygon/polygon-edge/command" - "github.com/0xPolygon/polygon-edge/command/rootchain/helper" - "github.com/0xPolygon/polygon-edge/consensus/polybft" - "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi" - "github.com/0xPolygon/polygon-edge/contracts" - "github.com/0xPolygon/polygon-edge/txrelayer" - "github.com/0xPolygon/polygon-edge/types" -) - -var ( - params emitParams - - contractsToParamTypes = map[string]string{ - contracts.NativeTokenContract.String(): "tuple(address,uint256)", - } - - syncStateAbiMethod = contractsapi.StateSender.Abi.Methods["syncState"] -) - -// GetCommand returns the rootchain emit command -func GetCommand() *cobra.Command { - rootchainEmitCmd := &cobra.Command{ - Use: "emit", - Short: "Emit an event from the bridge", - PreRunE: runPreRun, - Run: runCommand, - } - - setFlags(rootchainEmitCmd) - - return rootchainEmitCmd -} - -func setFlags(cmd *cobra.Command) { - cmd.Flags().StringVar( - ¶ms.manifestPath, - manifestPathFlag, - "./manifest.json", - "the manifest file path, which contains genesis metadata", - ) - - cmd.Flags().StringVar( - ¶ms.address, - contractFlag, - contracts.NativeTokenContract.String(), - "ERC20 bridge contract address", - ) - - cmd.Flags().StringSliceVar( - ¶ms.wallets, - walletsFlag, - nil, - "list of wallet addresses", - ) - - cmd.Flags().StringSliceVar( - ¶ms.amounts, - amountsFlag, - nil, - "list of amounts to fund wallets", - ) - - cmd.Flags().StringVar( - ¶ms.jsonRPCAddress, - jsonRPCFlag, - "http://127.0.0.1:8545", - "the JSON RPC rootchain IP address (e.g. http://127.0.0.1:8545)", - ) - - cmd.Flags().StringVar( - ¶ms.adminKey, - adminKeyFlag, - helper.DefaultPrivateKeyRaw, - "Hex encoded private key of the account which sends rootchain transactions", - ) -} - -func runPreRun(_ *cobra.Command, _ []string) error { - return params.validateFlags() -} - -func runCommand(cmd *cobra.Command, _ []string) { - outputter := command.InitializeOutputter(cmd) - defer outputter.WriteOutput() - - err := helper.InitRootchainAdminKey(params.adminKey) - if err != nil { - outputter.SetError(err) - - return - } - - manifest, err := polybft.LoadManifest(params.manifestPath) - if err != nil { - outputter.SetError(fmt.Errorf("failed to load manifest file from '%s': %w", params.manifestPath, err)) - - return - } - - paramsType, exists := contractsToParamTypes[params.address] - if !exists { - outputter.SetError(fmt.Errorf("no parameter types for given contract address: %v", params.address)) - - return - } - - txRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithIPAddress(params.jsonRPCAddress)) - if err != nil { - outputter.SetError(fmt.Errorf("could not create rootchain interactor: %w", err)) - - return - } - - g, ctx := errgroup.WithContext(cmd.Context()) - - for i := range params.wallets { - wallet := params.wallets[i] - amount := params.amounts[i] - - g.Go(func() error { - select { - case <-ctx.Done(): - return ctx.Err() - default: - txn, err := createEmitTxn(manifest.RootchainConfig.StateSenderAddress, paramsType, wallet, amount) - if err != nil { - return fmt.Errorf("failed to create tx input: %w", err) - } - - if _, err = txRelayer.SendTransaction( - txn, - helper.GetRootchainAdminKey()); err != nil { - return fmt.Errorf("sending transaction to wallet: %s with amount: %s, failed with error: %w", wallet, amount, err) - } - - return nil - } - }) - } - - if err = g.Wait(); err != nil { - outputter.SetError(fmt.Errorf("sending transactions to rootchain failed: %w", err)) - - return - } - - outputter.SetCommandResult(&result{ - Address: params.address, - Wallets: params.wallets, - Amounts: params.amounts, - }) -} - -func createEmitTxn( - stateSenderAddr types.Address, - paramsType string, - parameters ...interface{}) (*ethgo.Transaction, error) { - var prms []interface{} - prms = append(prms, parameters...) - - wrapperInput, err := abi.MustNewType(paramsType).Encode(prms) - if err != nil { - return nil, fmt.Errorf("failed to encode parsed parameters: %w", err) - } - - sender := types.StringToAddress(params.address) - - input, err := syncStateAbiMethod.Encode([]interface{}{sender, wrapperInput}) - if err != nil { - return nil, fmt.Errorf("failed to encode provided parameters: %w", err) - } - - return ðgo.Transaction{ - To: (*ethgo.Address)(&stateSenderAddr), - Input: input, - }, nil -} diff --git a/command/rootchain/emit/params.go b/command/rootchain/emit/params.go deleted file mode 100644 index afc8b7f6fe..0000000000 --- a/command/rootchain/emit/params.go +++ /dev/null @@ -1,51 +0,0 @@ -package emit - -import ( - "errors" - "fmt" - "os" -) - -const ( - manifestPathFlag = "manifest" - contractFlag = "contract" - walletsFlag = "wallets" - amountsFlag = "amounts" - jsonRPCFlag = "json-rpc" - adminKeyFlag = "admin-key" -) - -var ( - errWalletsMissing = errors.New("wallet flag value is not provided") - errAmountsMissing = errors.New("amount flag value is not provided") - errInconsistentAccounts = errors.New("wallets and amounts must be provided in pairs") -) - -type emitParams struct { - manifestPath string - address string - wallets []string - amounts []string - jsonRPCAddress string - adminKey string -} - -func (ep *emitParams) validateFlags() error { - if _, err := os.Stat(ep.manifestPath); errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("provided manifest path '%s' doesn't exist", ep.manifestPath) - } - - if len(ep.wallets) == 0 { - return errWalletsMissing - } - - if len(ep.amounts) == 0 { - return errAmountsMissing - } - - if len(ep.wallets) != len(ep.amounts) { - return errInconsistentAccounts - } - - return nil -} diff --git a/command/rootchain/emit/result.go b/command/rootchain/emit/result.go deleted file mode 100644 index d255c92b94..0000000000 --- a/command/rootchain/emit/result.go +++ /dev/null @@ -1,30 +0,0 @@ -package emit - -import ( - "bytes" - "fmt" - "strings" - - "github.com/0xPolygon/polygon-edge/command/helper" -) - -type result struct { - Address string `json:"address"` - Wallets []string `json:"wallets"` - Amounts []string `json:"amounts"` -} - -func (r *result) GetOutput() string { - var buffer bytes.Buffer - - vals := make([]string, 0, 3) - vals = append(vals, fmt.Sprintf("Contract (address)|%s", r.Address)) - vals = append(vals, fmt.Sprintf("Wallets|%s", strings.Join(r.Wallets, ", "))) - vals = append(vals, fmt.Sprintf("Amounts|%s", strings.Join(r.Amounts, ", "))) - - buffer.WriteString("\n[ROOTCHAIN EMIT]\n") - buffer.WriteString(helper.FormatKV(vals)) - buffer.WriteString("\n") - - return buffer.String() -} diff --git a/command/rootchain/helper/metadata.go b/command/rootchain/helper/metadata.go index 85154ed38a..7d48be7d28 100644 --- a/command/rootchain/helper/metadata.go +++ b/command/rootchain/helper/metadata.go @@ -18,13 +18,13 @@ var ( ErrRootchainNotFound = errors.New("rootchain not found") ErrRootchainPortBind = errors.New("port 8545 is not bind with localhost") - // rootchainAdminKey is a private key of account which is rootchain administrator - // namely it represents account which deploys rootchain smart contracts - rootchainAdminKey *wallet.Key + // rootchainAccountKey is a private key of account which is used for different actions on rootchain + // (smart contracts deployment, deposits etc.) + rootchainAccountKey *wallet.Key ) -// InitRootchainAdminKey initializes a private key instance from provided hex encoded private key -func InitRootchainAdminKey(rawKey string) error { +// InitRootchainPrivateKey initializes a private key instance from provided hex encoded private key +func InitRootchainPrivateKey(rawKey string) error { privateKeyRaw := DefaultPrivateKeyRaw if rawKey != "" { privateKeyRaw = rawKey @@ -35,7 +35,7 @@ func InitRootchainAdminKey(rawKey string) error { return fmt.Errorf("failed to decode private key string '%s': %w", privateKeyRaw, err) } - rootchainAdminKey, err = wallet.NewWalletFromPrivKey(dec) + rootchainAccountKey, err = wallet.NewWalletFromPrivKey(dec) if err != nil { return fmt.Errorf("failed to initialize key from provided private key '%s': %w", privateKeyRaw, err) } @@ -43,9 +43,9 @@ func InitRootchainAdminKey(rawKey string) error { return nil } -// GetRootchainAdminKey returns rootchain admin private key -func GetRootchainAdminKey() ethgo.Key { - return rootchainAdminKey +// GetRootchainPrivateKey returns rootchain account private key +func GetRootchainPrivateKey() ethgo.Key { + return rootchainAccountKey } func GetRootchainID() (string, error) { @@ -91,3 +91,8 @@ func ReadRootchainIP() (string, error) { return fmt.Sprintf("http://%s:%s", ports[0].HostIP, ports[0].HostPort), nil } + +// IsTestMode returns true in case provided rootchain private key is the same as DefaultPrivateKey one +func IsTestMode(rootchainPrivKey string) bool { + return rootchainPrivKey == DefaultPrivateKeyRaw +} diff --git a/command/rootchain/initcontracts/init_contracts.go b/command/rootchain/initcontracts/init_contracts.go index 10fc9331f7..b6d830f883 100644 --- a/command/rootchain/initcontracts/init_contracts.go +++ b/command/rootchain/initcontracts/init_contracts.go @@ -2,12 +2,12 @@ package initcontracts import ( "bytes" - "errors" "fmt" "math/big" "sort" "github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi/artifact" + "github.com/0xPolygon/polygon-edge/contracts" "github.com/spf13/cobra" "github.com/umbracle/ethgo" @@ -24,11 +24,17 @@ import ( const ( contractsDeploymentTitle = "[ROOTCHAIN - CONTRACTS DEPLOYMENT]" - stateSenderName = "StateSender" - checkpointManagerName = "CheckpointManager" - blsName = "BLS" - bn256G2Name = "BN256G2" - exitHelperName = "ExitHelper" + stateSenderName = "StateSender" + checkpointManagerName = "CheckpointManager" + blsName = "BLS" + bn256G2Name = "BN256G2" + exitHelperName = "ExitHelper" + rootERC20PredicateName = "RootERC20Predicate" + rootERC20Name = "RootERC20" + erc20TemplateName = "ERC20Template" + + // defaultAllowanceValue is value which is assigned to the RootERC20Predicate spender + defaultAllowanceValue = uint64(1e19) ) var ( @@ -52,10 +58,19 @@ var ( exitHelperName: func(rootchainConfig *polybft.RootchainConfig, addr types.Address) { rootchainConfig.ExitHelperAddress = addr }, + rootERC20PredicateName: func(rootchainConfig *polybft.RootchainConfig, addr types.Address) { + rootchainConfig.RootERC20PredicateAddress = addr + }, + rootERC20Name: func(rootchainConfig *polybft.RootchainConfig, addr types.Address) { + rootchainConfig.RootNativeERC20Address = addr + }, + erc20TemplateName: func(rootchainConfig *polybft.RootchainConfig, addr types.Address) { + rootchainConfig.ERC20TemplateAddress = addr + }, } ) -// GetCommand returns the rootchain emit command +// GetCommand returns the rootchain init-contracts command func GetCommand() *cobra.Command { cmd := &cobra.Command{ Use: "init-contracts", @@ -92,7 +107,7 @@ func setFlags(cmd *cobra.Command) { ) } -func runPreRun(cmd *cobra.Command, _ []string) error { +func runPreRun(_ *cobra.Command, _ []string) error { return params.validateFlags() } @@ -134,7 +149,7 @@ func runCommand(cmd *cobra.Command, _ []string) { } } - if err := helper.InitRootchainAdminKey(params.adminKey); err != nil { + if err := helper.InitRootchainPrivateKey(params.adminKey); err != nil { outputter.SetError(err) return @@ -159,10 +174,10 @@ func deployContracts(outputter command.OutputFormatter, client *jsonrpc.Client, return fmt.Errorf("failed to initialize tx relayer: %w", err) } - rootchainAdminKey := helper.GetRootchainAdminKey() + rootchainAdminKey := helper.GetRootchainPrivateKey() // if admin key is equal to the test private key, then we assume we are working in dev mode // and therefore need to fund that account - if params.adminKey == helper.DefaultPrivateKeyRaw { + if helper.IsTestMode(params.adminKey) { // fund account rootchainAdminAddr := rootchainAdminKey.Address() txn := ðgo.Transaction{To: &rootchainAdminAddr, Value: big.NewInt(1000000000000000000)} @@ -197,6 +212,18 @@ func deployContracts(outputter command.OutputFormatter, client *jsonrpc.Client, name: "ExitHelper", artifact: contractsapi.ExitHelper, }, + { + name: "RootERC20Predicate", + artifact: contractsapi.RootERC20Predicate, + }, + { + name: "RootERC20", + artifact: contractsapi.RootERC20, + }, + { + name: "ERC20Template", + artifact: contractsapi.ChildERC20, + }, } rootchainConfig := &polybft.RootchainConfig{} @@ -230,29 +257,51 @@ func deployContracts(outputter command.OutputFormatter, client *jsonrpc.Client, return fmt.Errorf("failed to save manifest data: %w", err) } - if err := initializeCheckpointManager(txRelayer, rootchainAdminKey, manifest); err != nil { + // init CheckpointManager + if err := initializeCheckpointManager(txRelayer, manifest); err != nil { return err } outputter.WriteCommandResult(&messageResult{ - Message: fmt.Sprintf("%s CheckpointManager contract is initialized", contractsDeploymentTitle), + Message: fmt.Sprintf("%s %s contract is initialized", contractsDeploymentTitle, checkpointManagerName), }) + // init ExitHelper if err := initializeExitHelper(txRelayer, rootchainConfig); err != nil { return err } outputter.WriteCommandResult(&messageResult{ - Message: fmt.Sprintf("%s ExitHelper contract is initialized", contractsDeploymentTitle), + Message: fmt.Sprintf("%s %s contract is initialized", contractsDeploymentTitle, exitHelperName), }) + // init RootERC20Predicate + if err := initializeRootERC20Predicate(txRelayer, rootchainConfig); err != nil { + return err + } + + outputter.WriteCommandResult(&messageResult{ + Message: fmt.Sprintf("%s %s contract is initialized", contractsDeploymentTitle, rootERC20PredicateName), + }) + + if helper.IsTestMode(params.adminKey) { + // approve RootERC20Predicate + if err := approveERC20Predicate(txRelayer, rootchainConfig); err != nil { + return err + } + + outputter.WriteCommandResult(&messageResult{ + Message: fmt.Sprintf("%s %s contract is approved for spender of %s", + contractsDeploymentTitle, rootERC20PredicateName, rootERC20Name), + }) + } + return nil } -// initializeCheckpointManager invokes initialize function on CheckpointManager smart contract +// initializeCheckpointManager invokes initialize function on "CheckpointManager" smart contract func initializeCheckpointManager( txRelayer txrelayer.TxRelayer, - rootchainAdminKey ethgo.Key, manifest *polybft.Manifest) error { validatorSet, err := validatorSetToABISlice(manifest.GenesisValidators) if err != nil { @@ -271,44 +320,86 @@ func initializeCheckpointManager( return fmt.Errorf("failed to encode parameters for CheckpointManager.initialize. error: %w", err) } - checkpointManagerAddress := ethgo.Address(manifest.RootchainConfig.CheckpointManagerAddress) + addr := ethgo.Address(manifest.RootchainConfig.CheckpointManagerAddress) txn := ðgo.Transaction{ - To: &checkpointManagerAddress, + To: &addr, Input: initCheckpointInput, } - receipt, err := txRelayer.SendTransaction(txn, rootchainAdminKey) + return sendTransaction(txRelayer, txn, checkpointManagerName) +} + +// initializeExitHelper invokes initialize function on "ExitHelper" smart contract +func initializeExitHelper(txRelayer txrelayer.TxRelayer, rootchainConfig *polybft.RootchainConfig) error { + input, err := contractsapi.ExitHelper.Abi.GetMethod("initialize"). + Encode([]interface{}{rootchainConfig.CheckpointManagerAddress}) if err != nil { - return fmt.Errorf("failed to send transaction to CheckpointManager. error: %w", err) + return fmt.Errorf("failed to encode parameters for ExitHelper.initialize. error: %w", err) } - if receipt.Status != uint64(types.ReceiptSuccess) { - return errors.New("failed to initialize CheckpointManager") + addr := ethgo.Address(rootchainConfig.ExitHelperAddress) + txn := ðgo.Transaction{ + To: &addr, + Input: input, } - return nil + return sendTransaction(txRelayer, txn, exitHelperName) } -func initializeExitHelper(txRelayer txrelayer.TxRelayer, rootchainConfig *polybft.RootchainConfig) error { - input, err := contractsapi.ExitHelper.Abi.GetMethod("initialize"). - Encode([]interface{}{rootchainConfig.CheckpointManagerAddress}) +// initializeRootERC20Predicate invokes initialize function on "RootERC20Predicate" smart contract +func initializeRootERC20Predicate(txRelayer txrelayer.TxRelayer, rootchainConfig *polybft.RootchainConfig) error { + rootERC20PredicateParams := &contractsapi.InitializeRootERC20PredicateFunction{ + NewStateSender: rootchainConfig.StateSenderAddress, + NewExitHelper: rootchainConfig.ExitHelperAddress, + NewChildERC20Predicate: contracts.ChildERC20PredicateContract, + NewChildTokenTemplate: rootchainConfig.ERC20TemplateAddress, + NativeTokenRootAddress: rootchainConfig.RootNativeERC20Address, + } + + input, err := rootERC20PredicateParams.EncodeAbi() if err != nil { - return fmt.Errorf("failed to encode parameters for ExitHelper.initialize. error: %w", err) + return fmt.Errorf("failed to encode parameters for RootERC20Predicate.initialize. error: %w", err) + } + + addr := ethgo.Address(rootchainConfig.RootERC20PredicateAddress) + txn := ðgo.Transaction{ + To: &addr, + Input: input, + } + + return sendTransaction(txRelayer, txn, rootERC20PredicateName) +} + +// approveERC20Predicate sends approve transaction to ERC20 token so that it is able to spend given root ERC20 token +func approveERC20Predicate(txRelayer txrelayer.TxRelayer, config *polybft.RootchainConfig) error { + approveFnParams := &contractsapi.ApproveFunction{ + Spender: config.RootERC20PredicateAddress, + Amount: new(big.Int).SetUint64(defaultAllowanceValue), + } + + input, err := approveFnParams.EncodeAbi() + if err != nil { + return fmt.Errorf("failed to encode parameters for RootERC20.approve. error: %w", err) } - exitHelperAddr := ethgo.Address(rootchainConfig.ExitHelperAddress) + addr := ethgo.Address(config.RootNativeERC20Address) txn := ðgo.Transaction{ - To: &exitHelperAddr, + To: &addr, Input: input, } - receipt, err := txRelayer.SendTransaction(txn, helper.GetRootchainAdminKey()) + return sendTransaction(txRelayer, txn, rootERC20Name) +} + +// sendTransaction sends provided transaction +func sendTransaction(txRelayer txrelayer.TxRelayer, txn *ethgo.Transaction, contractName string) error { + receipt, err := txRelayer.SendTransaction(txn, helper.GetRootchainPrivateKey()) if err != nil { - return fmt.Errorf("failed to send transaction to ExitHelper. error: %w", err) + return fmt.Errorf("failed to send transaction to %s contract (%s). error: %w", contractName, txn.To.Address(), err) } if receipt.Status != uint64(types.ReceiptSuccess) { - return errors.New("failed to initialize ExitHelper contract") + return fmt.Errorf("failed to initialize %s contract", contractName) } return nil diff --git a/command/rootchain/rootchain.go b/command/rootchain/rootchain.go index 4c548a85cd..2d7fa00f62 100644 --- a/command/rootchain/rootchain.go +++ b/command/rootchain/rootchain.go @@ -3,8 +3,6 @@ package rootchain import ( "github.com/spf13/cobra" - "github.com/0xPolygon/polygon-edge/command/helper" - "github.com/0xPolygon/polygon-edge/command/rootchain/emit" "github.com/0xPolygon/polygon-edge/command/rootchain/fund" "github.com/0xPolygon/polygon-edge/command/rootchain/initcontracts" "github.com/0xPolygon/polygon-edge/command/rootchain/server" @@ -14,11 +12,9 @@ import ( func GetCommand() *cobra.Command { rootchainCmd := &cobra.Command{ Use: "rootchain", - Short: "Top level RootChain helper command.", + Short: "Top level rootchain helper command.", } - helper.RegisterGRPCAddressFlag(rootchainCmd) - registerSubcommands(rootchainCmd) return rootchainCmd @@ -26,8 +22,6 @@ func GetCommand() *cobra.Command { func registerSubcommands(baseCmd *cobra.Command) { baseCmd.AddCommand( - // rootchain emit - emit.GetCommand(), // rootchain fund fund.GetCommand(), // rootchain server diff --git a/consensus/polybft/contracts_initializer.go b/consensus/polybft/contracts_initializer.go index 1300c7cc58..2606e5f918 100644 --- a/consensus/polybft/contracts_initializer.go +++ b/consensus/polybft/contracts_initializer.go @@ -18,10 +18,12 @@ const ( ) var ( - nativeTokenName = "Polygon" - nativeTokenSymbol = "MATIC" + nativeTokenName = "Polygon" + nativeTokenSymbol = "MATIC" + nativeTokenDecimals = uint8(18) ) +// getInitChildValidatorSetInput builds input parameters for ChildValidatorSet SC initialization func getInitChildValidatorSetInput(polyBFTConfig PolyBFTConfig) ([]byte, error) { apiValidators := make([]*contractsapi.ValidatorInit, len(polyBFTConfig.InitialValidatorSet)) @@ -49,6 +51,42 @@ func getInitChildValidatorSetInput(polyBFTConfig PolyBFTConfig) ([]byte, error) return params.EncodeAbi() } +// getInitChildERC20PredicateInput builds input parameters for ERC20Predicate SC initialization +func getInitChildERC20PredicateInput(config *BridgeConfig) ([]byte, error) { + // TODO: @Stefan-Ethernal Temporary workaround just to be able to run cluster in non-bridge mode, until SC is fixed + rootERC20PredicateAddr := types.StringToAddress("0xDEAD") + rootERC20Addr := types.ZeroAddress + + if config != nil { + rootERC20PredicateAddr = config.RootERC20PredicateAddr + rootERC20Addr = config.RootNativeERC20Addr + } + + params := &contractsapi.InitializeChildERC20PredicateFunction{ + NewL2StateSender: contracts.L2StateSenderContract, + NewStateReceiver: contracts.StateReceiverContract, + NewRootERC20Predicate: rootERC20PredicateAddr, + NewChildTokenTemplate: contracts.ChildERC20Contract, + NewNativeTokenRootAddress: rootERC20Addr, + } + + return params.EncodeAbi() +} + +// getInitNativeERC20Input builds input parameters for NativeERC20 SC initialization +func getInitNativeERC20Input(nativeTokenName, nativeTokenSymbol string, nativeTokenDecimals uint8, + rootTokenAddr, childPredicateAddr types.Address) ([]byte, error) { + params := &contractsapi.InitializeNativeERC20Function{ + Name_: nativeTokenName, + Symbol_: nativeTokenSymbol, + Decimals_: nativeTokenDecimals, + RootToken_: rootTokenAddr, + Predicate_: childPredicateAddr, + } + + return params.EncodeAbi() +} + func initContract(to types.Address, input []byte, contractName string, transition *state.Transition) error { result := transition.Call2(contracts.SystemCaller, to, input, big.NewInt(0), 100_000_000) @@ -61,7 +99,7 @@ func initContract(to types.Address, input []byte, contractName string, transitio } } - return result.Err + return fmt.Errorf("failed to initialize %s contract. Reason: %w", contractName, result.Err) } return nil diff --git a/consensus/polybft/contractsapi/artifacts-gen/main.go b/consensus/polybft/contractsapi/artifacts-gen/main.go index 77c1485496..58f2c29089 100644 --- a/consensus/polybft/contractsapi/artifacts-gen/main.go +++ b/consensus/polybft/contractsapi/artifacts-gen/main.go @@ -23,17 +23,33 @@ func main() { Name string }{ { - "root/CheckpointManager.sol", - "CheckpointManager", - }, - { - "root/ExitHelper.sol", - "ExitHelper", + "child/ChildValidatorSet.sol", + "ChildValidatorSet", }, { "child/L2StateSender.sol", "L2StateSender", }, + { + "child/StateReceiver.sol", + "StateReceiver", + }, + { + "child/NativeERC20.sol", + "NativeERC20", + }, + { + "child/ChildERC20.sol", + "ChildERC20", + }, + { + "child/ChildERC20Predicate.sol", + "ChildERC20Predicate", + }, + { + "child/System.sol", + "System", + }, { "common/BLS.sol", "BLS", @@ -47,24 +63,24 @@ func main() { "Merkle", }, { - "child/StateReceiver.sol", - "StateReceiver", + "root/CheckpointManager.sol", + "CheckpointManager", }, { - "root/StateSender.sol", - "StateSender", + "root/ExitHelper.sol", + "ExitHelper", }, { - "child/ChildValidatorSet.sol", - "ChildValidatorSet", + "root/StateSender.sol", + "StateSender", }, { - "child/System.sol", - "System", + "root/RootERC20Predicate.sol", + "RootERC20Predicate", }, { - "child/MRC20.sol", - "MRC20", + "mocks/MockERC20.sol", + "MockERC20", }, } diff --git a/consensus/polybft/contractsapi/bindings-gen/main.go b/consensus/polybft/contractsapi/bindings-gen/main.go index 110ec2954e..a4f3feb4f3 100644 --- a/consensus/polybft/contractsapi/bindings-gen/main.go +++ b/consensus/polybft/contractsapi/bindings-gen/main.go @@ -72,6 +72,38 @@ func main() { }, []string{}, }, + { + "ChildERC20Predicate", + gensc.ChildERC20Predicate, + []string{ + "initialize", + }, + []string{}, + }, + { + "NativeERC20", + gensc.NativeERC20, + []string{ + "initialize", + }, + []string{}, + }, + { + "RootERC20Predicate", + gensc.RootERC20Predicate, + []string{ + "initialize", + }, + []string{}, + }, + { + "RootERC20", + gensc.RootERC20, + []string{ + "approve", + }, + []string{}, + }, } generatedData := &generatedData{} diff --git a/consensus/polybft/contractsapi/contractsapi.go b/consensus/polybft/contractsapi/contractsapi.go index 8accfd10a6..e225c9f96a 100644 --- a/consensus/polybft/contractsapi/contractsapi.go +++ b/consensus/polybft/contractsapi/contractsapi.go @@ -301,3 +301,64 @@ func (i *InitializeCheckpointManagerFunction) EncodeAbi() ([]byte, error) { func (i *InitializeCheckpointManagerFunction) DecodeAbi(buf []byte) error { return decodeMethod(CheckpointManager.Abi.Methods["initialize"], buf, i) } + +type InitializeChildERC20PredicateFunction struct { + NewL2StateSender types.Address `abi:"newL2StateSender"` + NewStateReceiver types.Address `abi:"newStateReceiver"` + NewRootERC20Predicate types.Address `abi:"newRootERC20Predicate"` + NewChildTokenTemplate types.Address `abi:"newChildTokenTemplate"` + NewNativeTokenRootAddress types.Address `abi:"newNativeTokenRootAddress"` +} + +func (i *InitializeChildERC20PredicateFunction) EncodeAbi() ([]byte, error) { + return ChildERC20Predicate.Abi.Methods["initialize"].Encode(i) +} + +func (i *InitializeChildERC20PredicateFunction) DecodeAbi(buf []byte) error { + return decodeMethod(ChildERC20Predicate.Abi.Methods["initialize"], buf, i) +} + +type InitializeNativeERC20Function struct { + Predicate_ types.Address `abi:"predicate_"` + RootToken_ types.Address `abi:"rootToken_"` + Name_ string `abi:"name_"` + Symbol_ string `abi:"symbol_"` + Decimals_ uint8 `abi:"decimals_"` +} + +func (i *InitializeNativeERC20Function) EncodeAbi() ([]byte, error) { + return NativeERC20.Abi.Methods["initialize"].Encode(i) +} + +func (i *InitializeNativeERC20Function) DecodeAbi(buf []byte) error { + return decodeMethod(NativeERC20.Abi.Methods["initialize"], buf, i) +} + +type InitializeRootERC20PredicateFunction struct { + NewStateSender types.Address `abi:"newStateSender"` + NewExitHelper types.Address `abi:"newExitHelper"` + NewChildERC20Predicate types.Address `abi:"newChildERC20Predicate"` + NewChildTokenTemplate types.Address `abi:"newChildTokenTemplate"` + NativeTokenRootAddress types.Address `abi:"nativeTokenRootAddress"` +} + +func (i *InitializeRootERC20PredicateFunction) EncodeAbi() ([]byte, error) { + return RootERC20Predicate.Abi.Methods["initialize"].Encode(i) +} + +func (i *InitializeRootERC20PredicateFunction) DecodeAbi(buf []byte) error { + return decodeMethod(RootERC20Predicate.Abi.Methods["initialize"], buf, i) +} + +type ApproveFunction struct { + Spender types.Address `abi:"spender"` + Amount *big.Int `abi:"amount"` +} + +func (a *ApproveFunction) EncodeAbi() ([]byte, error) { + return RootERC20.Abi.Methods["approve"].Encode(a) +} + +func (a *ApproveFunction) DecodeAbi(buf []byte) error { + return decodeMethod(RootERC20.Abi.Methods["approve"], buf, a) +} diff --git a/consensus/polybft/contractsapi/gen_sc_data.go b/consensus/polybft/contractsapi/gen_sc_data.go index 874218374f..74b1480a1d 100644 --- a/consensus/polybft/contractsapi/gen_sc_data.go +++ b/consensus/polybft/contractsapi/gen_sc_data.go @@ -1,14 +1,18 @@ package contractsapi // This is auto-generated file. DO NOT EDIT. -var CheckpointManagerArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"CheckpointManager\",\n \"sourceName\": \"contracts/root/CheckpointManager.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"DOMAIN\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"bls\",\n \"outputs\": [\n {\n \"internalType\": \"contract IBLS\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"bn256G2\",\n \"outputs\": [\n {\n \"internalType\": \"contract IBN256G2\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"chainId\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"checkpointBlockNumbers\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"checkpoints\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"eventRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentCheckpointBlockNumber\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentEpoch\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"currentValidatorSet\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_address\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"votingPower\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentValidatorSetHash\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentValidatorSetLength\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"leaf\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"getEventMembershipByBlockNumber\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"leaf\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"getEventMembershipByEpoch\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getEventRootByBlock\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IBLS\",\n \"name\": \"newBls\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract IBN256G2\",\n \"name\": \"newBn256G2\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"chainId_\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_address\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"blsKey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"votingPower\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.Validator[]\",\n \"name\": \"newValidatorSet\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"blockHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockRound\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"currentValidatorSetHash\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.CheckpointMetadata\",\n \"name\": \"checkpointMetadata\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"eventRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.Checkpoint\",\n \"name\": \"checkpoint\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_address\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"blsKey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"votingPower\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.Validator[]\",\n \"name\": \"newValidatorSet\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"bitmap\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"submit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalVotingPower\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b5061164f806100206000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806376671808116100a2578063babd4ee411610071578063babd4ee414610293578063d4c8e3e8146102a6578063e416d677146102b9578063e9193d2b146102c2578063f896f1a5146102d557600080fd5b8063766718081461020c57806395b0b027146102155780639a8a059214610240578063b8a242521461024957600080fd5b8063671b3793116100de578063671b3793146101895780636969a25c14610192578063729e7c6e146101e457806373cb1a11146101f757600080fd5b80631d1d4f26146101105780633569ed931461012c57806352a9674b1461013f57806361a0220814610166575b600080fd5b61011960035481565b6040519081526020015b60405180910390f35b61011961013a366004610f6e565b6102de565b6101197fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe281565b610179610174366004610f87565b610312565b6040519015158152602001610123565b61011960055481565b6101c56101a0366004610f6e565b600960205260009081526040902080546005909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610123565b6101796101f2366004610f87565b61038a565b61020a61020536600461107b565b6103e9565b005b61011960025481565b600654610228906001600160a01b031681565b6040516001600160a01b039091168152602001610123565b61011960015481565b610278610257366004610f6e565b60086020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610123565b61020a6102a1366004611106565b61053b565b600754610228906001600160a01b031681565b61011960045481565b6101196102d0366004610f6e565b6107c4565b610119600b5481565b60006008816102ee600a856107e5565b6102f99060016111f5565b8152602001908152602001600020600201549050919050565b60008061031e876102de565b9050806103725760405162461bcd60e51b815260206004820152601e60248201527f4e4f5f4556454e545f524f4f545f464f525f424c4f434b5f4e554d424552000060448201526064015b60405180910390fd5b61037f8686838787610894565b979650505050505050565b600085815260086020526040812060020154806103725760405162461bcd60e51b815260206004820152601760248201527f4e4f5f4556454e545f524f4f545f464f525f45504f43480000000000000000006044820152606401610369565b600054610100900460ff16158080156104095750600054600160ff909116105b806104235750303b158015610423575060005460ff166001145b6104865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610369565b6000805460ff1916600117905580156104a9576000805461ff0019166101001790555b6001849055600680546001600160a01b038089166001600160a01b031992831617909255600780549288169290911691909117905560038290556104ed83836109ad565b8015610533576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b8660400135600b54146105905760405162461bcd60e51b815260206004820152601a60248201527f494e56414c49445f56414c494441544f525f5345545f484153480000000000006044820152606401610369565b6000600154876020013589600001358a602001358a600001358b604001358d604001358b8b6040516020016105c6929190611208565b60408051601f198184030181528282528051602091820120908301999099528101969096526060860194909452608085019290925260a084015260c083015260e08201526101008101919091526101200160408051601f198184030181528282528051602091820120908301520160408051601f198184030181529082905260065463a850a90960e01b83529092506106e3916001600160a01b039091169063a850a9099061069b907fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe290869060040161126b565b6040805180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906112c1565b878585610ab3565b6002546106f08189610de8565b8735600081815260086020908152604091829020838155908b01356001820155908a013560029091015581101561077357600a8054600181018255600091825260208a01357fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909101556002805490919061076a9061134f565b909155506107a7565b600a805460208a0135919061078a90600190611368565b8154811061079a5761079a61137b565b6000918252602090912001555b60208801356004556107b986866109ad565b505050505050505050565b600a81815481106107d457600080fd5b600091825260209091200154905081565b815460009081036107f85750600061088e565b82546000905b808210156108455760006108128383610ec5565b600087815260209020909150859082015411156108315780915061083f565b61083c8160016111f5565b92505b506107fe565b60008211801561087157508361086e86610860600186611368565b600091825260209091200190565b54145b1561088a57610881600183611368565b9250505061088e565b5090505b92915050565b6000816108a2816002611475565b86106108e55760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610369565b8660005b8281101561099f5760008686838181106109055761090561137b565b90506020020135905060028961091b9190611497565b600003610953576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610980565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b61098b60028a6114ab565b985050806109989061134f565b90506108e9565b509094149695505050505050565b600381905560405181906109c79084908390602001611208565b60408051601f198184030181529190528051602090910120600b556000805b82811015610aaa576000858583818110610a0257610a0261137b565b905060c0020160a00135905060008111610a525760405162461bcd60e51b8152602060048201526011602482015270564f54494e475f504f5745525f5a45524f60781b6044820152606401610369565b610a5c81846111f5565b9250858583818110610a7057610a7061137b565b905060c00201600960008481526020019081526020016000208181610a9591906114d6565b9050505080610aa39061134f565b90506109e6565b50600555505050565b600354610abe610f50565b6000805b83811015610c6957610ad5868683610ee7565b15610c615781600003610b29576000818152600960205260409081902081516080810190925260010160048282826020028201915b815481526020019060010190808311610b0a5750505050509250610c42565b60008181526009602052604080822081516080810190925260010160048282826020028201915b815481526020019060010190808311610b5057505060075488516020808b01516040808d01516060808f01518b51958c0151848d0151928d01519451630cbe96a560e41b81526004810198909852602488019590955260448701929092526064860191909152608485019390935260a484019190915260c483019190915260e48201529495506001600160a01b03169363cbe96a50935061010401915050608060405180830381865afa158015610c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2f9190611535565b6060880152604087015260208601528452505b600081815260096020526040902060050154610c5e90836111f5565b91505b600101610ac2565b5080600003610cac5760405162461bcd60e51b815260206004820152600f60248201526e4249544d41505f49535f454d50545960881b6044820152606401610369565b60036005546002610cbd91906114bf565b610cc791906114ab565b8111610d155760405162461bcd60e51b815260206004820152601960248201527f494e53554646494349454e545f564f54494e475f504f574552000000000000006044820152606401610369565b60065460405163ebbdac9160e01b815260009182916001600160a01b039091169063ebbdac9190610d4e908b9088908e9060040161156b565b6040805180830381865afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e91906115e6565b91509150818015610d9c5750805b6107b95760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610369565b600082815260086020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925282351480610e3a57508051610e369060016111f5565b8235145b610e765760405162461bcd60e51b815260206004820152600d60248201526c0929cac82989288be8aa09e869609b1b6044820152606401610369565b8060200151826020013511610ec05760405162461bcd60e51b815260206004820152601060248201526f115354151657d0d21150d2d413d2539560821b6044820152606401610369565b505050565b6000610ed460028484186114ab565b610ee0908484166111f5565b9392505050565b600080610ef56008846114ab565b90506000610f04600885611497565b9050848210610f1857600092505050610ee0565b6000600160ff83161b878785818110610f3357610f3361137b565b9050013560f81c60f81b60f81c60ff161611925050509392505050565b60405180608001604052806004906020820280368337509192915050565b600060208284031215610f8057600080fd5b5035919050565b600080600080600060808688031215610f9f57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115610fcc57600080fd5b818801915088601f830112610fe057600080fd5b813581811115610fef57600080fd5b8960208260051b850101111561100457600080fd5b9699959850939650602001949392505050565b6001600160a01b038116811461102c57600080fd5b50565b60008083601f84011261104157600080fd5b50813567ffffffffffffffff81111561105957600080fd5b60208301915083602060c08302850101111561107457600080fd5b9250929050565b60008060008060006080868803121561109357600080fd5b853561109e81611017565b945060208601356110ae81611017565b935060408601359250606086013567ffffffffffffffff8111156110d157600080fd5b6110dd8882890161102f565b969995985093965092949392505050565b60006060828403121561110057600080fd5b50919050565b6000806000806000806000610140888a03121561112257600080fd5b61112c89896110ee565b965061113b8960608a016110ee565b955061010088018981111561114f57600080fd5b60c0890195503567ffffffffffffffff8082111561116c57600080fd5b6111788b838c0161102f565b90965094506101208a013591508082111561119257600080fd5b818a0191508a601f8301126111a657600080fd5b8135818111156111b557600080fd5b8b60208285010111156111c757600080fd5b60208301945080935050505092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b8082018082111561088e5761088e6111df565b60208082528181018390526000908460408401835b8681101561126057823561123081611017565b6001600160a01b0316825260808385018584013760a0838101359083015260c0928301929091019060010161121d565b509695505050505050565b82815260006020604081840152835180604085015260005b8181101561129f57858101830151858201606001528201611283565b506000606082860101526060601f19601f830116850101925050509392505050565b6000604082840312156112d357600080fd5b82601f8301126112e257600080fd5b6040516040810181811067ffffffffffffffff8211171561131357634e487b7160e01b600052604160045260246000fd5b806040525080604084018581111561132a57600080fd5b845b8181101561134457805183526020928301920161132c565b509195945050505050565b600060018201611361576113616111df565b5060010190565b8181038181111561088e5761088e6111df565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156113cc5781600019048211156113b2576113b26111df565b808516156113bf57918102915b93841c9390800290611396565b509250929050565b6000826113e35750600161088e565b816113f05750600061088e565b816001811461140657600281146114105761142c565b600191505061088e565b60ff841115611421576114216111df565b50506001821b61088e565b5060208310610133831016604e8410600b841016171561144f575081810a61088e565b6114598383611391565b806000190482111561146d5761146d6111df565b029392505050565b6000610ee083836113d4565b634e487b7160e01b600052601260045260246000fd5b6000826114a6576114a6611481565b500690565b6000826114ba576114ba611481565b500490565b808202811582820484141761088e5761088e6111df565b81356114e181611017565b81546001600160a01b0319166001600160a01b0391909116178155602082810160005b600481101561152457813560018286018101919091559183019101611504565b50505060a082013560058201555050565b6000806000806080858703121561154b57600080fd5b505082516020840151604085015160609095015191969095509092509050565b61010081016040858337604082018460005b600481101561159c57815183526020928301929091019060010161157d565b50505060c082018360005b60028110156115c65781518352602092830192909101906001016115a7565b505050949350505050565b805180151581146115e157600080fd5b919050565b600080604083850312156115f957600080fd5b611602836115d1565b9150611610602084016115d1565b9050925092905056fea2646970667358221220400d821f1a978749561f150cfa6606aeeb5afa991eec3c90eec1b40a85c87ff364736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806376671808116100a2578063babd4ee411610071578063babd4ee414610293578063d4c8e3e8146102a6578063e416d677146102b9578063e9193d2b146102c2578063f896f1a5146102d557600080fd5b8063766718081461020c57806395b0b027146102155780639a8a059214610240578063b8a242521461024957600080fd5b8063671b3793116100de578063671b3793146101895780636969a25c14610192578063729e7c6e146101e457806373cb1a11146101f757600080fd5b80631d1d4f26146101105780633569ed931461012c57806352a9674b1461013f57806361a0220814610166575b600080fd5b61011960035481565b6040519081526020015b60405180910390f35b61011961013a366004610f6e565b6102de565b6101197fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe281565b610179610174366004610f87565b610312565b6040519015158152602001610123565b61011960055481565b6101c56101a0366004610f6e565b600960205260009081526040902080546005909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610123565b6101796101f2366004610f87565b61038a565b61020a61020536600461107b565b6103e9565b005b61011960025481565b600654610228906001600160a01b031681565b6040516001600160a01b039091168152602001610123565b61011960015481565b610278610257366004610f6e565b60086020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610123565b61020a6102a1366004611106565b61053b565b600754610228906001600160a01b031681565b61011960045481565b6101196102d0366004610f6e565b6107c4565b610119600b5481565b60006008816102ee600a856107e5565b6102f99060016111f5565b8152602001908152602001600020600201549050919050565b60008061031e876102de565b9050806103725760405162461bcd60e51b815260206004820152601e60248201527f4e4f5f4556454e545f524f4f545f464f525f424c4f434b5f4e554d424552000060448201526064015b60405180910390fd5b61037f8686838787610894565b979650505050505050565b600085815260086020526040812060020154806103725760405162461bcd60e51b815260206004820152601760248201527f4e4f5f4556454e545f524f4f545f464f525f45504f43480000000000000000006044820152606401610369565b600054610100900460ff16158080156104095750600054600160ff909116105b806104235750303b158015610423575060005460ff166001145b6104865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610369565b6000805460ff1916600117905580156104a9576000805461ff0019166101001790555b6001849055600680546001600160a01b038089166001600160a01b031992831617909255600780549288169290911691909117905560038290556104ed83836109ad565b8015610533576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b8660400135600b54146105905760405162461bcd60e51b815260206004820152601a60248201527f494e56414c49445f56414c494441544f525f5345545f484153480000000000006044820152606401610369565b6000600154876020013589600001358a602001358a600001358b604001358d604001358b8b6040516020016105c6929190611208565b60408051601f198184030181528282528051602091820120908301999099528101969096526060860194909452608085019290925260a084015260c083015260e08201526101008101919091526101200160408051601f198184030181528282528051602091820120908301520160408051601f198184030181529082905260065463a850a90960e01b83529092506106e3916001600160a01b039091169063a850a9099061069b907fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe290869060040161126b565b6040805180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906112c1565b878585610ab3565b6002546106f08189610de8565b8735600081815260086020908152604091829020838155908b01356001820155908a013560029091015581101561077357600a8054600181018255600091825260208a01357fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909101556002805490919061076a9061134f565b909155506107a7565b600a805460208a0135919061078a90600190611368565b8154811061079a5761079a61137b565b6000918252602090912001555b60208801356004556107b986866109ad565b505050505050505050565b600a81815481106107d457600080fd5b600091825260209091200154905081565b815460009081036107f85750600061088e565b82546000905b808210156108455760006108128383610ec5565b600087815260209020909150859082015411156108315780915061083f565b61083c8160016111f5565b92505b506107fe565b60008211801561087157508361086e86610860600186611368565b600091825260209091200190565b54145b1561088a57610881600183611368565b9250505061088e565b5090505b92915050565b6000816108a2816002611475565b86106108e55760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610369565b8660005b8281101561099f5760008686838181106109055761090561137b565b90506020020135905060028961091b9190611497565b600003610953576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610980565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b61098b60028a6114ab565b985050806109989061134f565b90506108e9565b509094149695505050505050565b600381905560405181906109c79084908390602001611208565b60408051601f198184030181529190528051602090910120600b556000805b82811015610aaa576000858583818110610a0257610a0261137b565b905060c0020160a00135905060008111610a525760405162461bcd60e51b8152602060048201526011602482015270564f54494e475f504f5745525f5a45524f60781b6044820152606401610369565b610a5c81846111f5565b9250858583818110610a7057610a7061137b565b905060c00201600960008481526020019081526020016000208181610a9591906114d6565b9050505080610aa39061134f565b90506109e6565b50600555505050565b600354610abe610f50565b6000805b83811015610c6957610ad5868683610ee7565b15610c615781600003610b29576000818152600960205260409081902081516080810190925260010160048282826020028201915b815481526020019060010190808311610b0a5750505050509250610c42565b60008181526009602052604080822081516080810190925260010160048282826020028201915b815481526020019060010190808311610b5057505060075488516020808b01516040808d01516060808f01518b51958c0151848d0151928d01519451630cbe96a560e41b81526004810198909852602488019590955260448701929092526064860191909152608485019390935260a484019190915260c483019190915260e48201529495506001600160a01b03169363cbe96a50935061010401915050608060405180830381865afa158015610c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2f9190611535565b6060880152604087015260208601528452505b600081815260096020526040902060050154610c5e90836111f5565b91505b600101610ac2565b5080600003610cac5760405162461bcd60e51b815260206004820152600f60248201526e4249544d41505f49535f454d50545960881b6044820152606401610369565b60036005546002610cbd91906114bf565b610cc791906114ab565b8111610d155760405162461bcd60e51b815260206004820152601960248201527f494e53554646494349454e545f564f54494e475f504f574552000000000000006044820152606401610369565b60065460405163ebbdac9160e01b815260009182916001600160a01b039091169063ebbdac9190610d4e908b9088908e9060040161156b565b6040805180830381865afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e91906115e6565b91509150818015610d9c5750805b6107b95760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610369565b600082815260086020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925282351480610e3a57508051610e369060016111f5565b8235145b610e765760405162461bcd60e51b815260206004820152600d60248201526c0929cac82989288be8aa09e869609b1b6044820152606401610369565b8060200151826020013511610ec05760405162461bcd60e51b815260206004820152601060248201526f115354151657d0d21150d2d413d2539560821b6044820152606401610369565b505050565b6000610ed460028484186114ab565b610ee0908484166111f5565b9392505050565b600080610ef56008846114ab565b90506000610f04600885611497565b9050848210610f1857600092505050610ee0565b6000600160ff83161b878785818110610f3357610f3361137b565b9050013560f81c60f81b60f81c60ff161611925050509392505050565b60405180608001604052806004906020820280368337509192915050565b600060208284031215610f8057600080fd5b5035919050565b600080600080600060808688031215610f9f57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115610fcc57600080fd5b818801915088601f830112610fe057600080fd5b813581811115610fef57600080fd5b8960208260051b850101111561100457600080fd5b9699959850939650602001949392505050565b6001600160a01b038116811461102c57600080fd5b50565b60008083601f84011261104157600080fd5b50813567ffffffffffffffff81111561105957600080fd5b60208301915083602060c08302850101111561107457600080fd5b9250929050565b60008060008060006080868803121561109357600080fd5b853561109e81611017565b945060208601356110ae81611017565b935060408601359250606086013567ffffffffffffffff8111156110d157600080fd5b6110dd8882890161102f565b969995985093965092949392505050565b60006060828403121561110057600080fd5b50919050565b6000806000806000806000610140888a03121561112257600080fd5b61112c89896110ee565b965061113b8960608a016110ee565b955061010088018981111561114f57600080fd5b60c0890195503567ffffffffffffffff8082111561116c57600080fd5b6111788b838c0161102f565b90965094506101208a013591508082111561119257600080fd5b818a0191508a601f8301126111a657600080fd5b8135818111156111b557600080fd5b8b60208285010111156111c757600080fd5b60208301945080935050505092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b8082018082111561088e5761088e6111df565b60208082528181018390526000908460408401835b8681101561126057823561123081611017565b6001600160a01b0316825260808385018584013760a0838101359083015260c0928301929091019060010161121d565b509695505050505050565b82815260006020604081840152835180604085015260005b8181101561129f57858101830151858201606001528201611283565b506000606082860101526060601f19601f830116850101925050509392505050565b6000604082840312156112d357600080fd5b82601f8301126112e257600080fd5b6040516040810181811067ffffffffffffffff8211171561131357634e487b7160e01b600052604160045260246000fd5b806040525080604084018581111561132a57600080fd5b845b8181101561134457805183526020928301920161132c565b509195945050505050565b600060018201611361576113616111df565b5060010190565b8181038181111561088e5761088e6111df565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156113cc5781600019048211156113b2576113b26111df565b808516156113bf57918102915b93841c9390800290611396565b509250929050565b6000826113e35750600161088e565b816113f05750600061088e565b816001811461140657600281146114105761142c565b600191505061088e565b60ff841115611421576114216111df565b50506001821b61088e565b5060208310610133831016604e8410600b841016171561144f575081810a61088e565b6114598383611391565b806000190482111561146d5761146d6111df565b029392505050565b6000610ee083836113d4565b634e487b7160e01b600052601260045260246000fd5b6000826114a6576114a6611481565b500690565b6000826114ba576114ba611481565b500490565b808202811582820484141761088e5761088e6111df565b81356114e181611017565b81546001600160a01b0319166001600160a01b0391909116178155602082810160005b600481101561152457813560018286018101919091559183019101611504565b50505060a082013560058201555050565b6000806000806080858703121561154b57600080fd5b505082516020840151604085015160609095015191969095509092509050565b61010081016040858337604082018460005b600481101561159c57815183526020928301929091019060010161157d565b50505060c082018360005b60028110156115c65781518352602092830192909101906001016115a7565b505050949350505050565b805180151581146115e157600080fd5b919050565b600080604083850312156115f957600080fd5b611602836115d1565b9150611610602084016115d1565b9050925092905056fea2646970667358221220400d821f1a978749561f150cfa6606aeeb5afa991eec3c90eec1b40a85c87ff364736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var ExitHelperArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ExitHelper\",\n \"sourceName\": \"contracts/root/ExitHelper.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"returnData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"ExitProcessed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"unhashedLeaf\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"internalType\": \"struct IExitHelper.BatchExitInput[]\",\n \"name\": \"inputs\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"batchExit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"checkpointManager\",\n \"outputs\": [\n {\n \"internalType\": \"contract ICheckpointManager\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"unhashedLeaf\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"exit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract ICheckpointManager\",\n \"name\": \"newCheckpointManager\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"processedExits\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610b8b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806350607b351461005c578063aa209cc314610071578063bd88ea7914610084578063c0857ba0146100bc578063c4d66de8146100e7575b600080fd5b61006f61006a366004610729565b6100fa565b005b61006f61007f36600461076b565b61022c565b6100a761009236600461081c565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6002546100cf906001600160a01b031681565b6040516001600160a01b0390911681526020016100b3565b61006f6100f536600461084d565b61029c565b6002546001600160a01b03166101575760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a4544000000000060448201526064015b60405180910390fd5b8060005b818110156102265761021e84848381811061017857610178610871565b905060200281019061018a9190610887565b3585858481811061019d5761019d610871565b90506020028101906101af9190610887565b602001358686858181106101c5576101c5610871565b90506020028101906101d79190610887565b6101e59060408101906108a7565b8888878181106101f7576101f7610871565b90506020028101906102099190610887565b6102179060608101906108ee565b600161042e565b60010161015b565b50505050565b6002546001600160a01b03166102845760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a45440000000000604482015260640161014e565b610294868686868686600061042e565b505050505050565b600054610100900460ff16158080156102bc5750600054600160ff909116105b806102d65750303b1580156102d6575060005460ff166001145b6103395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161014e565b6000805460ff19166001179055801561035c576000805461ff0019166101001790555b6001600160a01b0382161580159061037d57506001600160a01b0382163b15155b6103c95760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a20494e56414c49445f414444524553530000000000604482015260640161014e565b600280546001600160a01b0319166001600160a01b038416179055801561042a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600080808061043f888a018a61094e565b935093509350935084156104725760008481526001602052604090205460ff161561046d57505050506106d4565b6104dc565b60008481526001602052604090205460ff16156104dc5760405162461bcd60e51b815260206004820152602260248201527f4578697448656c7065723a20455849545f414c52454144595f50524f43455353604482015261115160f21b606482015260840161014e565b6002546040516001600160a01b03909116906361a02208908d90610503908d908d90610a2e565b6040519081900381206001600160e01b031960e085901b16825261053092918f908d908d90600401610a3e565b602060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190610a8b565b6105bd5760405162461bcd60e51b815260206004820152601960248201527f4578697448656c7065723a20494e56414c49445f50524f4f4600000000000000604482015260640161014e565b6000848152600160208190526040808320805460ff19169092179091555181906001600160a01b038516906105fa90889088908790602401610afd565b60408051601f198184030181529181526020820180516001600160e01b031663f43cda8b60e01b1790525161062f9190610b30565b6000604051808303816000865af19150503d806000811461066c576040519150601f19603f3d011682016040523d82523d6000602084013e610671565b606091505b509150915081610692576000868152600160205260409020805460ff191690555b811515867f8bbfa0c9bee3785c03700d2a909592286efb83fc7e7002be5764424b9842f7ec836040516106c59190610b42565b60405180910390a35050505050505b50505050505050565b60008083601f8401126106ef57600080fd5b50813567ffffffffffffffff81111561070757600080fd5b6020830191508360208260051b850101111561072257600080fd5b9250929050565b6000806020838503121561073c57600080fd5b823567ffffffffffffffff81111561075357600080fd5b61075f858286016106dd565b90969095509350505050565b6000806000806000806080878903121561078457600080fd5b8635955060208701359450604087013567ffffffffffffffff808211156107aa57600080fd5b818901915089601f8301126107be57600080fd5b8135818111156107cd57600080fd5b8a60208285010111156107df57600080fd5b6020830196508095505060608901359150808211156107fd57600080fd5b5061080a89828a016106dd565b979a9699509497509295939492505050565b60006020828403121561082e57600080fd5b5035919050565b6001600160a01b038116811461084a57600080fd5b50565b60006020828403121561085f57600080fd5b813561086a81610835565b9392505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261089d57600080fd5b9190910192915050565b6000808335601e198436030181126108be57600080fd5b83018035915067ffffffffffffffff8211156108d957600080fd5b60200191503681900382131561072257600080fd5b6000808335601e1984360301811261090557600080fd5b83018035915067ffffffffffffffff82111561092057600080fd5b6020019150600581901b360382131561072257600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561096457600080fd5b84359350602085013561097681610835565b9250604085013561098681610835565b9150606085013567ffffffffffffffff808211156109a357600080fd5b818701915087601f8301126109b757600080fd5b8135818111156109c9576109c9610938565b604051601f8201601f19908116603f011681019083821181831017156109f1576109f1610938565b816040528281528a6020848701011115610a0a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8183823760009101908152919050565b85815284602082015283604082015260806060820152816080820152600060018060fb1b03831115610a6f57600080fd5b8260051b808560a08501379190910160a0019695505050505050565b600060208284031215610a9d57600080fd5b8151801515811461086a57600080fd5b60005b83811015610ac8578181015183820152602001610ab0565b50506000910152565b60008151808452610ae9816020860160208601610aad565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090610b2790830184610ad1565b95945050505050565b6000825161089d818460208701610aad565b60208152600061086a6020830184610ad156fea264697066735822122015950e3b9ae768ee45b864abec459fdba63c937e8210e6e641a0e05caa1a584364736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100575760003560e01c806350607b351461005c578063aa209cc314610071578063bd88ea7914610084578063c0857ba0146100bc578063c4d66de8146100e7575b600080fd5b61006f61006a366004610729565b6100fa565b005b61006f61007f36600461076b565b61022c565b6100a761009236600461081c565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6002546100cf906001600160a01b031681565b6040516001600160a01b0390911681526020016100b3565b61006f6100f536600461084d565b61029c565b6002546001600160a01b03166101575760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a4544000000000060448201526064015b60405180910390fd5b8060005b818110156102265761021e84848381811061017857610178610871565b905060200281019061018a9190610887565b3585858481811061019d5761019d610871565b90506020028101906101af9190610887565b602001358686858181106101c5576101c5610871565b90506020028101906101d79190610887565b6101e59060408101906108a7565b8888878181106101f7576101f7610871565b90506020028101906102099190610887565b6102179060608101906108ee565b600161042e565b60010161015b565b50505050565b6002546001600160a01b03166102845760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a45440000000000604482015260640161014e565b610294868686868686600061042e565b505050505050565b600054610100900460ff16158080156102bc5750600054600160ff909116105b806102d65750303b1580156102d6575060005460ff166001145b6103395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161014e565b6000805460ff19166001179055801561035c576000805461ff0019166101001790555b6001600160a01b0382161580159061037d57506001600160a01b0382163b15155b6103c95760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a20494e56414c49445f414444524553530000000000604482015260640161014e565b600280546001600160a01b0319166001600160a01b038416179055801561042a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600080808061043f888a018a61094e565b935093509350935084156104725760008481526001602052604090205460ff161561046d57505050506106d4565b6104dc565b60008481526001602052604090205460ff16156104dc5760405162461bcd60e51b815260206004820152602260248201527f4578697448656c7065723a20455849545f414c52454144595f50524f43455353604482015261115160f21b606482015260840161014e565b6002546040516001600160a01b03909116906361a02208908d90610503908d908d90610a2e565b6040519081900381206001600160e01b031960e085901b16825261053092918f908d908d90600401610a3e565b602060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190610a8b565b6105bd5760405162461bcd60e51b815260206004820152601960248201527f4578697448656c7065723a20494e56414c49445f50524f4f4600000000000000604482015260640161014e565b6000848152600160208190526040808320805460ff19169092179091555181906001600160a01b038516906105fa90889088908790602401610afd565b60408051601f198184030181529181526020820180516001600160e01b031663f43cda8b60e01b1790525161062f9190610b30565b6000604051808303816000865af19150503d806000811461066c576040519150601f19603f3d011682016040523d82523d6000602084013e610671565b606091505b509150915081610692576000868152600160205260409020805460ff191690555b811515867f8bbfa0c9bee3785c03700d2a909592286efb83fc7e7002be5764424b9842f7ec836040516106c59190610b42565b60405180910390a35050505050505b50505050505050565b60008083601f8401126106ef57600080fd5b50813567ffffffffffffffff81111561070757600080fd5b6020830191508360208260051b850101111561072257600080fd5b9250929050565b6000806020838503121561073c57600080fd5b823567ffffffffffffffff81111561075357600080fd5b61075f858286016106dd565b90969095509350505050565b6000806000806000806080878903121561078457600080fd5b8635955060208701359450604087013567ffffffffffffffff808211156107aa57600080fd5b818901915089601f8301126107be57600080fd5b8135818111156107cd57600080fd5b8a60208285010111156107df57600080fd5b6020830196508095505060608901359150808211156107fd57600080fd5b5061080a89828a016106dd565b979a9699509497509295939492505050565b60006020828403121561082e57600080fd5b5035919050565b6001600160a01b038116811461084a57600080fd5b50565b60006020828403121561085f57600080fd5b813561086a81610835565b9392505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261089d57600080fd5b9190910192915050565b6000808335601e198436030181126108be57600080fd5b83018035915067ffffffffffffffff8211156108d957600080fd5b60200191503681900382131561072257600080fd5b6000808335601e1984360301811261090557600080fd5b83018035915067ffffffffffffffff82111561092057600080fd5b6020019150600581901b360382131561072257600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561096457600080fd5b84359350602085013561097681610835565b9250604085013561098681610835565b9150606085013567ffffffffffffffff808211156109a357600080fd5b818701915087601f8301126109b757600080fd5b8135818111156109c9576109c9610938565b604051601f8201601f19908116603f011681019083821181831017156109f1576109f1610938565b816040528281528a6020848701011115610a0a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8183823760009101908152919050565b85815284602082015283604082015260806060820152816080820152600060018060fb1b03831115610a6f57600080fd5b8260051b808560a08501379190910160a0019695505050505050565b600060208284031215610a9d57600080fd5b8151801515811461086a57600080fd5b60005b83811015610ac8578181015183820152602001610ab0565b50506000910152565b60008151808452610ae9816020860160208601610aad565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090610b2790830184610ad1565b95945050505050565b6000825161089d818460208701610aad565b60208152600061086a6020830184610ad156fea264697066735822122015950e3b9ae768ee45b864abec459fdba63c937e8210e6e641a0e05caa1a584364736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var L2StateSenderArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"L2StateSender\",\n \"sourceName\": \"contracts/child/L2StateSender.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"L2StateSynced\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_LENGTH\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"counter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"syncState\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea2646970667358221220a59dc3bf8bb1e55549769b7a3a6a0298cc525f2ef05ada19759009590873d22664736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea2646970667358221220a59dc3bf8bb1e55549769b7a3a6a0298cc525f2ef05ada19759009590873d22664736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var BLSArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"BLS\",\n \"sourceName\": \"contracts/common/BLS.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"domain\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"message\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"expandMsgTo96\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"domain\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"messages\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"hashToField\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"domain\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"message\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"hashToPoint\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"point\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"isOnCurveG1\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"_isOnCurve\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"point\",\n \"type\": \"uint256[4]\"\n }\n ],\n \"name\": \"isOnCurveG2\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"_isOnCurve\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"isValidSignature\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_x\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mapToPoint\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"p\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4][]\",\n \"name\": \"pubkeys\",\n \"type\": \"uint256[4][]\"\n },\n {\n \"internalType\": \"uint256[2][]\",\n \"name\": \"messages\",\n \"type\": \"uint256[2][]\"\n }\n ],\n \"name\": \"verifyMultiple\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"checkResult\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"callSuccess\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4][]\",\n \"name\": \"pubkeys\",\n \"type\": \"uint256[4][]\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"message\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"verifyMultipleSameMsg\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"checkResult\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"callSuccess\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"pubkey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"message\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"verifySingle\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50612e62806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806391ec2d2b1161006657806391ec2d2b1461013b578063a850a9091461015b578063d58e77331461016e578063e242cce914610181578063ebbdac911461019457600080fd5b8063115000fe146100a3578063247dd9fb146100cb5780633e5476ce146100de5780638669026f146101085780639141376314610128575b600080fd5b6100b66100b13660046127eb565b6101a7565b60405190151581526020015b60405180910390f35b6100b66100d9366004612869565b61030e565b6100f16100ec366004612926565b6103b8565b6040805192151583529015156020830152016100c2565b61011b6101163660046129b5565b6107e8565b6040516100c29190612a3f565b6100f1610136366004612a70565b610904565b61014e6101493660046129b5565b610dee565b6040516100c29190612b6f565b61011b6101693660046129b5565b61108b565b61011b61017c366004612b89565b61126d565b6100b661018f366004612869565b611643565b6100f16101a2366004612ba2565b6116a2565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528283098182830101600080516020612e0d8339815191528283840108600080516020612e0d8339815191528682600080516020612e0d83398151915203860109935050600080516020612e0d8339815191528483600080516020612e0d833981519152038301099150600080516020612e0d8339815191527f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e584089450600080516020612e0d8339815191527e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2830893506040870151925060608701519150600080516020612e0d8339815191528083600080516020612e0d833981519152038508600080516020612e0d833981519152848608099050600080516020612e0d833981519152828460011b0994149290931491909116949350505050565b8051600090600080516020612e0d83398151915211158061034157506020820151600080516020612e0d83398151915211155b1561034e57506000919050565b60405163e242cce960e01b8152309063e242cce990610371908590600401612a3f565b602060405180830381865afa15801561038e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b29190612c05565b92915050565b60008083806103e25760405162461bcd60e51b81526004016103d990612c27565b60405180910390fd5b60006103ef826001612c7e565b6103fa906006612c91565b905060008167ffffffffffffffff8111156104175761041761277b565b604051908082528060200260200182016040528015610440578160200160208202803683370190505b50905088600060200201358160008151811061045e5761045e612bef565b602090810291909101015288600160200201358160018151811061048457610484612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2816002815181106104c4576104c4612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed8160038151811061050457610504612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec8160048151811061054457610544612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8160058151811061058457610584612bef565b60200260200101818152505060005b838110156107a3578635826105a9836006612c91565b6105b4906006612c7e565b815181106105c4576105c4612bef565b60209081029190910101528660016020020135826105e3836006612c91565b6105ee906007612c7e565b815181106105fe576105fe612bef565b60200260200101818152505088888281811061061c5761061c612bef565b90506080020160016004811061063457610634612bef565b602002013582610645836006612c91565b610650906008612c7e565b8151811061066057610660612bef565b60200260200101818152505088888281811061067e5761067e612bef565b90506080020160006004811061069657610696612bef565b6020020135826106a7836006612c91565b6106b2906009612c7e565b815181106106c2576106c2612bef565b6020026020010181815250508888828181106106e0576106e0612bef565b9050608002016003600481106106f8576106f8612bef565b602002013582610709836006612c91565b61071490600a612c7e565b8151811061072457610724612bef565b60200260200101818152505088888281811061074257610742612bef565b90506080020160026004811061075a5761075a612bef565b60200201358261076b836006612c91565b61077690600b612c7e565b8151811061078657610786612bef565b60209081029190910101528061079b81612ca8565b915050610593565b506107ac612721565b602081602085026020850160085afa9450846107d25760008095509550505050506107df565b5115159450600193505050505b94509492505050565b6107f061273f565b6040516391ec2d2b60e01b815260009030906391ec2d2b906108189087908790600401612cc1565b600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190612ce2565b9050600080600080601885016001600160c01b0381511693506030860190506001600160c01b038151169450600080516020612e0d83398151915285600080516020612e0d833981519152600160c01b870908604887015160608801516001600160c01b0390811697501694509250600080516020612e0d83398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b60008084806109255760405162461bcd60e51b81526004016103d990612c27565b8084146109925760405162461bcd60e51b815260206004820152603560248201527f424c533a206e756d626572206f66207075626c6963206b65797320616e64206d604482015274195cdcd859d95cc81b5d5cdd08189948195c5d585b605a1b60648201526084016103d9565b600061099f826001612c7e565b6109aa906006612c91565b905060008167ffffffffffffffff8111156109c7576109c761277b565b6040519080825280602002602001820160405280156109f0578160200160208202803683370190505b509050896000602002013581600081518110610a0e57610a0e612bef565b6020908102919091010152896001602002013581600181518110610a3457610a34612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281600281518110610a7457610a74612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81600381518110610ab457610ab4612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81600481518110610af457610af4612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81600581518110610b3457610b34612bef565b60200260200101818152505060005b83811015610da857878782818110610b5d57610b5d612bef565b905060400201600060028110610b7557610b75612bef565b602002013582610b86836006612c91565b610b91906006612c7e565b81518110610ba157610ba1612bef565b602002602001018181525050878782818110610bbf57610bbf612bef565b905060400201600160028110610bd757610bd7612bef565b602002013582610be8836006612c91565b610bf3906007612c7e565b81518110610c0357610c03612bef565b602002602001018181525050898982818110610c2157610c21612bef565b905060800201600160048110610c3957610c39612bef565b602002013582610c4a836006612c91565b610c55906008612c7e565b81518110610c6557610c65612bef565b602002602001018181525050898982818110610c8357610c83612bef565b905060800201600060048110610c9b57610c9b612bef565b602002013582610cac836006612c91565b610cb7906009612c7e565b81518110610cc757610cc7612bef565b602002602001018181525050898982818110610ce557610ce5612bef565b905060800201600360048110610cfd57610cfd612bef565b602002013582610d0e836006612c91565b610d1990600a612c7e565b81518110610d2957610d29612bef565b602002602001018181525050898982818110610d4757610d47612bef565b905060800201600260048110610d5f57610d5f612bef565b602002013582610d70836006612c91565b610d7b90600b612c7e565b81518110610d8b57610d8b612bef565b602090810291909101015280610da081612ca8565b915050610b43565b50610db1612721565b602081602085026020850160085afa945084610dd7576000809550955050505050610de4565b5115159450600193505050505b9550959350505050565b80516060906000610e00826020612c7e565b610e0b906040612c7e565b610e16906004612c7e565b67ffffffffffffffff811115610e2e57610e2e61277b565b6040519080825280601f01601f191660200182016040528015610e58576020820181803683370190505b5060408051606080825260808201909252919250600091906020820181803683370190505090506060820160005b84811015610ea05760208188018101518383015201610e86565b5083016000815360010160608153600101600081536001810187905260210160208153506000600283604051610ed69190612d59565b602060405180830381855afa158015610ef3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f169190612d75565b9050600060429450848452816020850152600160408501536041840188905260206061850153600284604051610f4c9190612d59565b602060405180830381855afa158015610f69573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8c9190612d75565b905080602084015280821880602086015250600260408501536041840188905260206061850153600284604051610fc39190612d59565b602060405180830381855afa158015610fe0573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110039190612d75565b90508060408401528082188060208601525060036040850153604184018890526020606185015360028460405161103a9190612d59565b602060405180830381855afa158015611057573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061107a9190612d75565b606084015250909695505050505050565b61109361273f565b604051638669026f60e01b81526000903090638669026f906110bb9087908790600401612cc1565b6040805180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190612d8e565b805160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa15801561113f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111639190612d8e565b602083015160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa1580156111aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190612d8e565b90506111d861275d565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa9050808061121357fe5b50806112615760405162461bcd60e51b815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c656400000000000000000060448201526064016103d9565b50919695505050505050565b61127561273f565b600080516020612e0d83398151915282106112de5760405162461bcd60e51b815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d604482015262195b9d60ea1b60648201526084016103d9565b8160006112ea82611871565b9150506000600080516020612e0d8339815191528061130b5761130b612de3565b8384099050600080516020612e0d8339815191526004820890506000600080516020612e0d83398151915277b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd850990506000600080516020612e0d83398151915283830990506113728161189a565b9050600080516020612e0d8339815191528283099150600080516020612e0d8339815191528183099150600080516020612e0d8339815191528286099150600080516020612e0d8339815191526113d783600080516020612e0d833981519152612df9565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe089450600080516020612e0d8339815191528586099150600080516020612e0d8339815191528583099150600080516020612e0d833981519152600383089150600061143b83611871565b9093509050801561148357846114665761146383600080516020612e0d833981519152612df9565b92505b505060408051808201909152938452602084015250909392505050565b600080516020612e0d833981519152600187086114ae90600080516020612e0d833981519152612df9565b9550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506114f683611871565b9093509050801561151e57846114665761146383600080516020612e0d833981519152612df9565b600080516020612e0d8339815191528485099550600080516020612e0d8339815191528687099550600080516020612e0d8339815191528287099550600080516020612e0d8339815191528287099550600080516020612e0d833981519152600187089550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506115c983611871565b9093509050806116265760405162461bcd60e51b815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201526137b760f11b60648201526084016103d9565b846114665761146383600080516020612e0d833981519152612df9565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528382099050600080516020612e0d833981519152600382089050600080516020612e0d83398151915282830914949350505050565b6000806000604051806101800160405280876000600281106116c6576116c6612bef565b60200201358152602001876001600281106116e3576116e3612bef565b602002013581526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81526020018560006002811061179857611798612bef565b60200201358152602001856001600281106117b5576117b5612bef565b60200201358152602001866001600481106117d2576117d2612bef565b60200201358152602001866000600481106117ef576117ef612bef565b602002013581526020018660036004811061180c5761180c612bef565b602002013581526020018660026004811061182957611829612bef565b60200201359052905061183a612721565b60006020826101808560085afa90508061185d5760008094509450505050611869565b50511515925060019150505b935093915050565b60008061187d836118a5565b915082600080516020612e0d833981519152838409149050915091565b60006103b282611fda565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156127b4576127b461277b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156127e3576127e361277b565b604052919050565b6000608082840312156127fd57600080fd5b82601f83011261280c57600080fd5b6040516080810181811067ffffffffffffffff8211171561282f5761282f61277b565b60405280608084018581111561284457600080fd5b845b8181101561285e578035835260209283019201612846565b509195945050505050565b60006040828403121561287b57600080fd5b82601f83011261288a57600080fd5b612892612791565b8060408401858111156128a457600080fd5b845b818110156128be5780358452602093840193016128a6565b509095945050505050565b80604081018310156103b257600080fd5b60008083601f8401126128ec57600080fd5b50813567ffffffffffffffff81111561290457600080fd5b6020830191508360208260071b850101111561291f57600080fd5b9250929050565b60008060008060a0858703121561293c57600080fd5b61294686866128c9565b9350604085013567ffffffffffffffff81111561296257600080fd5b61296e878288016128da565b9094509250612982905086606087016128c9565b905092959194509250565b600067ffffffffffffffff8211156129a7576129a761277b565b50601f01601f191660200190565b600080604083850312156129c857600080fd5b82359150602083013567ffffffffffffffff8111156129e657600080fd5b8301601f810185136129f757600080fd5b8035612a0a612a058261298d565b6127ba565b818152866020838501011115612a1f57600080fd5b816020840160208301376000602083830101528093505050509250929050565b60408101818360005b6002811015612a67578151835260209283019290910190600101612a48565b50505092915050565b600080600080600060808688031215612a8857600080fd5b612a9287876128c9565b9450604086013567ffffffffffffffff80821115612aaf57600080fd5b612abb89838a016128da565b90965094506060880135915080821115612ad457600080fd5b818801915088601f830112612ae857600080fd5b813581811115612af757600080fd5b8960208260061b8501011115612b0c57600080fd5b9699959850939650602001949392505050565b60005b83811015612b3a578181015183820152602001612b22565b50506000910152565b60008151808452612b5b816020860160208601612b1f565b601f01601f19169290920160200192915050565b602081526000612b826020830184612b43565b9392505050565b600060208284031215612b9b57600080fd5b5035919050565b60008060006101008486031215612bb857600080fd5b612bc285856128c9565b925060c0840185811115612bd557600080fd5b604085019250612be586826128c9565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c1757600080fd5b81518015158114612b8257600080fd5b60208082526021908201527f424c533a206e756d626572206f66207075626c6963206b6579206973207a65726040820152606f60f81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808201808211156103b2576103b2612c68565b80820281158282048414176103b2576103b2612c68565b600060018201612cba57612cba612c68565b5060010190565b828152604060208201526000612cda6040830184612b43565b949350505050565b600060208284031215612cf457600080fd5b815167ffffffffffffffff811115612d0b57600080fd5b8201601f81018413612d1c57600080fd5b8051612d2a612a058261298d565b818152856020838501011115612d3f57600080fd5b612d50826020830160208601612b1f565b95945050505050565b60008251612d6b818460208701612b1f565b9190910192915050565b600060208284031215612d8757600080fd5b5051919050565b600060408284031215612da057600080fd5b82601f830112612daf57600080fd5b612db7612791565b806040840185811115612dc957600080fd5b845b818110156128be578051845260209384019301612dcb565b634e487b7160e01b600052601260045260246000fd5b818103818111156103b2576103b2612c6856fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220046fd04cf652b14b5d4629e14b0659a560d128e873764c278e0250d47ac47cde64736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806391ec2d2b1161006657806391ec2d2b1461013b578063a850a9091461015b578063d58e77331461016e578063e242cce914610181578063ebbdac911461019457600080fd5b8063115000fe146100a3578063247dd9fb146100cb5780633e5476ce146100de5780638669026f146101085780639141376314610128575b600080fd5b6100b66100b13660046127eb565b6101a7565b60405190151581526020015b60405180910390f35b6100b66100d9366004612869565b61030e565b6100f16100ec366004612926565b6103b8565b6040805192151583529015156020830152016100c2565b61011b6101163660046129b5565b6107e8565b6040516100c29190612a3f565b6100f1610136366004612a70565b610904565b61014e6101493660046129b5565b610dee565b6040516100c29190612b6f565b61011b6101693660046129b5565b61108b565b61011b61017c366004612b89565b61126d565b6100b661018f366004612869565b611643565b6100f16101a2366004612ba2565b6116a2565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528283098182830101600080516020612e0d8339815191528283840108600080516020612e0d8339815191528682600080516020612e0d83398151915203860109935050600080516020612e0d8339815191528483600080516020612e0d833981519152038301099150600080516020612e0d8339815191527f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e584089450600080516020612e0d8339815191527e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2830893506040870151925060608701519150600080516020612e0d8339815191528083600080516020612e0d833981519152038508600080516020612e0d833981519152848608099050600080516020612e0d833981519152828460011b0994149290931491909116949350505050565b8051600090600080516020612e0d83398151915211158061034157506020820151600080516020612e0d83398151915211155b1561034e57506000919050565b60405163e242cce960e01b8152309063e242cce990610371908590600401612a3f565b602060405180830381865afa15801561038e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b29190612c05565b92915050565b60008083806103e25760405162461bcd60e51b81526004016103d990612c27565b60405180910390fd5b60006103ef826001612c7e565b6103fa906006612c91565b905060008167ffffffffffffffff8111156104175761041761277b565b604051908082528060200260200182016040528015610440578160200160208202803683370190505b50905088600060200201358160008151811061045e5761045e612bef565b602090810291909101015288600160200201358160018151811061048457610484612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2816002815181106104c4576104c4612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed8160038151811061050457610504612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec8160048151811061054457610544612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8160058151811061058457610584612bef565b60200260200101818152505060005b838110156107a3578635826105a9836006612c91565b6105b4906006612c7e565b815181106105c4576105c4612bef565b60209081029190910101528660016020020135826105e3836006612c91565b6105ee906007612c7e565b815181106105fe576105fe612bef565b60200260200101818152505088888281811061061c5761061c612bef565b90506080020160016004811061063457610634612bef565b602002013582610645836006612c91565b610650906008612c7e565b8151811061066057610660612bef565b60200260200101818152505088888281811061067e5761067e612bef565b90506080020160006004811061069657610696612bef565b6020020135826106a7836006612c91565b6106b2906009612c7e565b815181106106c2576106c2612bef565b6020026020010181815250508888828181106106e0576106e0612bef565b9050608002016003600481106106f8576106f8612bef565b602002013582610709836006612c91565b61071490600a612c7e565b8151811061072457610724612bef565b60200260200101818152505088888281811061074257610742612bef565b90506080020160026004811061075a5761075a612bef565b60200201358261076b836006612c91565b61077690600b612c7e565b8151811061078657610786612bef565b60209081029190910101528061079b81612ca8565b915050610593565b506107ac612721565b602081602085026020850160085afa9450846107d25760008095509550505050506107df565b5115159450600193505050505b94509492505050565b6107f061273f565b6040516391ec2d2b60e01b815260009030906391ec2d2b906108189087908790600401612cc1565b600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190612ce2565b9050600080600080601885016001600160c01b0381511693506030860190506001600160c01b038151169450600080516020612e0d83398151915285600080516020612e0d833981519152600160c01b870908604887015160608801516001600160c01b0390811697501694509250600080516020612e0d83398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b60008084806109255760405162461bcd60e51b81526004016103d990612c27565b8084146109925760405162461bcd60e51b815260206004820152603560248201527f424c533a206e756d626572206f66207075626c6963206b65797320616e64206d604482015274195cdcd859d95cc81b5d5cdd08189948195c5d585b605a1b60648201526084016103d9565b600061099f826001612c7e565b6109aa906006612c91565b905060008167ffffffffffffffff8111156109c7576109c761277b565b6040519080825280602002602001820160405280156109f0578160200160208202803683370190505b509050896000602002013581600081518110610a0e57610a0e612bef565b6020908102919091010152896001602002013581600181518110610a3457610a34612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281600281518110610a7457610a74612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81600381518110610ab457610ab4612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81600481518110610af457610af4612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81600581518110610b3457610b34612bef565b60200260200101818152505060005b83811015610da857878782818110610b5d57610b5d612bef565b905060400201600060028110610b7557610b75612bef565b602002013582610b86836006612c91565b610b91906006612c7e565b81518110610ba157610ba1612bef565b602002602001018181525050878782818110610bbf57610bbf612bef565b905060400201600160028110610bd757610bd7612bef565b602002013582610be8836006612c91565b610bf3906007612c7e565b81518110610c0357610c03612bef565b602002602001018181525050898982818110610c2157610c21612bef565b905060800201600160048110610c3957610c39612bef565b602002013582610c4a836006612c91565b610c55906008612c7e565b81518110610c6557610c65612bef565b602002602001018181525050898982818110610c8357610c83612bef565b905060800201600060048110610c9b57610c9b612bef565b602002013582610cac836006612c91565b610cb7906009612c7e565b81518110610cc757610cc7612bef565b602002602001018181525050898982818110610ce557610ce5612bef565b905060800201600360048110610cfd57610cfd612bef565b602002013582610d0e836006612c91565b610d1990600a612c7e565b81518110610d2957610d29612bef565b602002602001018181525050898982818110610d4757610d47612bef565b905060800201600260048110610d5f57610d5f612bef565b602002013582610d70836006612c91565b610d7b90600b612c7e565b81518110610d8b57610d8b612bef565b602090810291909101015280610da081612ca8565b915050610b43565b50610db1612721565b602081602085026020850160085afa945084610dd7576000809550955050505050610de4565b5115159450600193505050505b9550959350505050565b80516060906000610e00826020612c7e565b610e0b906040612c7e565b610e16906004612c7e565b67ffffffffffffffff811115610e2e57610e2e61277b565b6040519080825280601f01601f191660200182016040528015610e58576020820181803683370190505b5060408051606080825260808201909252919250600091906020820181803683370190505090506060820160005b84811015610ea05760208188018101518383015201610e86565b5083016000815360010160608153600101600081536001810187905260210160208153506000600283604051610ed69190612d59565b602060405180830381855afa158015610ef3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f169190612d75565b9050600060429450848452816020850152600160408501536041840188905260206061850153600284604051610f4c9190612d59565b602060405180830381855afa158015610f69573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8c9190612d75565b905080602084015280821880602086015250600260408501536041840188905260206061850153600284604051610fc39190612d59565b602060405180830381855afa158015610fe0573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110039190612d75565b90508060408401528082188060208601525060036040850153604184018890526020606185015360028460405161103a9190612d59565b602060405180830381855afa158015611057573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061107a9190612d75565b606084015250909695505050505050565b61109361273f565b604051638669026f60e01b81526000903090638669026f906110bb9087908790600401612cc1565b6040805180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190612d8e565b805160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa15801561113f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111639190612d8e565b602083015160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa1580156111aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190612d8e565b90506111d861275d565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa9050808061121357fe5b50806112615760405162461bcd60e51b815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c656400000000000000000060448201526064016103d9565b50919695505050505050565b61127561273f565b600080516020612e0d83398151915282106112de5760405162461bcd60e51b815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d604482015262195b9d60ea1b60648201526084016103d9565b8160006112ea82611871565b9150506000600080516020612e0d8339815191528061130b5761130b612de3565b8384099050600080516020612e0d8339815191526004820890506000600080516020612e0d83398151915277b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd850990506000600080516020612e0d83398151915283830990506113728161189a565b9050600080516020612e0d8339815191528283099150600080516020612e0d8339815191528183099150600080516020612e0d8339815191528286099150600080516020612e0d8339815191526113d783600080516020612e0d833981519152612df9565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe089450600080516020612e0d8339815191528586099150600080516020612e0d8339815191528583099150600080516020612e0d833981519152600383089150600061143b83611871565b9093509050801561148357846114665761146383600080516020612e0d833981519152612df9565b92505b505060408051808201909152938452602084015250909392505050565b600080516020612e0d833981519152600187086114ae90600080516020612e0d833981519152612df9565b9550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506114f683611871565b9093509050801561151e57846114665761146383600080516020612e0d833981519152612df9565b600080516020612e0d8339815191528485099550600080516020612e0d8339815191528687099550600080516020612e0d8339815191528287099550600080516020612e0d8339815191528287099550600080516020612e0d833981519152600187089550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506115c983611871565b9093509050806116265760405162461bcd60e51b815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201526137b760f11b60648201526084016103d9565b846114665761146383600080516020612e0d833981519152612df9565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528382099050600080516020612e0d833981519152600382089050600080516020612e0d83398151915282830914949350505050565b6000806000604051806101800160405280876000600281106116c6576116c6612bef565b60200201358152602001876001600281106116e3576116e3612bef565b602002013581526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81526020018560006002811061179857611798612bef565b60200201358152602001856001600281106117b5576117b5612bef565b60200201358152602001866001600481106117d2576117d2612bef565b60200201358152602001866000600481106117ef576117ef612bef565b602002013581526020018660036004811061180c5761180c612bef565b602002013581526020018660026004811061182957611829612bef565b60200201359052905061183a612721565b60006020826101808560085afa90508061185d5760008094509450505050611869565b50511515925060019150505b935093915050565b60008061187d836118a5565b915082600080516020612e0d833981519152838409149050915091565b60006103b282611fda565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156127b4576127b461277b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156127e3576127e361277b565b604052919050565b6000608082840312156127fd57600080fd5b82601f83011261280c57600080fd5b6040516080810181811067ffffffffffffffff8211171561282f5761282f61277b565b60405280608084018581111561284457600080fd5b845b8181101561285e578035835260209283019201612846565b509195945050505050565b60006040828403121561287b57600080fd5b82601f83011261288a57600080fd5b612892612791565b8060408401858111156128a457600080fd5b845b818110156128be5780358452602093840193016128a6565b509095945050505050565b80604081018310156103b257600080fd5b60008083601f8401126128ec57600080fd5b50813567ffffffffffffffff81111561290457600080fd5b6020830191508360208260071b850101111561291f57600080fd5b9250929050565b60008060008060a0858703121561293c57600080fd5b61294686866128c9565b9350604085013567ffffffffffffffff81111561296257600080fd5b61296e878288016128da565b9094509250612982905086606087016128c9565b905092959194509250565b600067ffffffffffffffff8211156129a7576129a761277b565b50601f01601f191660200190565b600080604083850312156129c857600080fd5b82359150602083013567ffffffffffffffff8111156129e657600080fd5b8301601f810185136129f757600080fd5b8035612a0a612a058261298d565b6127ba565b818152866020838501011115612a1f57600080fd5b816020840160208301376000602083830101528093505050509250929050565b60408101818360005b6002811015612a67578151835260209283019290910190600101612a48565b50505092915050565b600080600080600060808688031215612a8857600080fd5b612a9287876128c9565b9450604086013567ffffffffffffffff80821115612aaf57600080fd5b612abb89838a016128da565b90965094506060880135915080821115612ad457600080fd5b818801915088601f830112612ae857600080fd5b813581811115612af757600080fd5b8960208260061b8501011115612b0c57600080fd5b9699959850939650602001949392505050565b60005b83811015612b3a578181015183820152602001612b22565b50506000910152565b60008151808452612b5b816020860160208601612b1f565b601f01601f19169290920160200192915050565b602081526000612b826020830184612b43565b9392505050565b600060208284031215612b9b57600080fd5b5035919050565b60008060006101008486031215612bb857600080fd5b612bc285856128c9565b925060c0840185811115612bd557600080fd5b604085019250612be586826128c9565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c1757600080fd5b81518015158114612b8257600080fd5b60208082526021908201527f424c533a206e756d626572206f66207075626c6963206b6579206973207a65726040820152606f60f81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808201808211156103b2576103b2612c68565b80820281158282048414176103b2576103b2612c68565b600060018201612cba57612cba612c68565b5060010190565b828152604060208201526000612cda6040830184612b43565b949350505050565b600060208284031215612cf457600080fd5b815167ffffffffffffffff811115612d0b57600080fd5b8201601f81018413612d1c57600080fd5b8051612d2a612a058261298d565b818152856020838501011115612d3f57600080fd5b612d50826020830160208601612b1f565b95945050505050565b60008251612d6b818460208701612b1f565b9190910192915050565b600060208284031215612d8757600080fd5b5051919050565b600060408284031215612da057600080fd5b82601f830112612daf57600080fd5b612db7612791565b806040840185811115612dc957600080fd5b845b818110156128be578051845260209384019301612dcb565b634e487b7160e01b600052601260045260246000fd5b818103818111156103b2576103b2612c6856fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220046fd04cf652b14b5d4629e14b0659a560d128e873764c278e0250d47ac47cde64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var BN256G2Artifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"BN256G2\",\n \"sourceName\": \"contracts/common/BN256G2.sol\",\n \"abi\": [\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_X_IM\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_X_RE\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_Y_IM\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_Y_RE\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2xx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2xy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2yx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2yy\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ecTwistAdd\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"s\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yy\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ecTwistMul\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getFieldModulus\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610e0d806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639b0c399a1161005b5780639b0c399a146100f7578063ad50f9c11461011e578063cbe96a5014610145578063defbcdee1461017857600080fd5b80635120675214610082578063779d890d146100bc578063783bde80146100d0575b600080fd5b6100a97f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81565b6040519081526020015b60405180910390f35b600080516020610db88339815191526100a9565b6100a97f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281565b6100a97f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81565b6100a97f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81565b610158610153366004610c9c565b61018b565b6040805194855260208501939093529183015260608201526080016100b3565b610158610186366004610cf1565b61032a565b60008080808b15801561019c57508a155b80156101a6575089155b80156101b0575088155b1561021a57871580156101c1575086155b80156101cb575085155b80156101d5575084155b61020a576101e5888888886103c1565b61020a5760405162461bcd60e51b815260040161020190610d2c565b60405180910390fd5b508692508591508490508361031b565b87158015610226575086155b8015610230575085155b801561023a575084155b156102775761024b8c8c8c8c6103c1565b6102675760405162461bcd60e51b815260040161020190610d2c565b508a92508991508890508761031b565b6102838c8c8c8c6103c1565b61029f5760405162461bcd60e51b815260040161020190610d2c565b6102ab888888886103c1565b6102c75760405162461bcd60e51b815260040161020190610d2c565b60006102e18d8d8d8d600160008f8f8f8f60016000610476565b90506103118160005b602090810291909101519083015160408401516060850151608086015160a0870151610701565b9450945094509450505b98509850985098945050505050565b600080808060018815801561033d575087155b8015610347575086155b8015610351575085155b15610365575060019750879550600061038d565b610371898989896103c1565b61038d5760405162461bcd60e51b815260040161020190610d2c565b600061039f8b8b8b8b8b87600061076c565b90506103ac8160006102ea565b929e919d509b50909950975050505050505050565b60008060008060006103d5878789896107ef565b90945092506103e6898981816107ef565b90925090506103f782828b8b6107ef565b909250905061040884848484610860565b909450925061045884847f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e57e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2610860565b909450925083158015610469575082155b9998505050505050505050565b61047e610c60565b8815801561048a575087155b156104cc578686868686868660005b60a089019290925260808801929092526060870192909252604086019290925260208581019390935290910201526106f1565b821580156104d8575081155b156104eb578c8c8c8c8c8c866000610499565b6104f785858b8b6107ef565b90955093506105088b8b85856107ef565b6060830152604082015261051e87878b8b6107ef565b909750955061052f8d8d85856107ef565b60a0830152608082018190528714801561054c575060a081015186145b15610591576040810151851480156105675750606081015184145b156105825761057a8d8d8d8d8d8d6108a2565b866000610499565b60016000818180808681610499565b61059d898985856107ef565b90935091506105bd858583600260200201518460035b6020020151610860565b909d509b506105d887878360045b60200201518460056105b3565b909b5099506105e98b8b81816107ef565b909950975061060a89898360045b60200201518460055b60200201516107ef565b909550935061061b89898d8d6107ef565b909950975061062c898985856107ef565b60a083015260808201526106428d8d81816107ef565b9097509550610653878785856107ef565b909750955061066487878b8b610860565b909750955061067585856002610aea565b909350915061068687878585610860565b90975095506106978b8b89896107ef565b602083015281526106aa85858989610860565b909b5099506106bb8d8d8d8d6107ef565b909b5099506106d589898360026020020151846003610600565b909d509b506106e68b8b8f8f610860565b606083015260408201525b9c9b505050505050505050505050565b600080600080600080610712610c7e565b61071c8989610b1d565b909350915061072d8d8d85856107ef565b602083015281526107408b8b85856107ef565b60608301819052604083018290528251602090930151929f929e50909c509a5098505050505050505050565b610774610c60565b87156107e45760018816156107b5578051602082015160408301516060840151608085015160a08601516107b29594939291908d8d8d8d8d8d610476565b90505b6107c38787878787876108a2565b949b509299509097509550935091506107dd600289610d6e565b9750610774565b979650505050505050565b60008061082d600080516020610db8833981519152858809600080516020610db8833981519152858809600080516020610db8833981519152610ba8565b600080516020610db883398151915280868809600080516020610db8833981519152868a09089150915094509492505050565b60008061087c8685600080516020610db8833981519152610ba8565b6108958685600080516020610db8833981519152610ba8565b9150915094509492505050565b6000806000806000806108b3610c60565b6108bf8d8d6003610aea565b602083018190528183526108d591908f8f6107ef565b602083015281526108e88b8b8b8b6107ef565b90995097506108f98d8d8d8d6107ef565b606083015260408201819052610919908260035b60200201518b8b6107ef565b60608301526040820152805161093c908260015b60200201518351846001610600565b6040830151919e509c5061095a908260035b60200201516008610aea565b60a083015260808201526109718d8d8360046105cb565b909d509b50610982898981816107ef565b60a08301526080820152604081015160608201516109a291906004610aea565b60608301819052604083018290526109bc91908f8f610860565b6060830152604082018190526109d49082600361092d565b606083015260408201526109ea8b8b6008610aea565b60208301819052818352610a0091908d8d6107ef565b60208301819052818352610a1791908360046105f7565b602083015280825260408201516060830151610a35928460016105b3565b60608301526040820152610a4b8d8d6002610aea565b6020830152808252610a5f9082600161090d565b60208301528152610a7389898360046105f7565b60a083015260808201819052610a8b9082600561094e565b826004602002018360056020020191909152528060006020020151816001602002015182600260200201518360036020020151846004602002015185600560200201519650965096509650965096505096509650965096509650969050565b600080600080516020610db8833981519152838609600080516020610db883398151915284860991509150935093915050565b60008080610b5e600080516020610db883398151915280878809600080516020610db883398151915287880908600080516020610db8833981519152610bcc565b9050600080516020610db8833981519152818609600080516020610db8833981519152828609610b9c90600080516020610db8833981519152610d90565b92509250509250929050565b60008180610bb857610bb8610d58565b610bc28484610d90565b8508949350505050565b60008060405160208152602080820152602060408201528460608201526002840360808201528360a082015260208160c08360056107d05a03fa90519250905080610c595760405162461bcd60e51b815260206004820152601a60248201527f6572726f722077697468206d6f64756c617220696e76657273650000000000006044820152606401610201565b5092915050565b6040518060c001604052806006906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b600080600080600080600080610100898b031215610cb957600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b600080600080600060a08688031215610d0957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825260129082015271706f696e74206e6f7420696e20637572766560701b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082610d8b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610db157634e487b7160e01b600052601160045260246000fd5b9291505056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212201adcf05e36cc0972d841126d8c6be8c04faf8e0e619d376b86d705cbb30a1c2864736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80639b0c399a1161005b5780639b0c399a146100f7578063ad50f9c11461011e578063cbe96a5014610145578063defbcdee1461017857600080fd5b80635120675214610082578063779d890d146100bc578063783bde80146100d0575b600080fd5b6100a97f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81565b6040519081526020015b60405180910390f35b600080516020610db88339815191526100a9565b6100a97f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281565b6100a97f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81565b6100a97f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81565b610158610153366004610c9c565b61018b565b6040805194855260208501939093529183015260608201526080016100b3565b610158610186366004610cf1565b61032a565b60008080808b15801561019c57508a155b80156101a6575089155b80156101b0575088155b1561021a57871580156101c1575086155b80156101cb575085155b80156101d5575084155b61020a576101e5888888886103c1565b61020a5760405162461bcd60e51b815260040161020190610d2c565b60405180910390fd5b508692508591508490508361031b565b87158015610226575086155b8015610230575085155b801561023a575084155b156102775761024b8c8c8c8c6103c1565b6102675760405162461bcd60e51b815260040161020190610d2c565b508a92508991508890508761031b565b6102838c8c8c8c6103c1565b61029f5760405162461bcd60e51b815260040161020190610d2c565b6102ab888888886103c1565b6102c75760405162461bcd60e51b815260040161020190610d2c565b60006102e18d8d8d8d600160008f8f8f8f60016000610476565b90506103118160005b602090810291909101519083015160408401516060850151608086015160a0870151610701565b9450945094509450505b98509850985098945050505050565b600080808060018815801561033d575087155b8015610347575086155b8015610351575085155b15610365575060019750879550600061038d565b610371898989896103c1565b61038d5760405162461bcd60e51b815260040161020190610d2c565b600061039f8b8b8b8b8b87600061076c565b90506103ac8160006102ea565b929e919d509b50909950975050505050505050565b60008060008060006103d5878789896107ef565b90945092506103e6898981816107ef565b90925090506103f782828b8b6107ef565b909250905061040884848484610860565b909450925061045884847f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e57e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2610860565b909450925083158015610469575082155b9998505050505050505050565b61047e610c60565b8815801561048a575087155b156104cc578686868686868660005b60a089019290925260808801929092526060870192909252604086019290925260208581019390935290910201526106f1565b821580156104d8575081155b156104eb578c8c8c8c8c8c866000610499565b6104f785858b8b6107ef565b90955093506105088b8b85856107ef565b6060830152604082015261051e87878b8b6107ef565b909750955061052f8d8d85856107ef565b60a0830152608082018190528714801561054c575060a081015186145b15610591576040810151851480156105675750606081015184145b156105825761057a8d8d8d8d8d8d6108a2565b866000610499565b60016000818180808681610499565b61059d898985856107ef565b90935091506105bd858583600260200201518460035b6020020151610860565b909d509b506105d887878360045b60200201518460056105b3565b909b5099506105e98b8b81816107ef565b909950975061060a89898360045b60200201518460055b60200201516107ef565b909550935061061b89898d8d6107ef565b909950975061062c898985856107ef565b60a083015260808201526106428d8d81816107ef565b9097509550610653878785856107ef565b909750955061066487878b8b610860565b909750955061067585856002610aea565b909350915061068687878585610860565b90975095506106978b8b89896107ef565b602083015281526106aa85858989610860565b909b5099506106bb8d8d8d8d6107ef565b909b5099506106d589898360026020020151846003610600565b909d509b506106e68b8b8f8f610860565b606083015260408201525b9c9b505050505050505050505050565b600080600080600080610712610c7e565b61071c8989610b1d565b909350915061072d8d8d85856107ef565b602083015281526107408b8b85856107ef565b60608301819052604083018290528251602090930151929f929e50909c509a5098505050505050505050565b610774610c60565b87156107e45760018816156107b5578051602082015160408301516060840151608085015160a08601516107b29594939291908d8d8d8d8d8d610476565b90505b6107c38787878787876108a2565b949b509299509097509550935091506107dd600289610d6e565b9750610774565b979650505050505050565b60008061082d600080516020610db8833981519152858809600080516020610db8833981519152858809600080516020610db8833981519152610ba8565b600080516020610db883398151915280868809600080516020610db8833981519152868a09089150915094509492505050565b60008061087c8685600080516020610db8833981519152610ba8565b6108958685600080516020610db8833981519152610ba8565b9150915094509492505050565b6000806000806000806108b3610c60565b6108bf8d8d6003610aea565b602083018190528183526108d591908f8f6107ef565b602083015281526108e88b8b8b8b6107ef565b90995097506108f98d8d8d8d6107ef565b606083015260408201819052610919908260035b60200201518b8b6107ef565b60608301526040820152805161093c908260015b60200201518351846001610600565b6040830151919e509c5061095a908260035b60200201516008610aea565b60a083015260808201526109718d8d8360046105cb565b909d509b50610982898981816107ef565b60a08301526080820152604081015160608201516109a291906004610aea565b60608301819052604083018290526109bc91908f8f610860565b6060830152604082018190526109d49082600361092d565b606083015260408201526109ea8b8b6008610aea565b60208301819052818352610a0091908d8d6107ef565b60208301819052818352610a1791908360046105f7565b602083015280825260408201516060830151610a35928460016105b3565b60608301526040820152610a4b8d8d6002610aea565b6020830152808252610a5f9082600161090d565b60208301528152610a7389898360046105f7565b60a083015260808201819052610a8b9082600561094e565b826004602002018360056020020191909152528060006020020151816001602002015182600260200201518360036020020151846004602002015185600560200201519650965096509650965096505096509650965096509650969050565b600080600080516020610db8833981519152838609600080516020610db883398151915284860991509150935093915050565b60008080610b5e600080516020610db883398151915280878809600080516020610db883398151915287880908600080516020610db8833981519152610bcc565b9050600080516020610db8833981519152818609600080516020610db8833981519152828609610b9c90600080516020610db8833981519152610d90565b92509250509250929050565b60008180610bb857610bb8610d58565b610bc28484610d90565b8508949350505050565b60008060405160208152602080820152602060408201528460608201526002840360808201528360a082015260208160c08360056107d05a03fa90519250905080610c595760405162461bcd60e51b815260206004820152601a60248201527f6572726f722077697468206d6f64756c617220696e76657273650000000000006044820152606401610201565b5092915050565b6040518060c001604052806006906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b600080600080600080600080610100898b031215610cb957600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b600080600080600060a08688031215610d0957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825260129082015271706f696e74206e6f7420696e20637572766560701b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082610d8b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610db157634e487b7160e01b600052601160045260246000fd5b9291505056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212201adcf05e36cc0972d841126d8c6be8c04faf8e0e619d376b86d705cbb30a1c2864736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var MerkleArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Merkle\",\n \"sourceName\": \"contracts/common/Merkle.sol\",\n \"abi\": [],\n \"bytecode\": \"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ad9437774f8ba57da87d896ee6746b63a34f690f0d580c71b53b1867c28e290e64736f6c63430008110033\",\n \"deployedBytecode\": \"0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ad9437774f8ba57da87d896ee6746b63a34f690f0d580c71b53b1867c28e290e64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var StateReceiverArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"StateReceiver\",\n \"sourceName\": \"contracts/child/StateReceiver.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"only\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NewCommitment\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"counter\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bool\",\n \"name\": \"status\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"message\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"StateSyncResult\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[][]\",\n \"name\": \"proofs\",\n \"type\": \"bytes32[][]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSync[]\",\n \"name\": \"objs\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"batchExecute\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSyncCommitment\",\n \"name\": \"commitment\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"bitmap\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"commit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"commitmentCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"commitmentIds\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"commitments\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSync\",\n \"name\": \"obj\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"execute\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getCommitmentByStateSyncId\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSyncCommitment\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getRootByStateSyncId\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"lastCommittedId\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"processedStateSyncs\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b5061138f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80639017c12711610097578063c59a18f711610066578063c59a18f71461022d578063c6df461714610240578063e0563ab114610253578063eb70ef441461025c57600080fd5b80639017c127146101fe578063947287cf1461021157806397e5230d1461021a578063ad240c2a1461022457600080fd5b806349ce8997116100d357806349ce89971461015e57806350d5b95b146101a857806351351d53146101bd578063544c5e0f146101cb57600080fd5b8063196f1b2d1461010557806323e281cf1461012b578063284017f5146101345780633b878c2214610155575b600080fd5b610118610113366004610d0d565b610291565b6040519081526020015b60405180910390f35b61011860325481565b61013d61202081565b6040516001600160a01b039091168152602001610122565b61013d61101081565b61018d61016c366004610d0d565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610122565b6101bb6101b6366004610d72565b610310565b005b61013d6002600160a01b0381565b6101ee6101d9366004610d0d565b60346020526000908152604090205460ff1681565b6040519015158152602001610122565b6101bb61020c366004610de2565b6103ba565b61011861520881565b610118620249f081565b61011860335481565b61011861023b366004610d0d565b61053e565b6101bb61024e366004610e90565b61055f565b61013d61203081565b61026f61026a366004610d0d565b610743565b6040805182518152602080840151908201529181015190820152606001610122565b6000806035816102a2603686610806565b815260208101919091526040016000206002015490508061030a5760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061031c8235610743565b805190915061036f90610330908435610f2f565b82604001518686866040516020016103489190610f87565b604051602081830303815290604052805190602001206108b390949392919063ffffffff16565b6103ab5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610301565b6103b4826109cc565b50505050565b8281811461041d5760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610301565b60005b8181101561053657600061045785858481811061043f5761043f611024565b9050602002810190610451919061103a565b35610743565b905060006104ef826000015187878681811061047557610475611024565b9050602002810190610487919061103a565b610492919035610f2f565b83604001518a8a878181106104a9576104a9611024565b90506020028101906104bb919061105a565b8a8a898181106104cd576104cd611024565b90506020028101906104df919061103a565b6040516020016103489190610f87565b905080610500575050600101610420565b61052c86868581811061051557610515611024565b9050602002810190610527919061103a565b6109cc565b5050600101610420565b505050505050565b6036818154811061054e57600080fd5b600091825260209091200154905081565b336002600160a01b03146105a35760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610301565b6033546105b19060016110a4565b8535146105f35760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610301565b8435602086013510156106395760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610301565b6040805186356020808301919091528701358183015290860135606082015261067e906080016040516020818303038152906040528051906020012085858585610be7565b60328054869160359160009182610694836110b7565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b604080516060810182526000808252602082018190529181018290529061076b603684610806565b60365490915081036107cb5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610301565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b815460009081036108195750600061030a565b82546000905b808210156108665760006108338383610ceb565b6000878152602090209091508590820154111561085257809150610860565b61085d8160016110a4565b92505b5061081f565b60008211801561089257508361088f86610881600186610f2f565b600091825260209091200190565b54145b156108ab576108a2600183610f2f565b9250505061030a565b509392505050565b6000816108c18160026111b4565b86106109045760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610301565b8660005b828110156109be57600086868381811061092457610924611024565b90506020020135905060028961093a91906111d6565b60000361097257604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061099f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b6109aa60028a6111ea565b985050806109b7906110b7565b9050610908565b509094149695505050505050565b803560009081526034602052604090205460ff1615610a3c5760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610301565b610a4c60608201604083016111fe565b6001600160a01b03163b600003610aa0576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610ace90606085019085016111fe565b6001600160a01b03168335610ae960408601602087016111fe565b610af66060870187611219565b604051602401610b099493929190611260565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610b3e91906112b9565b6000604051808303816000865af19150503d8060008114610b7b576040519150601f19603f3d011682016040523d82523d6000602084013e610b80565b606091505b509150915081610ba35782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610bda91906112cb565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610c139594939291906112fe565b60408051601f1981840301815290829052610c2d916112b9565b6000604051808303818686fa925050503d8060008114610c69576040519150601f19603f3d011682016040523d82523d6000602084013e610c6e565b606091505b5091509150600081806020019051810190610c899190611337565b9050828015610c955750805b610ce15760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610301565b5050505050505050565b6000610cfa60028484186111ea565b610d06908484166110a4565b9392505050565b600060208284031215610d1f57600080fd5b5035919050565b60008083601f840112610d3857600080fd5b50813567ffffffffffffffff811115610d5057600080fd5b6020830191508360208260051b8501011115610d6b57600080fd5b9250929050565b600080600060408486031215610d8757600080fd5b833567ffffffffffffffff80821115610d9f57600080fd5b610dab87838801610d26565b90955093506020860135915080821115610dc457600080fd5b50840160808187031215610dd757600080fd5b809150509250925092565b60008060008060408587031215610df857600080fd5b843567ffffffffffffffff80821115610e1057600080fd5b610e1c88838901610d26565b90965094506020870135915080821115610e3557600080fd5b50610e4287828801610d26565b95989497509550505050565b60008083601f840112610e6057600080fd5b50813567ffffffffffffffff811115610e7857600080fd5b602083019150836020828501011115610d6b57600080fd5b600080600080600085870360a0811215610ea957600080fd5b6060811215610eb757600080fd5b50859450606086013567ffffffffffffffff80821115610ed657600080fd5b610ee289838a01610e4e565b90965094506080880135915080821115610efb57600080fd5b50610f0888828901610e4e565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561030a5761030a610f19565b80356001600160a01b0381168114610f5957600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152813560208201526000610fa060208401610f42565b60018060a01b03808216604085015280610fbc60408701610f42565b16606085015250506060830135601e19843603018112610fdb57600080fd5b830160208101903567ffffffffffffffff811115610ff857600080fd5b80360382131561100757600080fd5b60808085015261101b60a085018284610f5e565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261105057600080fd5b9190910192915050565b6000808335601e1984360301811261107157600080fd5b83018035915067ffffffffffffffff82111561108c57600080fd5b6020019150600581901b3603821315610d6b57600080fd5b8082018082111561030a5761030a610f19565b6000600182016110c9576110c9610f19565b5060010190565b600181815b8085111561110b5781600019048211156110f1576110f1610f19565b808516156110fe57918102915b93841c93908002906110d5565b509250929050565b6000826111225750600161030a565b8161112f5750600061030a565b8160018114611145576002811461114f5761116b565b600191505061030a565b60ff84111561116057611160610f19565b50506001821b61030a565b5060208310610133831016604e8410600b841016171561118e575081810a61030a565b61119883836110d0565b80600019048211156111ac576111ac610f19565b029392505050565b6000610d068383611113565b634e487b7160e01b600052601260045260246000fd5b6000826111e5576111e56111c0565b500690565b6000826111f9576111f96111c0565b500490565b60006020828403121561121057600080fd5b610d0682610f42565b6000808335601e1984360301811261123057600080fd5b83018035915067ffffffffffffffff82111561124b57600080fd5b602001915036819003821315610d6b57600080fd5b8481526001600160a01b038416602082015260606040820181905260009061128b9083018486610f5e565b9695505050505050565b60005b838110156112b0578181015183820152602001611298565b50506000910152565b60008251611050818460208701611295565b60208152600082518060208401526112ea816040850160208701611295565b601f01601f19169190910160400192915050565b858152606060208201526000611318606083018688610f5e565b828103604084015261132b818587610f5e565b98975050505050505050565b60006020828403121561134957600080fd5b81518015158114610d0657600080fdfea2646970667358221220e4320091d29a9d374eeaa9fa7392305588d9cc74b80955bf333949db7c99053a64736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101005760003560e01c80639017c12711610097578063c59a18f711610066578063c59a18f71461022d578063c6df461714610240578063e0563ab114610253578063eb70ef441461025c57600080fd5b80639017c127146101fe578063947287cf1461021157806397e5230d1461021a578063ad240c2a1461022457600080fd5b806349ce8997116100d357806349ce89971461015e57806350d5b95b146101a857806351351d53146101bd578063544c5e0f146101cb57600080fd5b8063196f1b2d1461010557806323e281cf1461012b578063284017f5146101345780633b878c2214610155575b600080fd5b610118610113366004610d0d565b610291565b6040519081526020015b60405180910390f35b61011860325481565b61013d61202081565b6040516001600160a01b039091168152602001610122565b61013d61101081565b61018d61016c366004610d0d565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610122565b6101bb6101b6366004610d72565b610310565b005b61013d6002600160a01b0381565b6101ee6101d9366004610d0d565b60346020526000908152604090205460ff1681565b6040519015158152602001610122565b6101bb61020c366004610de2565b6103ba565b61011861520881565b610118620249f081565b61011860335481565b61011861023b366004610d0d565b61053e565b6101bb61024e366004610e90565b61055f565b61013d61203081565b61026f61026a366004610d0d565b610743565b6040805182518152602080840151908201529181015190820152606001610122565b6000806035816102a2603686610806565b815260208101919091526040016000206002015490508061030a5760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061031c8235610743565b805190915061036f90610330908435610f2f565b82604001518686866040516020016103489190610f87565b604051602081830303815290604052805190602001206108b390949392919063ffffffff16565b6103ab5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610301565b6103b4826109cc565b50505050565b8281811461041d5760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610301565b60005b8181101561053657600061045785858481811061043f5761043f611024565b9050602002810190610451919061103a565b35610743565b905060006104ef826000015187878681811061047557610475611024565b9050602002810190610487919061103a565b610492919035610f2f565b83604001518a8a878181106104a9576104a9611024565b90506020028101906104bb919061105a565b8a8a898181106104cd576104cd611024565b90506020028101906104df919061103a565b6040516020016103489190610f87565b905080610500575050600101610420565b61052c86868581811061051557610515611024565b9050602002810190610527919061103a565b6109cc565b5050600101610420565b505050505050565b6036818154811061054e57600080fd5b600091825260209091200154905081565b336002600160a01b03146105a35760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610301565b6033546105b19060016110a4565b8535146105f35760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610301565b8435602086013510156106395760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610301565b6040805186356020808301919091528701358183015290860135606082015261067e906080016040516020818303038152906040528051906020012085858585610be7565b60328054869160359160009182610694836110b7565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b604080516060810182526000808252602082018190529181018290529061076b603684610806565b60365490915081036107cb5760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610301565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b815460009081036108195750600061030a565b82546000905b808210156108665760006108338383610ceb565b6000878152602090209091508590820154111561085257809150610860565b61085d8160016110a4565b92505b5061081f565b60008211801561089257508361088f86610881600186610f2f565b600091825260209091200190565b54145b156108ab576108a2600183610f2f565b9250505061030a565b509392505050565b6000816108c18160026111b4565b86106109045760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610301565b8660005b828110156109be57600086868381811061092457610924611024565b90506020020135905060028961093a91906111d6565b60000361097257604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061099f565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b6109aa60028a6111ea565b985050806109b7906110b7565b9050610908565b509094149695505050505050565b803560009081526034602052604090205460ff1615610a3c5760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610301565b610a4c60608201604083016111fe565b6001600160a01b03163b600003610aa0576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610ace90606085019085016111fe565b6001600160a01b03168335610ae960408601602087016111fe565b610af66060870187611219565b604051602401610b099493929190611260565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610b3e91906112b9565b6000604051808303816000865af19150503d8060008114610b7b576040519150601f19603f3d011682016040523d82523d6000602084013e610b80565b606091505b509150915081610ba35782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610bda91906112cb565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610c139594939291906112fe565b60408051601f1981840301815290829052610c2d916112b9565b6000604051808303818686fa925050503d8060008114610c69576040519150601f19603f3d011682016040523d82523d6000602084013e610c6e565b606091505b5091509150600081806020019051810190610c899190611337565b9050828015610c955750805b610ce15760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610301565b5050505050505050565b6000610cfa60028484186111ea565b610d06908484166110a4565b9392505050565b600060208284031215610d1f57600080fd5b5035919050565b60008083601f840112610d3857600080fd5b50813567ffffffffffffffff811115610d5057600080fd5b6020830191508360208260051b8501011115610d6b57600080fd5b9250929050565b600080600060408486031215610d8757600080fd5b833567ffffffffffffffff80821115610d9f57600080fd5b610dab87838801610d26565b90955093506020860135915080821115610dc457600080fd5b50840160808187031215610dd757600080fd5b809150509250925092565b60008060008060408587031215610df857600080fd5b843567ffffffffffffffff80821115610e1057600080fd5b610e1c88838901610d26565b90965094506020870135915080821115610e3557600080fd5b50610e4287828801610d26565b95989497509550505050565b60008083601f840112610e6057600080fd5b50813567ffffffffffffffff811115610e7857600080fd5b602083019150836020828501011115610d6b57600080fd5b600080600080600085870360a0811215610ea957600080fd5b6060811215610eb757600080fd5b50859450606086013567ffffffffffffffff80821115610ed657600080fd5b610ee289838a01610e4e565b90965094506080880135915080821115610efb57600080fd5b50610f0888828901610e4e565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561030a5761030a610f19565b80356001600160a01b0381168114610f5957600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152813560208201526000610fa060208401610f42565b60018060a01b03808216604085015280610fbc60408701610f42565b16606085015250506060830135601e19843603018112610fdb57600080fd5b830160208101903567ffffffffffffffff811115610ff857600080fd5b80360382131561100757600080fd5b60808085015261101b60a085018284610f5e565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261105057600080fd5b9190910192915050565b6000808335601e1984360301811261107157600080fd5b83018035915067ffffffffffffffff82111561108c57600080fd5b6020019150600581901b3603821315610d6b57600080fd5b8082018082111561030a5761030a610f19565b6000600182016110c9576110c9610f19565b5060010190565b600181815b8085111561110b5781600019048211156110f1576110f1610f19565b808516156110fe57918102915b93841c93908002906110d5565b509250929050565b6000826111225750600161030a565b8161112f5750600061030a565b8160018114611145576002811461114f5761116b565b600191505061030a565b60ff84111561116057611160610f19565b50506001821b61030a565b5060208310610133831016604e8410600b841016171561118e575081810a61030a565b61119883836110d0565b80600019048211156111ac576111ac610f19565b029392505050565b6000610d068383611113565b634e487b7160e01b600052601260045260246000fd5b6000826111e5576111e56111c0565b500690565b6000826111f9576111f96111c0565b500490565b60006020828403121561121057600080fd5b610d0682610f42565b6000808335601e1984360301811261123057600080fd5b83018035915067ffffffffffffffff82111561124b57600080fd5b602001915036819003821315610d6b57600080fd5b8481526001600160a01b038416602082015260606040820181905260009061128b9083018486610f5e565b9695505050505050565b60005b838110156112b0578181015183820152602001611298565b50506000910152565b60008251611050818460208701611295565b60208152600082518060208401526112ea816040850160208701611295565b601f01601f19169190910160400192915050565b858152606060208201526000611318606083018688610f5e565b828103604084015261132b818587610f5e565b98975050505050505050565b60006020828403121561134957600080fd5b81518015158114610d0657600080fdfea2646970667358221220e4320091d29a9d374eeaa9fa7392305588d9cc74b80955bf333949db7c99053a64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var StateSenderArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"StateSender\",\n \"sourceName\": \"contracts/root/StateSender.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"StateSynced\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_LENGTH\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"counter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"syncState\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fd1d7f6609674cc5871fdb4b0bcd4f0a214118411de9e38983866514f22659165858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea26469706673582212205a1ba30322d7585ff3ef32240bc1cf527147c769cbeaf0c55fdf5523649a36ae64736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fd1d7f6609674cc5871fdb4b0bcd4f0a214118411de9e38983866514f22659165858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea26469706673582212205a1ba30322d7585ff3ef32240bc1cf527147c769cbeaf0c55fdf5523649a36ae64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" var ChildValidatorSetArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ChildValidatorSet\",\n \"sourceName\": \"contracts/child/ChildValidatorSet.sol\",\n \"abi\": [\n {\n \"inputs\": [],\n \"name\": \"AmountZero\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Exists\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"signer\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"InvalidSignature\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NoTokensDelegated\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"NotFound\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"src\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"msg\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"StakeRequirement\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"only\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"AddedToWhitelist\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"oldCommission\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newCommission\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"CommissionUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"delegator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Delegated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"delegator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bool\",\n \"name\": \"restake\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"DelegatorRewardClaimed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"DelegatorRewardDistributed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"key\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"pbftRound\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"DoubleSignerSlashed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"startBlock\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"endBlock\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes32\",\n \"name\": \"epochRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NewEpoch\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256[4]\",\n \"name\": \"blsKey\",\n \"type\": \"uint256[4]\"\n }\n ],\n \"name\": \"NewValidator\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferStarted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"RemovedFromWhitelist\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Staked\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"delegator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Undelegated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Unstaked\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ValidatorRewardClaimed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ValidatorRewardDistributed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Withdrawal\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"WithdrawalRegistered\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"ACTIVE_VALIDATOR_SET_SIZE\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"DOMAIN\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"DOUBLE_SIGNING_SLASHING_PERCENT\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_COMMISSION\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"WITHDRAWAL_WAIT_PERIOD\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"acceptOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"whitelistAddreses\",\n \"type\": \"address[]\"\n }\n ],\n \"name\": \"addToWhitelist\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"bls\",\n \"outputs\": [\n {\n \"internalType\": \"contract IBLS\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"restake\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"claimDelegatorReward\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"claimValidatorReward\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"epochRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct Epoch\",\n \"name\": \"epoch\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epochId\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"signedBlocks\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct UptimeData[]\",\n \"name\": \"uptimeData\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalBlocks\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct Uptime\",\n \"name\": \"uptime\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"commitEpoch\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"curEpochId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pbftRound\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"epochRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct Epoch\",\n \"name\": \"epoch\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epochId\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"signedBlocks\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct UptimeData[]\",\n \"name\": \"uptimeData\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalBlocks\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct Uptime\",\n \"name\": \"uptime\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epochId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"eventRoot\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"currentValidatorSetHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"nextValidatorSetHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"blockHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"bitmap\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct IChildValidatorSetBase.DoubleSignerSlashingInput[]\",\n \"name\": \"inputs\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"commitEpochWithDoubleSignerSlashing\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentEpochId\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"restake\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"delegate\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"delegator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"delegationOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"doubleSignerSlashes\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"epochEndBlocks\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"epochReward\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"epochSize\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"epochs\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"epochRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getCurrentValidatorSet\",\n \"outputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"\",\n \"type\": \"address[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"delegator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getDelegatorReward\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getEpochByBlock\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endBlock\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"epochRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct Epoch\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getValidator\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"blsKey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"stake\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"totalStake\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"commission\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"withdrawableRewards\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"active\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getValidatorReward\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epochReward\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"minStake\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"minDelegation\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"epochSize\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct IChildValidatorSetBase.InitStruct\",\n \"name\": \"init\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"addr\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"pubkey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"stake\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct IChildValidatorSetBase.ValidatorInit[]\",\n \"name\": \"validators\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"contract IBLS\",\n \"name\": \"newBls\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"governance\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"minDelegation\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"minStake\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pendingOwner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"pendingWithdrawals\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"pubkey\",\n \"type\": \"uint256[4]\"\n }\n ],\n \"name\": \"register\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"whitelistAddreses\",\n \"type\": \"address[]\"\n }\n ],\n \"name\": \"removeFromWhitelist\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"newCommission\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setCommission\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"n\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"sortedValidators\",\n \"outputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"\",\n \"type\": \"address[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"stake\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalActiveStake\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"activeStake\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"totalDelegationOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalStake\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"totalStakeOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"validator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"undelegate\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"unstake\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"whitelist\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"withdraw\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"withdrawable\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50615d7680620000216000396000f3fe60806040526004361061031a5760003560e01c8063715018a6116101ab578063a2562ddd116100f7578063e0563ab111610095578063ea0fee4f1161006f578063ea0fee4f1461093f578063eacdc5ff14610954578063f2fde38b1461096a578063f3f437031461098a57600080fd5b8063e0563ab1146108eb578063e30c397814610901578063e3f56eaa1461091f57600080fd5b8063a90049d0116100d1578063a90049d014610854578063ae97dde8146103b6578063c6b61e4c14610874578063ce513b6f146108cb57600080fd5b8063a2562ddd146107ff578063a2b915e21461081f578063a77af2291461083f57600080fd5b8063947287cf11610164578063982ef0a71161013e578063982ef0a7146107875780639a91e6d71461079a5780639b19251a146107af578063a1580879146107df57600080fd5b8063947287cf1461073a57806395b0b0271461075057806397e5230d1461077057600080fd5b8063715018a61461066b57806378f619321461068057806379ba5097146106d25780637f649783146106e75780638b0e9f3f146107075780638da5cb5b1461071c57600080fd5b80633a4b66f11161026a57806351351d5311610223578063548db174116101fd578063548db174146105f55780635689762f14610615578063572d356e14610635578063628da5271461064b57600080fd5b806351351d531461058657806351cff8d9146105a157806352a9674b146105c157600080fd5b80633a4b66f1146104c65780633b878c22146104ce5780633fd50001146104e4578063410899c91461050457806346df33d2146105245780634d99dd161461056657600080fd5b80632153f7fa116102d75780632e17de78116102b15780632e17de781461045057806333378ada14610470578063355e6b4314610490578063375b3c0a146104b057600080fd5b80632153f7fa146103ed578063284017f51461040d57806328f731481461043b57600080fd5b80630209fdd01461031f578063029859921461034a5780631604e4161461036e5780631904bb2e146103845780631bce714d146103b65780631f6590b8146103cb575b600080fd5b34801561032b57600080fd5b506103346109aa565b6040516103419190615255565b60405180910390f35b34801561035657600080fd5b5061036060055481565b604051908152602001610341565b34801561037a57600080fd5b5061036060035481565b34801561039057600080fd5b506103a461039f3660046152c2565b6109bb565b604051610341969594939291906152df565b3480156103c257600080fd5b50610360606481565b3480156103d757600080fd5b506103eb6103e6366004615336565b610a8e565b005b3480156103f957600080fd5b50610334610408366004615378565b610b8b565b34801561041957600080fd5b5061042361202081565b6040516001600160a01b039091168152602001610341565b34801561044757600080fd5b50610360610c97565b34801561045c57600080fd5b506103eb61046b366004615378565b610d65565b34801561047c57600080fd5b5061036061048b3660046152c2565b610e8b565b34801561049c57600080fd5b506103eb6104ab366004615378565b610ea2565b3480156104bc57600080fd5b5061036060045481565b6103eb610f89565b3480156104da57600080fd5b5061042361101081565b3480156104f057600080fd5b506103606104ff366004615378565b611084565b34801561051057600080fd5b506103eb61051f3660046153a3565b6110a5565b34801561053057600080fd5b5061054461053f366004615378565b611342565b6040805182518152602080840151908201529181015190820152606001610341565b34801561057257600080fd5b506103eb6105813660046153fb565b6113ba565b34801561059257600080fd5b506104236002600160a01b0381565b3480156105ad57600080fd5b506103eb6105bc3660046152c2565b6114c5565b3480156105cd57600080fd5b506103607ffd10bf199d0185af9cce2005e6acc8d19924428058ac3374e16f18c97569b4ee81565b34801561060157600080fd5b506103eb61061036600461546c565b6115f5565b34801561062157600080fd5b506103606106303660046154ae565b61164e565b34801561064157600080fd5b5061036060005481565b34801561065757600080fd5b506103606106663660046154ae565b61166e565b34801561067757600080fd5b506103eb611685565b34801561068c57600080fd5b506106c261069b3660046154dc565b61013e60209081526000938452604080852082529284528284209052825290205460ff1681565b6040519015158152602001610341565b3480156106de57600080fd5b506103eb611699565b3480156106f357600080fd5b506103eb61070236600461546c565b611710565b34801561071357600080fd5b50600954610360565b34801561072857600080fd5b506076546001600160a01b0316610423565b34801561074657600080fd5b5061036061520881565b34801561075c57600080fd5b50600654610423906001600160a01b031681565b34801561077c57600080fd5b50610360620249f081565b6103eb610795366004615523565b611764565b3480156107a657600080fd5b506103eb6117c0565b3480156107bb57600080fd5b506106c26107ca3660046152c2565b60106020526000908152604090205460ff1681565b3480156107eb57600080fd5b506103eb6107fa366004615551565b611825565b34801561080b57600080fd5b506103eb61081a366004615601565b611b10565b34801561082b57600080fd5b5061036061083a3660046152c2565b611e9f565b34801561084b57600080fd5b50610360600a81565b34801561086057600080fd5b506103eb61086f366004615523565b611eb3565b34801561088057600080fd5b506108b061088f366004615378565b600f6020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610341565b3480156108d757600080fd5b506103606108e63660046152c2565b611f54565b3480156108f757600080fd5b5061042361203081565b34801561090d57600080fd5b5060a8546001600160a01b0316610423565b34801561092b57600080fd5b5061036061093a3660046152c2565b611f82565b34801561094b57600080fd5b50610360600181565b34801561096057600080fd5b5061036060015481565b34801561097657600080fd5b506103eb6109853660046152c2565b611f8f565b34801561099657600080fd5b506103606109a53660046152c2565b612000565b60606109b66064610b8b565b905090565b6109c361517c565b600080808080806109d5600789612027565b604080516101208101909152908160a081018260048282826020028201915b8154815260200190600101908083116109f45750505091835250506004820154602080830191909152600583015460408301526006830154606083015260079283015460ff1615156080909201919091528251908301519099509750909150610a5d9089612045565b546020820151610a6d91906156b1565b94508060400151935080606001519250806080015191505091939550919395565b3360009081526010602052604090205460ff16610adf5760405163973d02cb60e01b815260206004820152600960248201526815d2125511531254d560ba1b60448201526064015b60405180910390fd5b610aea338383612063565b604080516101208101909152610b3d9033908060a0810185600482826080808284376000920182905250928452505060208201819052604082018190526060820152600160809091015260079190612121565b610b46336124d3565b336001600160a01b03167fcab5c47e498c5b85fd42d656842253cfe070f7648c3a198275347b47dec5d27b82604051610b7f91906156c4565b60405180910390a25050565b60606000600760010154831115610ba457600854610ba6565b825b905060008167ffffffffffffffff811115610bc357610bc36156d3565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b50905081600003610bfe579392505050565b6000610c0a600761251c565b90508082600081518110610c2057610c206156e9565b6001600160a01b039092166020928302919091019091015260015b83811015610c8d57610c4e60078361257d565b915081838281518110610c6357610c636156e9565b6001600160a01b039092166020928302919091019091015280610c85816156ff565b915050610c3b565b5090949350505050565b60008060076001015460641115610cb057600854610cb3565b60645b905080600003610cc557600091505090565b6000610cd1600761251c565b9050610cde600782612045565b54610cea600783612027565b60040154610cf891906156b1565b610d0290846156b1565b925060015b82811015610d5f57610d1a60078361257d565b9150610d27600783612045565b54610d33600784612027565b60040154610d4191906156b1565b610d4b90856156b1565b935080610d57816156ff565b915050610d07565b50505090565b6000610d72600c3361267f565b336000908152600a6020526040902060070154610d8f9190615718565b90506000610d9c836126dc565b905081811315610dbf576040516396906e6360e01b8152600401610ad690615738565b6000610dcb8284615792565b905060045481128015610ddd57508015155b15610dfb576040516396906e6360e01b8152600401610ad6906157b2565b610e036117c0565b610e1e33610e1384600019615805565b600c919060006126ef565b80600003610e46576000610e33600733612027565b600701805460ff19169115159190911790555b610e5033856127f8565b60405184815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f759060200160405180910390a250505050565b6000610e98600783612027565b6006015492915050565b610ead600733612027565b6007015460ff16610eed5760405163973d02cb60e01b81526020600482015260096024820152682b20a624a220aa27a960b91b6044820152606401610ad6565b6064811115610f335760405162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa1a7a6a6a4a9a9a4a7a760711b6044820152606401610ad6565b6000610f40600733612027565b6005810154604080519182526020820185905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a260050155565b610f94600733612027565b6007015460ff16610fd45760405163973d02cb60e01b81526020600482015260096024820152682b20a624a220aa27a960b91b6044820152606401610ad6565b6000610fe1600c3361267f565b336000908152600a6020526040902060070154610ffe9190615718565b90506004548161100d346126dc565b6110179190615718565b1215611036576040516396906e6360e01b8152600401610ad690615835565b61103e6117c0565b61104c600c333460006126ef565b60405134815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a250565b6002818154811061109457600080fd5b600091825260209091200154905081565b336002600160a01b03146110e95760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610ad6565b60018054600091826110fa836156ff565b9190505590508084146111455760405162461bcd60e51b815260206004820152601360248201527215539156141150d5115117d15413d0d217d251606a1b6044820152606401610ad6565b823560208401351161118f5760405162461bcd60e51b81526020600482015260136024820152721393d7d09313d0d2d4d7d0d3d3535255151151606a1b6044820152606401610ad6565b6000546111a18435602086013561587e565b6111ac9060016156b1565b6111b691906158a7565b156112115760405162461bcd60e51b815260206004820152602560248201527f45504f43485f4d5553545f42455f444956495349424c455f42595f45504f43486044820152645f53495a4560d81b6064820152608401610ad6565b8235600f600061122260018561587e565b815260200190815260200160002060010154600161124091906156b1565b146112835760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f53544152545f424c4f434b60681b6044820152606401610ad6565b6000818152600f602090815260408083209186013560018084018290558735845591870135600280850191909155805492830181559093527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01919091556112eb8484612864565b6112f3612a35565b83602001358460000135867f0ce8712c4dee4bd5a691f0bc1c39594671591e77395f8ebf6a3fb5f63fbea66a876040013560405161133391815260200190565b60405180910390a45050505050565b604080516060810182526000808252602082018190529181018290529061136a600284612b8d565b9050600f600061137b8360016156b1565b81526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050915050919050565b60006113c7600784612045565b905060006113d58233612c42565b9050808311156113f8576040516396906e6360e01b8152600401610ad6906158bb565b611403823385612c8e565b600061140f848361587e565b90506005548110801561142157508015155b1561143f576040516396906e6360e01b8152600401610ad6906158e5565b61144a856000611eb3565b6000611455856126dc565b905061147386600061146984600019615805565b600c9291906126ef565b61147d33866127f8565b6040518581526001600160a01b0387169033907f4d10bd049775c77bd7f255195afba5088028ecb3c7c277d393ccff7934f2f92c9060200160405180910390a3505050505050565b6114cd612d63565b6001600160a01b0381166114e3576114e3615940565b336000908152600e602052604081206001549091908190611505908490612dbc565b80855560405182815291935091506001600160a01b0385169033907f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63989060200160405180910390a36000846001600160a01b03168360405160006040518083038185875af1925050503d806000811461159a576040519150601f19603f3d011682016040523d82523d6000602084013e61159f565b606091505b50509050806115e45760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b6044820152606401610ad6565b505050506115f2600160da55565b50565b6115fd612e35565b60005b818110156116495761163783838381811061161d5761161d6156e9565b905060200201602081019061163291906152c2565b6124d3565b80611641816156ff565b915050611600565b505050565b60006116658261165f600786612045565b90612e8f565b90505b92915050565b60006116658261167f600786612045565b90612c42565b61168d612e35565b6116976000612ebe565b565b60a85433906001600160a01b031681146117075760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610ad6565b6115f281612ebe565b611718612e35565b60005b8181101561164957611752838383818110611738576117386156e9565b905060200201602081019061174d91906152c2565b612ed7565b8061175c816156ff565b91505061171b565b6000611771600784612045565b600554909150346117828333612c42565b61178c91906156b1565b10156117ab576040516396906e6360e01b8152600401610ad690615956565b6117b58383611eb3565b611649338434612f23565b60006117cd600733612027565b600681015490915060008190036117e2575050565b600060068301556117f333826127f8565b60405181815233907f378c825c0ac073cbae19612eb73cde31c0972f0c8ba2dedb659840f32550df2b90602001610b7f565b604354610100900460ff16158080156118455750604354600160ff909116105b8061185f5750303b15801561185f575060435460ff166001145b6118c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610ad6565b6043805460ff1916600117905580156118e5576043805461ff0019166101001790555b336002600160a01b03146119295760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610ad6565b60018055606086013560005561193e82612ebe565b611946612fee565b853560035560208601356004556040860135600555600680546001600160a01b0319166001600160a01b03851617905560005b84811015611ac15760006040518060a001604052808888858181106119a0576119a06156e9565b905061010002016020016004806020026040519081016040528092919082600460200280828437600092019190915250505081526020018888858181106119e9576119e96156e9565b9050610100020160e0013581526020016000815260200160008152602001600115158152509050611a45878784818110611a2557611a256156e9565b611a3c9260206101009092020190810191506152c2565b60079083612121565b611aae878784818110611a5a57611a5a6156e9565b611a719260206101009092020190810191506152c2565b888885818110611a8357611a836156e9565b9050610100020160a001898986818110611a9f57611a9f6156e9565b90506101000201602001612063565b5080611ab9816156ff565b915050611979565b508015611b08576043805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b806002811015611b325760405162461bcd60e51b8152600401610ad6906159a7565b611b3c838361301d565b611b7f5760405162461bcd60e51b8152602060048201526014602482015273424c4f434b484153485f4e4f545f554e4951554560601b6044820152606401610ad6565b60005b81811015611d1957611d114689868685818110611ba157611ba16156e9565b9050602002810190611bb391906159cf565b608001358a888887818110611bca57611bca6156e9565b9050602002810190611bdc91906159cf565b35898988818110611bef57611bef6156e9565b9050602002810190611c0191906159cf565b602001358a8a89818110611c1757611c176156e9565b9050602002810190611c2991906159cf565b604001358b8b8a818110611c3f57611c3f6156e9565b9050602002810190611c5191906159cf565b604080516020810199909952880196909652606087810195909552608087019390935260a086019190915260c085015260e084015201356101008201526101200160405160208183030381529060405280519060200120858584818110611cba57611cba6156e9565b9050602002810190611ccc91906159cf565b611cda9060c08101906159ef565b878786818110611cec57611cec6156e9565b9050602002810190611cfe91906159cf565b611d0c9060a08101906159ef565b6130d3565b600101611b82565b506000606460076001015410611d30576064611d34565b6008545b90506000611d4182610b8b565b905060008267ffffffffffffffff811115611d5e57611d5e6156d3565b604051908082528060200260200182016040528015611d87578160200160208202803683370190505b50905060005b83811015611e85576000805b86811015611e7b57611ddc898983818110611db657611db66156e9565b9050602002810190611dc891906159cf565b611dd69060a08101906159ef565b856131d7565b15611def5781611deb816156ff565b9250505b6001821115611e6957611e40858481518110611e0d57611e0d6156e9565b60200260200101518a8a84818110611e2757611e276156e9565b9050602002810190611e3991906159cf565b358e613241565b6001848481518110611e5457611e546156e9565b91151560209283029190910190910152611e7b565b80611e73816156ff565b915050611d99565b5050600101611d8d565b50611e928b8989846133b2565b5050505050505050505050565b6000611eac600783612045565b5492915050565b6000611ec0600784612045565b90506000611ece82336137c1565b905080600003611ede5750505050565b8215611ef457611eef338583612f23565b611efe565b611efe33826127f8565b821515846001600160a01b0316336001600160a01b03167f6b2cd13395c5d2d1f95934a6a8f884d2cb71e846eb99d6759f7e6a39c060b2d084604051611f4691815260200190565b60405180910390a450505050565b6001546001600160a01b0382166000908152600e602052604081209091611f7b9190612dbc565b5092915050565b6000611668600783613808565b611f97612e35565b60a880546001600160a01b0383166001600160a01b03199091168117909155611fc86076546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001546001600160a01b0382166000908152600e602052604081209091611668919061383d565b6001600160a01b031660009081526003918201602052604090200190565b6001600160a01b031660009081526004919091016020526040902090565b60065460009081906001600160a01b031663ebbdac918585612084896138d3565b6040518463ffffffff1660e01b81526004016120a293929190615a36565b6040805180830381865afa1580156120be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e29190615a7a565b915091508015806120f1575081155b1561211a57604051633615713d60e21b81526001600160a01b0386166004820152602401610ad6565b5050505050565b6001600160a01b03821661213757612137615940565b61214183836139a3565b1561216a5760405163cda981d560e01b81526001600160a01b0383166004820152602401610ad6565b6001600160a01b03821660009081526003808501602052604090912082518392919091019061219c908290600461519a565b50602082810151600483015560408301516005830155606083015160068301556080909201516007909101805460ff19169115159190911790558101516000036121e557505050565b82546000906001600160a01b0316816121fe8686613808565b90505b6001600160a01b038216156122745781925061221d8683613808565b81101561224c576001600160a01b03918216600090815260038701602052604090206001015490911690612201565b6001600160a01b03918216600090815260038701602052604090206002015490911690612201565b6040518060a00160405280846001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160011515815260200185815250866003016000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a81548160ff0219169083151502179055506080820151816003016000820151816000019060046123a992919061519a565b506020820151600482015560408201516005820155606082015160068201556080909101516007909101805460ff191691151591909117905550506001600160a01b0383166124105785546001600160a01b0319166001600160a01b03861617865561248d565b61241a8684613808565b811015612459576001600160a01b038381166000908152600388016020526040902060010180546001600160a01b03191691871691909117905561248d565b6001600160a01b038381166000908152600388016020526040902060020180546001600160a01b0319169187169190911790555b61249786866139f4565b6001860180549060006124a9836156ff565b919050555083602001518660020160008282546124c691906156b1565b9091555050505050505050565b6001600160a01b038116600081815260106020526040808220805460ff19169055517fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df7579190a250565b80546001600160a01b03168015612578575b6001600160a01b0381811660009081526003840160205260409020600201541615612578576001600160a01b0390811660009081526003830160205260409020600201541661252e565b919050565b60006001600160a01b0382166125a6576040516365e52d5160e11b815260040160405180910390fd5b6001600160a01b03828116600090815260038501602052604090206001015416156125fd576001600160a01b0380831660009081526003850160205260409020600101546125f691859116613d41565b9050611668565b506001600160a01b038082166000908152600384016020526040902054165b6001600160a01b0381161580159061265557506001600160a01b0380821660009081526003850160205260409020600101548382169116145b15611668576001600160a01b0380821660009081526003850160205260409020549192501661261c565b6001600160a01b0381166000908152602083905260408120546126a457506000611668565b826001016126b28484613d97565b815481106126c2576126c26156e9565b906000526020600020906003020160010154905092915050565b6000818181121561166857611668615940565b6001600160a01b038316600090815260208590526040812054908190036127995760018086015461271f916156b1565b6001600160a01b0385811660008181526020898152604080832086905580516060810182529384528382018981529084018881526001808d0180548083018255908652939094209451600390930290940180546001600160a01b03191692909516919091178455519083015551600290910155905061211a565b6000856001016127a98787613d97565b815481106127b9576127b96156e9565b90600052602060002090600302019050838160010160008282546127dd9190615718565b92505081905550828160020160008282546124c69190615718565b612829816001805461280a91906156b1565b6001600160a01b0385166000908152600e602052604090209190613dcb565b816001600160a01b03167f655c1cd0236fb6dc4916f34c8ff10e3b18fcaea5b344dfc16c36fbb1bdfc5df282604051610b7f91815260200190565b60018054612872919061587e565b8135146128b75760405162461bcd60e51b8152602060048201526013602482015272115413d0d217d393d517d0d3d3535255151151606a1b6044820152606401610ad6565b60006128c66020830183615aa9565b915050606481118015906128dc57506008548111155b6128f85760405162461bcd60e51b8152600401610ad6906159a7565b6000612902610c97565b90506000805460646129149190615af3565b6129238635602088013561587e565b6003546129309190615af3565b61293b906064615af3565b6129459190615b0a565b905060005b83811015611b085760006129616020870187615aa9565b83818110612971576129716156e9565b9050604002018036038101906129879190615b55565b805190915060009061299b90600790612027565b905060006129ad604089013587615af3565b602084015184516129c090600790612045565b5460048501546129d091906156b1565b6129da9088615af3565b6129e49190615af3565b6129ee9190615b0a565b9050600080612a01856000015184613ee9565b91509150612a13856000015183614022565b8451612a1f908261408d565b505050505080612a2e906156ff565b905061294a565b600d60005b8154811015612b82576000828281548110612a5757612a576156e9565b6000918252602080832060408051606081018252600390940290910180546001600160a01b0316808552600182015493850193909352600201549083015290925090612aa4600783612027565b9050612ab16007836139a3565b15612ac157612ac16007836140d7565b612add83602001518260040154612ad89190615718565b6144c1565b60048281019190915560408051610120810191829052612b589285928591839160a0830191849182845b815481526020019060010190808311612b0757505050918352505060048201546020820152600582015460408201526006820154606082015260079182015460ff1615156080909101529190612121565b506001600160a01b03166000908152600c602052604081205550612b7b816156ff565b9050612a3a565b506115f2600c6144d7565b81546000908103612ba057506000611668565b82546000905b80821015612bed576000612bba83836144e5565b60008781526020902090915085908201541115612bd957809150612be7565b612be48160016156b1565b92505b50612ba6565b600082118015612c19575083612c1686612c0860018661587e565b600091825260209091200190565b54145b15612c3257612c2960018361587e565b92505050611668565b509050611668565b505092915050565b60008260010154600003612c5857506000611668565b600183015483546001600160a01b0384166000908152600686016020526040902054612c849190615af3565b6116659190615b0a565b8254600184015460009190612ca39084615af3565b612cad9190615b0a565b6001600160a01b0384166000908152600686016020526040812080549293508392909190612cdc90849061587e565b9250508190555080846001016000828254612cf7919061587e565b90915550506002840154612d1590612d10908390615af3565b6126dc565b6001600160a01b038416600090815260048601602052604081208054909190612d3f908490615718565b9091555050835482908590600090612d5890849061587e565b909155505050505050565b600260da5403612db55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ad6565b600260da55565b81546000905b8360010154811015612e2757600081815260028501602090815260409182902082518084019093528054835260010154908201819052841015612e055750612e27565b8051612e1190846156b1565b9250508080612e1f906156ff565b915050612dc2565b9250929050565b600160da55565b6076546001600160a01b031633146116975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ad6565b6001600160a01b0381166000908152600583016020526040812054612eb48484614500565b611665919061587e565b60a880546001600160a01b03191690556115f28161457a565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab039190a250565b612f2e600783612027565b6007015460ff16612f765760405163973d02cb60e01b815260206004820152601160248201527024a72b20a624a22fab20a624a220aa27a960791b6044820152606401610ad6565b612f85826000611469846126dc565b612f9c8382612f95600786612045565b91906145cc565b816001600160a01b0316836001600160a01b03167fe5541a6b6103d4fa7e021ed54fad39c66f27a76bd13d374cf6240ae6bd0bb72b83604051612fe191815260200190565b60405180910390a3505050565b604354610100900460ff166130155760405162461bcd60e51b8152600401610ad690615b8f565b6116976146ac565b600081815b818110156130c85760006130378260016156b1565b90505b828110156130b557858582818110613054576130546156e9565b905060200281019061306691906159cf565b6080013586868481811061307c5761307c6156e9565b905060200281019061308e91906159cf565b60800135036130a35760009350505050611668565b806130ad816156ff565b91505061303a565b50806130c0816156ff565b915050613022565b506001949350505050565b6000806120306001600160a01b0316620249f088888888886040516020016130ff959493929190615c03565b60408051601f198184030181529082905261311991615c60565b6000604051808303818686fa925050503d8060008114613155576040519150601f19603f3d011682016040523d82523d6000602084013e61315a565b606091505b50915091506000818060200190518101906131759190615c72565b90508280156131815750805b6131cd5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610ad6565b5050505050505050565b6000806131e5600884615b0a565b905060006131f46008856158a7565b90508482106132085760009250505061323a565b6000600160ff83161b878785818110613223576132236156e9565b9050013560f81c60f81b60f81c60ff161611925050505b9392505050565b600082815261013e6020908152604080832084845282528083206001600160a01b038716845290915290205460ff161561327a57505050565b600082815261013e6020908152604080832084845282528083206001600160a01b03871684529091528120805460ff191660011790556132bb600785612027565b6001600160a01b0385166000908152600b60205260409020549091506064906132e690600a90615af3565b6132f09190615b0a565b6001600160a01b0385166000908152600b60205260408120805490919061331890849061587e565b9250508190555060006064600a83600401546133349190615af3565b61333e9190615b0a565b905080826004016000828254613354919061587e565b90915550506009805482919060009061336e90849061587e565b9091555050604051839085906001600160a01b038816907f2d7432ca38933aadba9547f33f0568008e240e52e66f1a16c6182e742bce3b1390600090a45050505050565b60018054600091826133c3836156ff565b91905055905080851461340e5760405162461bcd60e51b815260206004820152601360248201527215539156141150d5115117d15413d0d217d251606a1b6044820152606401610ad6565b83356020850135116134585760405162461bcd60e51b81526020600482015260136024820152721393d7d09313d0d2d4d7d0d3d3535255151151606a1b6044820152606401610ad6565b8335600f600061346960018561587e565b815260200190815260200160002060010154600161348791906156b1565b146134ca5760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f53544152545f424c4f434b60681b6044820152606401610ad6565b6000818152600f6020908152604080832087830135600180830182905589358355928901356002808401919091558054938401815585527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90920191909155919061353790860186615aa9565b9150506064811180159061354d57506008548111155b6135695760405162461bcd60e51b8152600401610ad6906159a7565b6000613573610c97565b90506000805460646135859190615af3565b613594893560208b013561587e565b6003546135a19190615af3565b6135ac906064615af3565b6135b69190615b0a565b905060005b83811015613765578681815181106135d5576135d56156e9565b60200260200101516137555760006135f060208a018a615aa9565b83818110613600576136006156e9565b9050604002018036038101906136169190615b55565b805190915060009061362a90600790612027565b9050600061363c60408c013587615af3565b6020840151845161364f90600790612045565b54600485015461365f91906156b1565b6136699088615af3565b6136739190615af3565b61367d9190615b0a565b9050600080613690856000015184613ee9565b91509150818460060160008282546136a891906156b1565b909155505084516040518481526001600160a01b03909116907f65da9d8bbc1fc112cfb499f15f17b3bfe4c5070dfca6a3e30f7f5f7f17bd86849060200160405180910390a2845161370890829061370290600790612045565b906146d3565b84600001516001600160a01b03167f520e62b73478b262ede881cd483440f8e7b8a4651b0ff9154aeb3510089ddbac8260405161374791815260200190565b60405180910390a250505050505b61375e816156ff565b90506135bb565b5061376e612a35565b876020013588600001358a7f0ce8712c4dee4bd5a691f0bc1c39594671591e77395f8ebf6a3fb5f63fbea66a8b604001356040516137ae91815260200190565b60405180910390a4505050505050505050565b60006137cd8383612e8f565b6001600160a01b03831660009081526005850160205260408120805492935083929091906137fc9084906156b1565b90915550909392505050565b6001600160a01b03811660009081526004830160209081526040808320546003860190925282206007015461166591906156b1565b6001820154600090808203613856576000915050611668565b600061386360018361587e565b90505b84548110612c3a5760008181526002860160209081526040918290208251808401909352805483526001015490820181905285106138a45750612c3a565b80516138b090856156b1565b9350816000036138c05750612c3a565b50806138cb81615c8f565b915050613866565b6138db6151d4565b6006546040516bffffffffffffffffffffffff19606085901b1660208201524660348201526001600160a01b039091169063a850a909907ffd10bf199d0185af9cce2005e6acc8d19924428058ac3374e16f18c97569b4ee906054016040516020818303038152906040526040518363ffffffff1660e01b8152600401613963929190615ca6565b6040805180830381865afa15801561397f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116689190615ce0565b60006001600160a01b03821615801590611665575082546001600160a01b03838116911614806116655750506001600160a01b03908116600090815260039290920160205260409091205416151590565b60005b82546001600160a01b03838116911614801590613a4157506001600160a01b0382811660009081526003850160205260408082205490921681522060020154600160a01b900460ff165b15613d13576001600160a01b03808316600090815260038501602052604080822054831680835281832054841683529120600101549091168103613bc9576001600160a01b0381811660009081526003860160205260408082205483168252808220600290810154909316808352912090910154909250600160a01b900460ff1615613b2a576001600160a01b0380821660008181526003870160205260408082206002808201805460ff60a01b1990811690915588871685528385208201805482169055825487168552928420018054909216600160a01b1790915591905254169250613d0d565b6001600160a01b038082166000908152600386016020526040902060020154811690841603613b6057809250613b608484614752565b506001600160a01b0380831660009081526003850160205260408082205483168083528183206002808201805460ff60a01b19908116909155825487168652938520018054909316600160a01b1790925591829052549091613bc491869116614905565b613d0d565b6001600160a01b03818116600090815260038601602052604080822054831682528082206001015490921680825291902060020154909250600160a01b900460ff1615613c73576001600160a01b0380821660008181526003870160205260408082206002808201805460ff60a01b1990811690915588871685528385208201805482169055825487168552928420018054909216600160a01b1790915591905254169250613d0d565b6001600160a01b038082166000908152600386016020526040902060010154811690841603613ca957809250613ca98484614905565b506001600160a01b0380831660009081526003850160205260408082205483168083528183206002808201805460ff60a01b19908116909155825487168652938520018054909316600160a01b1790925591829052549091613d0d91869116614752565b506139f7565b505080546001600160a01b03166000908152600390910160205260409020600201805460ff60a01b19169055565b60005b6001600160a01b0382811660009081526003850160205260409020600201541615613d91576001600160a01b03918216600090815260038401602052604090206002015490911690613d44565b50919050565b6001600160a01b03811660009081526020839052604081205490819003613dc057613dc0615940565b61166560018261587e565b81600003613ddb57613ddb615940565b82546001840154818103613e32576040805180820182528581526020808201868152600085815260028a019092529281209151825591516001918201558601805491613e26836156ff565b91905055505050505050565b60006002860181613e4460018561587e565b815260200190815260200160002060010154905080841015613e6857613e68615940565b83811015613eb7576040805180820182528681526020808201878152600086815260028b019092529281209151825591516001918201558701805491613ead836156ff565b9190505550611b08565b84600287016000613ec960018661587e565b815260200190815260200160002060000160008282546124c691906156b1565b60008080613ef8600786612027565b604080516101208101909152908160a081018260048282826020028201915b815481526020019060010190808311613f175750505091835250506004820154602080830191909152600583015460408301526006830154606083015260079283015460ff161515608090920191909152820151919250600090613f7b9088612045565b5490506000829003613f965760008094509450505050612e27565b80600003613fad5785600094509450505050612e27565b6000613fb982846156b1565b613fc38489615af3565b613fcd9190615b0a565b90506000613fdb828961587e565b905060006064828760400151613ff19190615af3565b613ffb9190615b0a565b905061400781846156b1565b614011828461587e565b975097505050505050509250929050565b600061402f600784612027565b90508181600601600082825461404591906156b1565b90915550506040518281526001600160a01b038416907f65da9d8bbc1fc112cfb499f15f17b3bfe4c5070dfca6a3e30f7f5f7f17bd86849060200160405180910390a2505050565b61409c81613702600785612045565b816001600160a01b03167f520e62b73478b262ede881cd483440f8e7b8a4651b0ff9154aeb3510089ddbac82604051610b7f91815260200190565b6001600160a01b0381166140ed576140ed615940565b6140f782826139a3565b61411f57604051634b2990ed60e11b81526001600160a01b0382166004820152602401610ad6565b6001600160a01b0381811660009081526003840160205260408120600101549091829116158061416c57506001600160a01b03838116600090815260038601602052604090206002015416155b156141785750816141e4565b506001600160a01b038083166000908152600385016020526040902060020154165b6001600160a01b03818116600090815260038601602052604090206001015416156141e4576001600160a01b0390811660009081526003850160205260409020600101541661419a565b6001600160a01b0381811660009081526003860160205260409020600101541615614230576001600160a01b038082166000908152600386016020526040902060010154169150614253565b6001600160a01b0380821660009081526003860160205260409020600201541691505b6001600160a01b038082166000908152600386016020526040808220548584168352912080546001600160a01b03191691909216908117909155801561432c576001600160a01b0380821660009081526003870160205260409020600101548116908316036142f4576001600160a01b038181166000908152600387016020526040902060010180546001600160a01b031916918516919091179055614346565b6001600160a01b038181166000908152600387016020526040902060020180546001600160a01b031916918516919091179055614346565b84546001600160a01b0319166001600160a01b0384161785555b6001600160a01b038281166000818152600388016020526040902060020154600160a01b900460ff16159186161461442157614383868487614ab8565b6001600160a01b03858116600090815260038801602052604080822060018082015488861680865284862092830180549288166001600160a01b03199384168117909155865284862080548316821790556002938401805494909301805494909716938216841787559285529284208054909316821790925590549152815460ff60a01b1916600160a01b9182900460ff1615159091021790559193915b8015614431576144318685614bb0565b6001600160a01b0383166000908152600387016020526040812080546001600160a01b0319908116825560018083018054909216909155600290910180546001600160a81b0319169055870180549161448983615c8f565b90915550506001600160a01b0383166000908152600387016020526040812060070154600288018054919290916124c690849061587e565b6000808212156144d3576144d3615940565b5090565b6115f26001820160006151f2565b60006144f46002848418615b0a565b611665908484166156b1565b6001600160a01b03811660009081526006830160205260408120546002840154829161453091612d109190615af3565b6001600160a01b03841660009081526004860160205260408120549192509061455d90612ad89084615718565b9050614571670de0b6b3a764000082615b0a565b95945050505050565b607680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008360010154600014806145e057508354155b61460457835460018501546145f59084615af3565b6145ff9190615b0a565b614606565b815b6001600160a01b03841660009081526006860160205260408120805492935083929091906146359084906156b1565b925050819055508084600101600082825461465091906156b1565b90915550508354829085906000906146699084906156b1565b9091555050600284015461468290612d10908390615af3565b6001600160a01b038416600090815260048601602052604081208054909190612d58908490615792565b604354610100900460ff16612e2e5760405162461bcd60e51b8152600401610ad690615b8f565b806000036146df575050565b8160010154600003614715576003820154604051636130835f60e01b81526001600160a01b039091166004820152602401610ad6565b600182015461472c670de0b6b3a764000083615af3565b6147369190615b0a565b82600201600082825461474991906156b1565b90915550505050565b6001600160a01b038082166000818152600385016020526040808220600281018054915482871680865293852060010154959094526001600160a01b0319909116938516938417905592169080156147d5576001600160a01b038181166000908152600387016020526040902080546001600160a01b0319169186169190911790555b6001600160a01b038381166000908152600387016020526040902080546001600160a01b03191691841691821790556148265784546001600160a01b0319166001600160a01b0384161785556148bb565b6001600160a01b038083166000908152600387016020526040902060010154811690851603614887576001600160a01b038281166000908152600387016020526040902060010180546001600160a01b0319169185169190911790556148bb565b6001600160a01b038281166000908152600387016020526040902060020180546001600160a01b0319169185169190911790555b50506001600160a01b039081166000818152600390940160205260408085206001018054939094166001600160a01b03199384168117909455928452919092208054909216179055565b6001600160a01b038082166000818152600385016020526040808220600181018054915482871680865293852060020154959094526001600160a01b031990911693851693841790559216908015614988576001600160a01b038181166000908152600387016020526040902080546001600160a01b0319169186169190911790555b6001600160a01b038381166000908152600387016020526040902080546001600160a01b03191691841691821790556149d95784546001600160a01b0319166001600160a01b038416178555614a6e565b6001600160a01b038083166000908152600387016020526040902060020154811690851603614a3a576001600160a01b038281166000908152600387016020526040902060020180546001600160a01b031916918516919091179055614a6e565b6001600160a01b038281166000908152600387016020526040902060010180546001600160a01b0319169185169190911790555b50506001600160a01b039081166000818152600390940160205260408085206002018054939094166001600160a01b03199384168117909455928452919092208054909216179055565b6001600160a01b038082166000908152600385016020526040808220548584168352912080546001600160a01b0319169190921690811790915580614b155783546001600160a01b0319166001600160a01b038416178455614baa565b6001600160a01b038082166000908152600386016020526040902060010154811690831603614b76576001600160a01b038181166000908152600386016020526040902060010180546001600160a01b031916918516919091179055614baa565b6001600160a01b038181166000908152600386016020526040902060020180546001600160a01b0319169185169190911790555b50505050565b60005b82546001600160a01b03838116911614801590614bf557506001600160a01b0382166000908152600384016020526040902060020154600160a01b900460ff16155b15615151576001600160a01b0380831660008181526003860160205260408082205484168083529120600101549092169003614ebf576001600160a01b038181166000908152600386016020526040808220600290810154909316808352912090910154909250600160a01b900460ff1615614cdc576001600160a01b0380831660009081526003860160205260408082206002908101805460ff60a01b1990811690915593851683529120018054909116600160a01b179055614cb98482614752565b6001600160a01b0380821660009081526003860160205260409020600201541691505b6001600160a01b0382811660009081526003860160205260408082206001015490921681522060020154600160a01b900460ff16158015614d4f57506001600160a01b038281166000908152600386016020526040808220600290810154909316825290200154600160a01b900460ff16155b15614d8a576001600160a01b03821660009081526003850160205260409020600201805460ff60a01b1916600160a01b17905591508161514b565b6001600160a01b038281166000908152600386016020526040808220600290810154909316825290200154600160a01b900460ff16614e3f576001600160a01b0380831660008181526003870160205260408082206001810154909416825281206002908101805460ff60a01b19908116909155929091529091018054909116600160a01b179055614e1c8483614905565b6001600160a01b0380821660009081526003860160205260409020600201541691505b6001600160a01b0380821660009081526003860160205260408082206002908101805487861685528385208301805460ff600160a01b9384900416151590920260ff60a01b19928316178155825482169092559054909416835291200180549091169055614ead8482614752565b83546001600160a01b0316925061514b565b6001600160a01b0381811660009081526003860160205260408082206001015490921680825291902060020154909250600160a01b900460ff1615614f6f576001600160a01b0380831660009081526003860160205260408082206002908101805460ff60a01b1990811690915593851683529120018054909116600160a01b179055614f4c8482614905565b6001600160a01b0380821660009081526003860160205260409020600101541691505b6001600160a01b038281166000908152600386016020526040808220600290810154909316825290200154600160a01b900460ff16158015614fe257506001600160a01b0382811660009081526003860160205260408082206001015490921681522060020154600160a01b900460ff16155b1561501d576001600160a01b03821660009081526003850160205260409020600201805460ff60a01b1916600160a01b17905591508161514b565b6001600160a01b0382811660009081526003860160205260408082206001015490921681522060020154600160a01b900460ff166150ca576001600160a01b03808316600081815260038701602052604080822060029081018054909516835290822001805460ff60a01b19908116909155919052815416600160a01b1790556150a78483614752565b6001600160a01b0380821660009081526003860160205260409020600101541691505b6001600160a01b038082166000908152600386016020526040808220600290810180548786168552838520808401805460ff600160a01b9485900416151590930260ff60a01b199384161790558254821690925560019091015490941683529120018054909116905561513d8482614905565b83546001600160a01b031692505b50614bb3565b506001600160a01b03166000908152600390910160205260409020600201805460ff60a01b19169055565b60405180608001604052806004906020820280368337509192915050565b82600481019282156151c8579160200282015b828111156151c85782518255916020019190600101906151ad565b506144d3929150615213565b60405180604001604052806002906020820280368337509192915050565b50805460008255600302906000526020600020908101906115f29190615228565b5b808211156144d35760008155600101615214565b5b808211156144d35780546001600160a01b03191681556000600182018190556002820155600301615229565b6020808252825182820181905260009190848201906040850190845b818110156152965783516001600160a01b031683529284019291840191600101615271565b50909695505050505050565b6001600160a01b03811681146115f257600080fd5b8035612578816152a2565b6000602082840312156152d457600080fd5b813561323a816152a2565b6101208101818860005b60048110156153085781518352602092830192909101906001016152e9565b505050608082019690965260a081019490945260c084019290925260e0830152151561010090910152919050565b60008060c0838503121561534957600080fd5b604083018481111561535a57600080fd5b8392508460c08501111561536d57600080fd5b809150509250929050565b60006020828403121561538a57600080fd5b5035919050565b600060608284031215613d9157600080fd5b600080600060a084860312156153b857600080fd5b833592506153c98560208601615391565b9150608084013567ffffffffffffffff8111156153e557600080fd5b6153f186828701615391565b9150509250925092565b6000806040838503121561540e57600080fd5b8235615419816152a2565b946020939093013593505050565b60008083601f84011261543957600080fd5b50813567ffffffffffffffff81111561545157600080fd5b6020830191508360208260051b8501011115612e2757600080fd5b6000806020838503121561547f57600080fd5b823567ffffffffffffffff81111561549657600080fd5b6154a285828601615427565b90969095509350505050565b600080604083850312156154c157600080fd5b82356154cc816152a2565b9150602083013561536d816152a2565b6000806000606084860312156154f157600080fd5b8335925060208401359150604084013561550a816152a2565b809150509250925092565b80151581146115f257600080fd5b6000806040838503121561553657600080fd5b8235615541816152a2565b9150602083013561536d81615515565b600080600080600085870360e081121561556a57600080fd5b608081121561557857600080fd5b50859450608086013567ffffffffffffffff8082111561559757600080fd5b818801915088601f8301126155ab57600080fd5b8135818111156155ba57600080fd5b8960208260081b85010111156155cf57600080fd5b6020830196508095505050506155e760a087016152b7565b91506155f560c087016152b7565b90509295509295909350565b6000806000806000806000610100888a03121561561d57600080fd5b87359650602088013595506040880135945061563c8960608a01615391565b935060c088013567ffffffffffffffff8082111561565957600080fd5b6156658b838c01615391565b945060e08a013591508082111561567b57600080fd5b506156888a828b01615427565b989b979a50959850939692959293505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156116685761166861569b565b60808181019083833792915050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016157115761571161569b565b5060010190565b8082018281126000831280158216821582161715612c3a57612c3a61569b565b60408152600061575f604083016007815266756e7374616b6560c81b602082015260400190565b828103602084015261323a816014815273494e53554646494349454e545f42414c414e434560601b602082015260400190565b8181036000831280158383131683831282161715611f7b57611f7b61569b565b6040815260006157d9604083016007815266756e7374616b6560c81b602082015260400190565b828103602084015261323a81600d81526c5354414b455f544f4f5f4c4f5760981b602082015260400190565b80820260008212600160ff1b841416156158215761582161569b565b81810583148215176116685761166861569b565b6040815260056040820152647374616b6560d81b606082015260806020820152600061166860808301600d81526c5354414b455f544f4f5f4c4f5760981b602082015260400190565b818103818111156116685761166861569b565b634e487b7160e01b600052601260045260246000fd5b6000826158b6576158b6615891565b500690565b60408152600061575f60408301600a815269756e64656c656761746560b01b602082015260400190565b60408152600061590f60408301600a815269756e64656c656761746560b01b602082015260400190565b828103602084015261323a81601281527144454c45474154494f4e5f544f4f5f4c4f5760701b602082015260400190565b634e487b7160e01b600052600160045260246000fd5b60408152600860408201526764656c656761746560c01b606082015260806020820152600061166860808301601281527144454c45474154494f4e5f544f4f5f4c4f5760701b602082015260400190565b6020808252600e908201526d0929cac82989288be988a9c8ea8960931b604082015260600190565b6000823560de198336030181126159e557600080fd5b9190910192915050565b6000808335601e19843603018112615a0657600080fd5b83018035915067ffffffffffffffff821115615a2157600080fd5b602001915036819003821315612e2757600080fd5b61010081016040858337608084604084013760c082018360005b6002811015615a6f578151835260209283019290910190600101615a50565b505050949350505050565b60008060408385031215615a8d57600080fd5b8251615a9881615515565b602084015190925061536d81615515565b6000808335601e19843603018112615ac057600080fd5b83018035915067ffffffffffffffff821115615adb57600080fd5b6020019150600681901b3603821315612e2757600080fd5b80820281158282048414176116685761166861569b565b600082615b1957615b19615891565b500490565b6040805190810167ffffffffffffffff81118282101715615b4f57634e487b7160e01b600052604160045260246000fd5b60405290565b600060408284031215615b6757600080fd5b615b6f615b1e565b8235615b7a816152a2565b81526020928301359281019290925250919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b858152606060208201526000615c1d606083018688615bda565b8281036040840152615c30818587615bda565b98975050505050505050565b60005b83811015615c57578181015183820152602001615c3f565b50506000910152565b600082516159e5818460208701615c3c565b600060208284031215615c8457600080fd5b815161323a81615515565b600081615c9e57615c9e61569b565b506000190190565b8281526040602082015260008251806040840152615ccb816060850160208701615c3c565b601f01601f1916919091016060019392505050565b600060408284031215615cf257600080fd5b82601f830112615d0157600080fd5b615d09615b1e565b806040840185811115615d1b57600080fd5b845b81811015615d35578051845260209384019301615d1d565b50909594505050505056fea264697066735822122092094018521e25da5faeab4a5ecf1d1635ccb2873dcf69bf47bd031dde1f06de64736f6c63430008110033\",\n \"deployedBytecode\": \"0x60806040526004361061031a5760003560e01c8063715018a6116101ab578063a2562ddd116100f7578063e0563ab111610095578063ea0fee4f1161006f578063ea0fee4f1461093f578063eacdc5ff14610954578063f2fde38b1461096a578063f3f437031461098a57600080fd5b8063e0563ab1146108eb578063e30c397814610901578063e3f56eaa1461091f57600080fd5b8063a90049d0116100d1578063a90049d014610854578063ae97dde8146103b6578063c6b61e4c14610874578063ce513b6f146108cb57600080fd5b8063a2562ddd146107ff578063a2b915e21461081f578063a77af2291461083f57600080fd5b8063947287cf11610164578063982ef0a71161013e578063982ef0a7146107875780639a91e6d71461079a5780639b19251a146107af578063a1580879146107df57600080fd5b8063947287cf1461073a57806395b0b0271461075057806397e5230d1461077057600080fd5b8063715018a61461066b57806378f619321461068057806379ba5097146106d25780637f649783146106e75780638b0e9f3f146107075780638da5cb5b1461071c57600080fd5b80633a4b66f11161026a57806351351d5311610223578063548db174116101fd578063548db174146105f55780635689762f14610615578063572d356e14610635578063628da5271461064b57600080fd5b806351351d531461058657806351cff8d9146105a157806352a9674b146105c157600080fd5b80633a4b66f1146104c65780633b878c22146104ce5780633fd50001146104e4578063410899c91461050457806346df33d2146105245780634d99dd161461056657600080fd5b80632153f7fa116102d75780632e17de78116102b15780632e17de781461045057806333378ada14610470578063355e6b4314610490578063375b3c0a146104b057600080fd5b80632153f7fa146103ed578063284017f51461040d57806328f731481461043b57600080fd5b80630209fdd01461031f578063029859921461034a5780631604e4161461036e5780631904bb2e146103845780631bce714d146103b65780631f6590b8146103cb575b600080fd5b34801561032b57600080fd5b506103346109aa565b6040516103419190615255565b60405180910390f35b34801561035657600080fd5b5061036060055481565b604051908152602001610341565b34801561037a57600080fd5b5061036060035481565b34801561039057600080fd5b506103a461039f3660046152c2565b6109bb565b604051610341969594939291906152df565b3480156103c257600080fd5b50610360606481565b3480156103d757600080fd5b506103eb6103e6366004615336565b610a8e565b005b3480156103f957600080fd5b50610334610408366004615378565b610b8b565b34801561041957600080fd5b5061042361202081565b6040516001600160a01b039091168152602001610341565b34801561044757600080fd5b50610360610c97565b34801561045c57600080fd5b506103eb61046b366004615378565b610d65565b34801561047c57600080fd5b5061036061048b3660046152c2565b610e8b565b34801561049c57600080fd5b506103eb6104ab366004615378565b610ea2565b3480156104bc57600080fd5b5061036060045481565b6103eb610f89565b3480156104da57600080fd5b5061042361101081565b3480156104f057600080fd5b506103606104ff366004615378565b611084565b34801561051057600080fd5b506103eb61051f3660046153a3565b6110a5565b34801561053057600080fd5b5061054461053f366004615378565b611342565b6040805182518152602080840151908201529181015190820152606001610341565b34801561057257600080fd5b506103eb6105813660046153fb565b6113ba565b34801561059257600080fd5b506104236002600160a01b0381565b3480156105ad57600080fd5b506103eb6105bc3660046152c2565b6114c5565b3480156105cd57600080fd5b506103607ffd10bf199d0185af9cce2005e6acc8d19924428058ac3374e16f18c97569b4ee81565b34801561060157600080fd5b506103eb61061036600461546c565b6115f5565b34801561062157600080fd5b506103606106303660046154ae565b61164e565b34801561064157600080fd5b5061036060005481565b34801561065757600080fd5b506103606106663660046154ae565b61166e565b34801561067757600080fd5b506103eb611685565b34801561068c57600080fd5b506106c261069b3660046154dc565b61013e60209081526000938452604080852082529284528284209052825290205460ff1681565b6040519015158152602001610341565b3480156106de57600080fd5b506103eb611699565b3480156106f357600080fd5b506103eb61070236600461546c565b611710565b34801561071357600080fd5b50600954610360565b34801561072857600080fd5b506076546001600160a01b0316610423565b34801561074657600080fd5b5061036061520881565b34801561075c57600080fd5b50600654610423906001600160a01b031681565b34801561077c57600080fd5b50610360620249f081565b6103eb610795366004615523565b611764565b3480156107a657600080fd5b506103eb6117c0565b3480156107bb57600080fd5b506106c26107ca3660046152c2565b60106020526000908152604090205460ff1681565b3480156107eb57600080fd5b506103eb6107fa366004615551565b611825565b34801561080b57600080fd5b506103eb61081a366004615601565b611b10565b34801561082b57600080fd5b5061036061083a3660046152c2565b611e9f565b34801561084b57600080fd5b50610360600a81565b34801561086057600080fd5b506103eb61086f366004615523565b611eb3565b34801561088057600080fd5b506108b061088f366004615378565b600f6020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610341565b3480156108d757600080fd5b506103606108e63660046152c2565b611f54565b3480156108f757600080fd5b5061042361203081565b34801561090d57600080fd5b5060a8546001600160a01b0316610423565b34801561092b57600080fd5b5061036061093a3660046152c2565b611f82565b34801561094b57600080fd5b50610360600181565b34801561096057600080fd5b5061036060015481565b34801561097657600080fd5b506103eb6109853660046152c2565b611f8f565b34801561099657600080fd5b506103606109a53660046152c2565b612000565b60606109b66064610b8b565b905090565b6109c361517c565b600080808080806109d5600789612027565b604080516101208101909152908160a081018260048282826020028201915b8154815260200190600101908083116109f45750505091835250506004820154602080830191909152600583015460408301526006830154606083015260079283015460ff1615156080909201919091528251908301519099509750909150610a5d9089612045565b546020820151610a6d91906156b1565b94508060400151935080606001519250806080015191505091939550919395565b3360009081526010602052604090205460ff16610adf5760405163973d02cb60e01b815260206004820152600960248201526815d2125511531254d560ba1b60448201526064015b60405180910390fd5b610aea338383612063565b604080516101208101909152610b3d9033908060a0810185600482826080808284376000920182905250928452505060208201819052604082018190526060820152600160809091015260079190612121565b610b46336124d3565b336001600160a01b03167fcab5c47e498c5b85fd42d656842253cfe070f7648c3a198275347b47dec5d27b82604051610b7f91906156c4565b60405180910390a25050565b60606000600760010154831115610ba457600854610ba6565b825b905060008167ffffffffffffffff811115610bc357610bc36156d3565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b50905081600003610bfe579392505050565b6000610c0a600761251c565b90508082600081518110610c2057610c206156e9565b6001600160a01b039092166020928302919091019091015260015b83811015610c8d57610c4e60078361257d565b915081838281518110610c6357610c636156e9565b6001600160a01b039092166020928302919091019091015280610c85816156ff565b915050610c3b565b5090949350505050565b60008060076001015460641115610cb057600854610cb3565b60645b905080600003610cc557600091505090565b6000610cd1600761251c565b9050610cde600782612045565b54610cea600783612027565b60040154610cf891906156b1565b610d0290846156b1565b925060015b82811015610d5f57610d1a60078361257d565b9150610d27600783612045565b54610d33600784612027565b60040154610d4191906156b1565b610d4b90856156b1565b935080610d57816156ff565b915050610d07565b50505090565b6000610d72600c3361267f565b336000908152600a6020526040902060070154610d8f9190615718565b90506000610d9c836126dc565b905081811315610dbf576040516396906e6360e01b8152600401610ad690615738565b6000610dcb8284615792565b905060045481128015610ddd57508015155b15610dfb576040516396906e6360e01b8152600401610ad6906157b2565b610e036117c0565b610e1e33610e1384600019615805565b600c919060006126ef565b80600003610e46576000610e33600733612027565b600701805460ff19169115159190911790555b610e5033856127f8565b60405184815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f759060200160405180910390a250505050565b6000610e98600783612027565b6006015492915050565b610ead600733612027565b6007015460ff16610eed5760405163973d02cb60e01b81526020600482015260096024820152682b20a624a220aa27a960b91b6044820152606401610ad6565b6064811115610f335760405162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa1a7a6a6a4a9a9a4a7a760711b6044820152606401610ad6565b6000610f40600733612027565b6005810154604080519182526020820185905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a260050155565b610f94600733612027565b6007015460ff16610fd45760405163973d02cb60e01b81526020600482015260096024820152682b20a624a220aa27a960b91b6044820152606401610ad6565b6000610fe1600c3361267f565b336000908152600a6020526040902060070154610ffe9190615718565b90506004548161100d346126dc565b6110179190615718565b1215611036576040516396906e6360e01b8152600401610ad690615835565b61103e6117c0565b61104c600c333460006126ef565b60405134815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a250565b6002818154811061109457600080fd5b600091825260209091200154905081565b336002600160a01b03146110e95760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610ad6565b60018054600091826110fa836156ff565b9190505590508084146111455760405162461bcd60e51b815260206004820152601360248201527215539156141150d5115117d15413d0d217d251606a1b6044820152606401610ad6565b823560208401351161118f5760405162461bcd60e51b81526020600482015260136024820152721393d7d09313d0d2d4d7d0d3d3535255151151606a1b6044820152606401610ad6565b6000546111a18435602086013561587e565b6111ac9060016156b1565b6111b691906158a7565b156112115760405162461bcd60e51b815260206004820152602560248201527f45504f43485f4d5553545f42455f444956495349424c455f42595f45504f43486044820152645f53495a4560d81b6064820152608401610ad6565b8235600f600061122260018561587e565b815260200190815260200160002060010154600161124091906156b1565b146112835760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f53544152545f424c4f434b60681b6044820152606401610ad6565b6000818152600f602090815260408083209186013560018084018290558735845591870135600280850191909155805492830181559093527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01919091556112eb8484612864565b6112f3612a35565b83602001358460000135867f0ce8712c4dee4bd5a691f0bc1c39594671591e77395f8ebf6a3fb5f63fbea66a876040013560405161133391815260200190565b60405180910390a45050505050565b604080516060810182526000808252602082018190529181018290529061136a600284612b8d565b9050600f600061137b8360016156b1565b81526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050915050919050565b60006113c7600784612045565b905060006113d58233612c42565b9050808311156113f8576040516396906e6360e01b8152600401610ad6906158bb565b611403823385612c8e565b600061140f848361587e565b90506005548110801561142157508015155b1561143f576040516396906e6360e01b8152600401610ad6906158e5565b61144a856000611eb3565b6000611455856126dc565b905061147386600061146984600019615805565b600c9291906126ef565b61147d33866127f8565b6040518581526001600160a01b0387169033907f4d10bd049775c77bd7f255195afba5088028ecb3c7c277d393ccff7934f2f92c9060200160405180910390a3505050505050565b6114cd612d63565b6001600160a01b0381166114e3576114e3615940565b336000908152600e602052604081206001549091908190611505908490612dbc565b80855560405182815291935091506001600160a01b0385169033907f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63989060200160405180910390a36000846001600160a01b03168360405160006040518083038185875af1925050503d806000811461159a576040519150601f19603f3d011682016040523d82523d6000602084013e61159f565b606091505b50509050806115e45760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b6044820152606401610ad6565b505050506115f2600160da55565b50565b6115fd612e35565b60005b818110156116495761163783838381811061161d5761161d6156e9565b905060200201602081019061163291906152c2565b6124d3565b80611641816156ff565b915050611600565b505050565b60006116658261165f600786612045565b90612e8f565b90505b92915050565b60006116658261167f600786612045565b90612c42565b61168d612e35565b6116976000612ebe565b565b60a85433906001600160a01b031681146117075760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610ad6565b6115f281612ebe565b611718612e35565b60005b8181101561164957611752838383818110611738576117386156e9565b905060200201602081019061174d91906152c2565b612ed7565b8061175c816156ff565b91505061171b565b6000611771600784612045565b600554909150346117828333612c42565b61178c91906156b1565b10156117ab576040516396906e6360e01b8152600401610ad690615956565b6117b58383611eb3565b611649338434612f23565b60006117cd600733612027565b600681015490915060008190036117e2575050565b600060068301556117f333826127f8565b60405181815233907f378c825c0ac073cbae19612eb73cde31c0972f0c8ba2dedb659840f32550df2b90602001610b7f565b604354610100900460ff16158080156118455750604354600160ff909116105b8061185f5750303b15801561185f575060435460ff166001145b6118c25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610ad6565b6043805460ff1916600117905580156118e5576043805461ff0019166101001790555b336002600160a01b03146119295760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610ad6565b60018055606086013560005561193e82612ebe565b611946612fee565b853560035560208601356004556040860135600555600680546001600160a01b0319166001600160a01b03851617905560005b84811015611ac15760006040518060a001604052808888858181106119a0576119a06156e9565b905061010002016020016004806020026040519081016040528092919082600460200280828437600092019190915250505081526020018888858181106119e9576119e96156e9565b9050610100020160e0013581526020016000815260200160008152602001600115158152509050611a45878784818110611a2557611a256156e9565b611a3c9260206101009092020190810191506152c2565b60079083612121565b611aae878784818110611a5a57611a5a6156e9565b611a719260206101009092020190810191506152c2565b888885818110611a8357611a836156e9565b9050610100020160a001898986818110611a9f57611a9f6156e9565b90506101000201602001612063565b5080611ab9816156ff565b915050611979565b508015611b08576043805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b806002811015611b325760405162461bcd60e51b8152600401610ad6906159a7565b611b3c838361301d565b611b7f5760405162461bcd60e51b8152602060048201526014602482015273424c4f434b484153485f4e4f545f554e4951554560601b6044820152606401610ad6565b60005b81811015611d1957611d114689868685818110611ba157611ba16156e9565b9050602002810190611bb391906159cf565b608001358a888887818110611bca57611bca6156e9565b9050602002810190611bdc91906159cf565b35898988818110611bef57611bef6156e9565b9050602002810190611c0191906159cf565b602001358a8a89818110611c1757611c176156e9565b9050602002810190611c2991906159cf565b604001358b8b8a818110611c3f57611c3f6156e9565b9050602002810190611c5191906159cf565b604080516020810199909952880196909652606087810195909552608087019390935260a086019190915260c085015260e084015201356101008201526101200160405160208183030381529060405280519060200120858584818110611cba57611cba6156e9565b9050602002810190611ccc91906159cf565b611cda9060c08101906159ef565b878786818110611cec57611cec6156e9565b9050602002810190611cfe91906159cf565b611d0c9060a08101906159ef565b6130d3565b600101611b82565b506000606460076001015410611d30576064611d34565b6008545b90506000611d4182610b8b565b905060008267ffffffffffffffff811115611d5e57611d5e6156d3565b604051908082528060200260200182016040528015611d87578160200160208202803683370190505b50905060005b83811015611e85576000805b86811015611e7b57611ddc898983818110611db657611db66156e9565b9050602002810190611dc891906159cf565b611dd69060a08101906159ef565b856131d7565b15611def5781611deb816156ff565b9250505b6001821115611e6957611e40858481518110611e0d57611e0d6156e9565b60200260200101518a8a84818110611e2757611e276156e9565b9050602002810190611e3991906159cf565b358e613241565b6001848481518110611e5457611e546156e9565b91151560209283029190910190910152611e7b565b80611e73816156ff565b915050611d99565b5050600101611d8d565b50611e928b8989846133b2565b5050505050505050505050565b6000611eac600783612045565b5492915050565b6000611ec0600784612045565b90506000611ece82336137c1565b905080600003611ede5750505050565b8215611ef457611eef338583612f23565b611efe565b611efe33826127f8565b821515846001600160a01b0316336001600160a01b03167f6b2cd13395c5d2d1f95934a6a8f884d2cb71e846eb99d6759f7e6a39c060b2d084604051611f4691815260200190565b60405180910390a450505050565b6001546001600160a01b0382166000908152600e602052604081209091611f7b9190612dbc565b5092915050565b6000611668600783613808565b611f97612e35565b60a880546001600160a01b0383166001600160a01b03199091168117909155611fc86076546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001546001600160a01b0382166000908152600e602052604081209091611668919061383d565b6001600160a01b031660009081526003918201602052604090200190565b6001600160a01b031660009081526004919091016020526040902090565b60065460009081906001600160a01b031663ebbdac918585612084896138d3565b6040518463ffffffff1660e01b81526004016120a293929190615a36565b6040805180830381865afa1580156120be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e29190615a7a565b915091508015806120f1575081155b1561211a57604051633615713d60e21b81526001600160a01b0386166004820152602401610ad6565b5050505050565b6001600160a01b03821661213757612137615940565b61214183836139a3565b1561216a5760405163cda981d560e01b81526001600160a01b0383166004820152602401610ad6565b6001600160a01b03821660009081526003808501602052604090912082518392919091019061219c908290600461519a565b50602082810151600483015560408301516005830155606083015160068301556080909201516007909101805460ff19169115159190911790558101516000036121e557505050565b82546000906001600160a01b0316816121fe8686613808565b90505b6001600160a01b038216156122745781925061221d8683613808565b81101561224c576001600160a01b03918216600090815260038701602052604090206001015490911690612201565b6001600160a01b03918216600090815260038701602052604090206002015490911690612201565b6040518060a00160405280846001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160011515815260200185815250866003016000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a81548160ff0219169083151502179055506080820151816003016000820151816000019060046123a992919061519a565b506020820151600482015560408201516005820155606082015160068201556080909101516007909101805460ff191691151591909117905550506001600160a01b0383166124105785546001600160a01b0319166001600160a01b03861617865561248d565b61241a8684613808565b811015612459576001600160a01b038381166000908152600388016020526040902060010180546001600160a01b03191691871691909117905561248d565b6001600160a01b038381166000908152600388016020526040902060020180546001600160a01b0319169187169190911790555b61249786866139f4565b6001860180549060006124a9836156ff565b919050555083602001518660020160008282546124c691906156b1565b9091555050505050505050565b6001600160a01b038116600081815260106020526040808220805460ff19169055517fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df7579190a250565b80546001600160a01b03168015612578575b6001600160a01b0381811660009081526003840160205260409020600201541615612578576001600160a01b0390811660009081526003830160205260409020600201541661252e565b919050565b60006001600160a01b0382166125a6576040516365e52d5160e11b815260040160405180910390fd5b6001600160a01b03828116600090815260038501602052604090206001015416156125fd576001600160a01b0380831660009081526003850160205260409020600101546125f691859116613d41565b9050611668565b506001600160a01b038082166000908152600384016020526040902054165b6001600160a01b0381161580159061265557506001600160a01b0380821660009081526003850160205260409020600101548382169116145b15611668576001600160a01b0380821660009081526003850160205260409020549192501661261c565b6001600160a01b0381166000908152602083905260408120546126a457506000611668565b826001016126b28484613d97565b815481106126c2576126c26156e9565b906000526020600020906003020160010154905092915050565b6000818181121561166857611668615940565b6001600160a01b038316600090815260208590526040812054908190036127995760018086015461271f916156b1565b6001600160a01b0385811660008181526020898152604080832086905580516060810182529384528382018981529084018881526001808d0180548083018255908652939094209451600390930290940180546001600160a01b03191692909516919091178455519083015551600290910155905061211a565b6000856001016127a98787613d97565b815481106127b9576127b96156e9565b90600052602060002090600302019050838160010160008282546127dd9190615718565b92505081905550828160020160008282546124c69190615718565b612829816001805461280a91906156b1565b6001600160a01b0385166000908152600e602052604090209190613dcb565b816001600160a01b03167f655c1cd0236fb6dc4916f34c8ff10e3b18fcaea5b344dfc16c36fbb1bdfc5df282604051610b7f91815260200190565b60018054612872919061587e565b8135146128b75760405162461bcd60e51b8152602060048201526013602482015272115413d0d217d393d517d0d3d3535255151151606a1b6044820152606401610ad6565b60006128c66020830183615aa9565b915050606481118015906128dc57506008548111155b6128f85760405162461bcd60e51b8152600401610ad6906159a7565b6000612902610c97565b90506000805460646129149190615af3565b6129238635602088013561587e565b6003546129309190615af3565b61293b906064615af3565b6129459190615b0a565b905060005b83811015611b085760006129616020870187615aa9565b83818110612971576129716156e9565b9050604002018036038101906129879190615b55565b805190915060009061299b90600790612027565b905060006129ad604089013587615af3565b602084015184516129c090600790612045565b5460048501546129d091906156b1565b6129da9088615af3565b6129e49190615af3565b6129ee9190615b0a565b9050600080612a01856000015184613ee9565b91509150612a13856000015183614022565b8451612a1f908261408d565b505050505080612a2e906156ff565b905061294a565b600d60005b8154811015612b82576000828281548110612a5757612a576156e9565b6000918252602080832060408051606081018252600390940290910180546001600160a01b0316808552600182015493850193909352600201549083015290925090612aa4600783612027565b9050612ab16007836139a3565b15612ac157612ac16007836140d7565b612add83602001518260040154612ad89190615718565b6144c1565b60048281019190915560408051610120810191829052612b589285928591839160a0830191849182845b815481526020019060010190808311612b0757505050918352505060048201546020820152600582015460408201526006820154606082015260079182015460ff1615156080909101529190612121565b506001600160a01b03166000908152600c602052604081205550612b7b816156ff565b9050612a3a565b506115f2600c6144d7565b81546000908103612ba057506000611668565b82546000905b80821015612bed576000612bba83836144e5565b60008781526020902090915085908201541115612bd957809150612be7565b612be48160016156b1565b92505b50612ba6565b600082118015612c19575083612c1686612c0860018661587e565b600091825260209091200190565b54145b15612c3257612c2960018361587e565b92505050611668565b509050611668565b505092915050565b60008260010154600003612c5857506000611668565b600183015483546001600160a01b0384166000908152600686016020526040902054612c849190615af3565b6116659190615b0a565b8254600184015460009190612ca39084615af3565b612cad9190615b0a565b6001600160a01b0384166000908152600686016020526040812080549293508392909190612cdc90849061587e565b9250508190555080846001016000828254612cf7919061587e565b90915550506002840154612d1590612d10908390615af3565b6126dc565b6001600160a01b038416600090815260048601602052604081208054909190612d3f908490615718565b9091555050835482908590600090612d5890849061587e565b909155505050505050565b600260da5403612db55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ad6565b600260da55565b81546000905b8360010154811015612e2757600081815260028501602090815260409182902082518084019093528054835260010154908201819052841015612e055750612e27565b8051612e1190846156b1565b9250508080612e1f906156ff565b915050612dc2565b9250929050565b600160da55565b6076546001600160a01b031633146116975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ad6565b6001600160a01b0381166000908152600583016020526040812054612eb48484614500565b611665919061587e565b60a880546001600160a01b03191690556115f28161457a565b6001600160a01b038116600081815260106020526040808220805460ff19166001179055517fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab039190a250565b612f2e600783612027565b6007015460ff16612f765760405163973d02cb60e01b815260206004820152601160248201527024a72b20a624a22fab20a624a220aa27a960791b6044820152606401610ad6565b612f85826000611469846126dc565b612f9c8382612f95600786612045565b91906145cc565b816001600160a01b0316836001600160a01b03167fe5541a6b6103d4fa7e021ed54fad39c66f27a76bd13d374cf6240ae6bd0bb72b83604051612fe191815260200190565b60405180910390a3505050565b604354610100900460ff166130155760405162461bcd60e51b8152600401610ad690615b8f565b6116976146ac565b600081815b818110156130c85760006130378260016156b1565b90505b828110156130b557858582818110613054576130546156e9565b905060200281019061306691906159cf565b6080013586868481811061307c5761307c6156e9565b905060200281019061308e91906159cf565b60800135036130a35760009350505050611668565b806130ad816156ff565b91505061303a565b50806130c0816156ff565b915050613022565b506001949350505050565b6000806120306001600160a01b0316620249f088888888886040516020016130ff959493929190615c03565b60408051601f198184030181529082905261311991615c60565b6000604051808303818686fa925050503d8060008114613155576040519150601f19603f3d011682016040523d82523d6000602084013e61315a565b606091505b50915091506000818060200190518101906131759190615c72565b90508280156131815750805b6131cd5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610ad6565b5050505050505050565b6000806131e5600884615b0a565b905060006131f46008856158a7565b90508482106132085760009250505061323a565b6000600160ff83161b878785818110613223576132236156e9565b9050013560f81c60f81b60f81c60ff161611925050505b9392505050565b600082815261013e6020908152604080832084845282528083206001600160a01b038716845290915290205460ff161561327a57505050565b600082815261013e6020908152604080832084845282528083206001600160a01b03871684529091528120805460ff191660011790556132bb600785612027565b6001600160a01b0385166000908152600b60205260409020549091506064906132e690600a90615af3565b6132f09190615b0a565b6001600160a01b0385166000908152600b60205260408120805490919061331890849061587e565b9250508190555060006064600a83600401546133349190615af3565b61333e9190615b0a565b905080826004016000828254613354919061587e565b90915550506009805482919060009061336e90849061587e565b9091555050604051839085906001600160a01b038816907f2d7432ca38933aadba9547f33f0568008e240e52e66f1a16c6182e742bce3b1390600090a45050505050565b60018054600091826133c3836156ff565b91905055905080851461340e5760405162461bcd60e51b815260206004820152601360248201527215539156141150d5115117d15413d0d217d251606a1b6044820152606401610ad6565b83356020850135116134585760405162461bcd60e51b81526020600482015260136024820152721393d7d09313d0d2d4d7d0d3d3535255151151606a1b6044820152606401610ad6565b8335600f600061346960018561587e565b815260200190815260200160002060010154600161348791906156b1565b146134ca5760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f53544152545f424c4f434b60681b6044820152606401610ad6565b6000818152600f6020908152604080832087830135600180830182905589358355928901356002808401919091558054938401815585527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90920191909155919061353790860186615aa9565b9150506064811180159061354d57506008548111155b6135695760405162461bcd60e51b8152600401610ad6906159a7565b6000613573610c97565b90506000805460646135859190615af3565b613594893560208b013561587e565b6003546135a19190615af3565b6135ac906064615af3565b6135b69190615b0a565b905060005b83811015613765578681815181106135d5576135d56156e9565b60200260200101516137555760006135f060208a018a615aa9565b83818110613600576136006156e9565b9050604002018036038101906136169190615b55565b805190915060009061362a90600790612027565b9050600061363c60408c013587615af3565b6020840151845161364f90600790612045565b54600485015461365f91906156b1565b6136699088615af3565b6136739190615af3565b61367d9190615b0a565b9050600080613690856000015184613ee9565b91509150818460060160008282546136a891906156b1565b909155505084516040518481526001600160a01b03909116907f65da9d8bbc1fc112cfb499f15f17b3bfe4c5070dfca6a3e30f7f5f7f17bd86849060200160405180910390a2845161370890829061370290600790612045565b906146d3565b84600001516001600160a01b03167f520e62b73478b262ede881cd483440f8e7b8a4651b0ff9154aeb3510089ddbac8260405161374791815260200190565b60405180910390a250505050505b61375e816156ff565b90506135bb565b5061376e612a35565b876020013588600001358a7f0ce8712c4dee4bd5a691f0bc1c39594671591e77395f8ebf6a3fb5f63fbea66a8b604001356040516137ae91815260200190565b60405180910390a4505050505050505050565b60006137cd8383612e8f565b6001600160a01b03831660009081526005850160205260408120805492935083929091906137fc9084906156b1565b90915550909392505050565b6001600160a01b03811660009081526004830160209081526040808320546003860190925282206007015461166591906156b1565b6001820154600090808203613856576000915050611668565b600061386360018361587e565b90505b84548110612c3a5760008181526002860160209081526040918290208251808401909352805483526001015490820181905285106138a45750612c3a565b80516138b090856156b1565b9350816000036138c05750612c3a565b50806138cb81615c8f565b915050613866565b6138db6151d4565b6006546040516bffffffffffffffffffffffff19606085901b1660208201524660348201526001600160a01b039091169063a850a909907ffd10bf199d0185af9cce2005e6acc8d19924428058ac3374e16f18c97569b4ee906054016040516020818303038152906040526040518363ffffffff1660e01b8152600401613963929190615ca6565b6040805180830381865afa15801561397f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116689190615ce0565b60006001600160a01b03821615801590611665575082546001600160a01b03838116911614806116655750506001600160a01b03908116600090815260039290920160205260409091205416151590565b60005b82546001600160a01b03838116911614801590613a4157506001600160a01b0382811660009081526003850160205260408082205490921681522060020154600160a01b900460ff165b15613d13576001600160a01b03808316600090815260038501602052604080822054831680835281832054841683529120600101549091168103613bc9576001600160a01b0381811660009081526003860160205260408082205483168252808220600290810154909316808352912090910154909250600160a01b900460ff1615613b2a576001600160a01b0380821660008181526003870160205260408082206002808201805460ff60a01b1990811690915588871685528385208201805482169055825487168552928420018054909216600160a01b1790915591905254169250613d0d565b6001600160a01b038082166000908152600386016020526040902060020154811690841603613b6057809250613b608484614752565b506001600160a01b0380831660009081526003850160205260408082205483168083528183206002808201805460ff60a01b19908116909155825487168652938520018054909316600160a01b1790925591829052549091613bc491869116614905565b613d0d565b6001600160a01b03818116600090815260038601602052604080822054831682528082206001015490921680825291902060020154909250600160a01b900460ff1615613c73576001600160a01b0380821660008181526003870160205260408082206002808201805460ff60a01b1990811690915588871685528385208201805482169055825487168552928420018054909216600160a01b1790915591905254169250613d0d565b6001600160a01b038082166000908152600386016020526040902060010154811690841603613ca957809250613ca98484614905565b506001600160a01b0380831660009081526003850160205260408082205483168083528183206002808201805460ff60a01b19908116909155825487168652938520018054909316600160a01b1790925591829052549091613d0d91869116614752565b506139f7565b505080546001600160a01b03166000908152600390910160205260409020600201805460ff60a01b19169055565b60005b6001600160a01b0382811660009081526003850160205260409020600201541615613d91576001600160a01b03918216600090815260038401602052604090206002015490911690613d44565b50919050565b6001600160a01b03811660009081526020839052604081205490819003613dc057613dc0615940565b61166560018261587e565b81600003613ddb57613ddb615940565b82546001840154818103613e32576040805180820182528581526020808201868152600085815260028a019092529281209151825591516001918201558601805491613e26836156ff565b91905055505050505050565b60006002860181613e4460018561587e565b815260200190815260200160002060010154905080841015613e6857613e68615940565b83811015613eb7576040805180820182528681526020808201878152600086815260028b019092529281209151825591516001918201558701805491613ead836156ff565b9190505550611b08565b84600287016000613ec960018661587e565b815260200190815260200160002060000160008282546124c691906156b1565b60008080613ef8600786612027565b604080516101208101909152908160a081018260048282826020028201915b815481526020019060010190808311613f175750505091835250506004820154602080830191909152600583015460408301526006830154606083015260079283015460ff161515608090920191909152820151919250600090613f7b9088612045565b5490506000829003613f965760008094509450505050612e27565b80600003613fad5785600094509450505050612e27565b6000613fb982846156b1565b613fc38489615af3565b613fcd9190615b0a565b90506000613fdb828961587e565b905060006064828760400151613ff19190615af3565b613ffb9190615b0a565b905061400781846156b1565b614011828461587e565b975097505050505050509250929050565b600061402f600784612027565b90508181600601600082825461404591906156b1565b90915550506040518281526001600160a01b038416907f65da9d8bbc1fc112cfb499f15f17b3bfe4c5070dfca6a3e30f7f5f7f17bd86849060200160405180910390a2505050565b61409c81613702600785612045565b816001600160a01b03167f520e62b73478b262ede881cd483440f8e7b8a4651b0ff9154aeb3510089ddbac82604051610b7f91815260200190565b6001600160a01b0381166140ed576140ed615940565b6140f782826139a3565b61411f57604051634b2990ed60e11b81526001600160a01b0382166004820152602401610ad6565b6001600160a01b0381811660009081526003840160205260408120600101549091829116158061416c57506001600160a01b03838116600090815260038601602052604090206002015416155b156141785750816141e4565b506001600160a01b038083166000908152600385016020526040902060020154165b6001600160a01b03818116600090815260038601602052604090206001015416156141e4576001600160a01b0390811660009081526003850160205260409020600101541661419a565b6001600160a01b0381811660009081526003860160205260409020600101541615614230576001600160a01b038082166000908152600386016020526040902060010154169150614253565b6001600160a01b0380821660009081526003860160205260409020600201541691505b6001600160a01b038082166000908152600386016020526040808220548584168352912080546001600160a01b03191691909216908117909155801561432c576001600160a01b0380821660009081526003870160205260409020600101548116908316036142f4576001600160a01b038181166000908152600387016020526040902060010180546001600160a01b031916918516919091179055614346565b6001600160a01b038181166000908152600387016020526040902060020180546001600160a01b031916918516919091179055614346565b84546001600160a01b0319166001600160a01b0384161785555b6001600160a01b038281166000818152600388016020526040902060020154600160a01b900460ff16159186161461442157614383868487614ab8565b6001600160a01b03858116600090815260038801602052604080822060018082015488861680865284862092830180549288166001600160a01b03199384168117909155865284862080548316821790556002938401805494909301805494909716938216841787559285529284208054909316821790925590549152815460ff60a01b1916600160a01b9182900460ff1615159091021790559193915b8015614431576144318685614bb0565b6001600160a01b0383166000908152600387016020526040812080546001600160a01b0319908116825560018083018054909216909155600290910180546001600160a81b0319169055870180549161448983615c8f565b90915550506001600160a01b0383166000908152600387016020526040812060070154600288018054919290916124c690849061587e565b6000808212156144d3576144d3615940565b5090565b6115f26001820160006151f2565b60006144f46002848418615b0a565b611665908484166156b1565b6001600160a01b03811660009081526006830160205260408120546002840154829161453091612d109190615af3565b6001600160a01b03841660009081526004860160205260408120549192509061455d90612ad89084615718565b9050614571670de0b6b3a764000082615b0a565b95945050505050565b607680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008360010154600014806145e057508354155b61460457835460018501546145f59084615af3565b6145ff9190615b0a565b614606565b815b6001600160a01b03841660009081526006860160205260408120805492935083929091906146359084906156b1565b925050819055508084600101600082825461465091906156b1565b90915550508354829085906000906146699084906156b1565b9091555050600284015461468290612d10908390615af3565b6001600160a01b038416600090815260048601602052604081208054909190612d58908490615792565b604354610100900460ff16612e2e5760405162461bcd60e51b8152600401610ad690615b8f565b806000036146df575050565b8160010154600003614715576003820154604051636130835f60e01b81526001600160a01b039091166004820152602401610ad6565b600182015461472c670de0b6b3a764000083615af3565b6147369190615b0a565b82600201600082825461474991906156b1565b90915550505050565b6001600160a01b038082166000818152600385016020526040808220600281018054915482871680865293852060010154959094526001600160a01b0319909116938516938417905592169080156147d5576001600160a01b038181166000908152600387016020526040902080546001600160a01b0319169186169190911790555b6001600160a01b038381166000908152600387016020526040902080546001600160a01b03191691841691821790556148265784546001600160a01b0319166001600160a01b0384161785556148bb565b6001600160a01b038083166000908152600387016020526040902060010154811690851603614887576001600160a01b038281166000908152600387016020526040902060010180546001600160a01b0319169185169190911790556148bb565b6001600160a01b038281166000908152600387016020526040902060020180546001600160a01b0319169185169190911790555b50506001600160a01b039081166000818152600390940160205260408085206001018054939094166001600160a01b03199384168117909455928452919092208054909216179055565b6001600160a01b038082166000818152600385016020526040808220600181018054915482871680865293852060020154959094526001600160a01b031990911693851693841790559216908015614988576001600160a01b038181166000908152600387016020526040902080546001600160a01b0319169186169190911790555b6001600160a01b038381166000908152600387016020526040902080546001600160a01b03191691841691821790556149d95784546001600160a01b0319166001600160a01b038416178555614a6e565b6001600160a01b038083166000908152600387016020526040902060020154811690851603614a3a576001600160a01b038281166000908152600387016020526040902060020180546001600160a01b031916918516919091179055614a6e565b6001600160a01b038281166000908152600387016020526040902060010180546001600160a01b0319169185169190911790555b50506001600160a01b039081166000818152600390940160205260408085206002018054939094166001600160a01b03199384168117909455928452919092208054909216179055565b6001600160a01b038082166000908152600385016020526040808220548584168352912080546001600160a01b0319169190921690811790915580614b155783546001600160a01b0319166001600160a01b038416178455614baa565b6001600160a01b038082166000908152600386016020526040902060010154811690831603614b76576001600160a01b038181166000908152600386016020526040902060010180546001600160a01b031916918516919091179055614baa565b6001600160a01b038181166000908152600386016020526040902060020180546001600160a01b0319169185169190911790555b50505050565b60005b82546001600160a01b03838116911614801590614bf557506001600160a01b0382166000908152600384016020526040902060020154600160a01b900460ff16155b15615151576001600160a01b0380831660008181526003860160205260408082205484168083529120600101549092169003614ebf576001600160a01b038181166000908152600386016020526040808220600290810154909316808352912090910154909250600160a01b900460ff1615614cdc576001600160a01b0380831660009081526003860160205260408082206002908101805460ff60a01b1990811690915593851683529120018054909116600160a01b179055614cb98482614752565b6001600160a01b0380821660009081526003860160205260409020600201541691505b6001600160a01b0382811660009081526003860160205260408082206001015490921681522060020154600160a01b900460ff16158015614d4f57506001600160a01b038281166000908152600386016020526040808220600290810154909316825290200154600160a01b900460ff16155b15614d8a576001600160a01b03821660009081526003850160205260409020600201805460ff60a01b1916600160a01b17905591508161514b565b6001600160a01b038281166000908152600386016020526040808220600290810154909316825290200154600160a01b900460ff16614e3f576001600160a01b0380831660008181526003870160205260408082206001810154909416825281206002908101805460ff60a01b19908116909155929091529091018054909116600160a01b179055614e1c8483614905565b6001600160a01b0380821660009081526003860160205260409020600201541691505b6001600160a01b0380821660009081526003860160205260408082206002908101805487861685528385208301805460ff600160a01b9384900416151590920260ff60a01b19928316178155825482169092559054909416835291200180549091169055614ead8482614752565b83546001600160a01b0316925061514b565b6001600160a01b0381811660009081526003860160205260408082206001015490921680825291902060020154909250600160a01b900460ff1615614f6f576001600160a01b0380831660009081526003860160205260408082206002908101805460ff60a01b1990811690915593851683529120018054909116600160a01b179055614f4c8482614905565b6001600160a01b0380821660009081526003860160205260409020600101541691505b6001600160a01b038281166000908152600386016020526040808220600290810154909316825290200154600160a01b900460ff16158015614fe257506001600160a01b0382811660009081526003860160205260408082206001015490921681522060020154600160a01b900460ff16155b1561501d576001600160a01b03821660009081526003850160205260409020600201805460ff60a01b1916600160a01b17905591508161514b565b6001600160a01b0382811660009081526003860160205260408082206001015490921681522060020154600160a01b900460ff166150ca576001600160a01b03808316600081815260038701602052604080822060029081018054909516835290822001805460ff60a01b19908116909155919052815416600160a01b1790556150a78483614752565b6001600160a01b0380821660009081526003860160205260409020600101541691505b6001600160a01b038082166000908152600386016020526040808220600290810180548786168552838520808401805460ff600160a01b9485900416151590930260ff60a01b199384161790558254821690925560019091015490941683529120018054909116905561513d8482614905565b83546001600160a01b031692505b50614bb3565b506001600160a01b03166000908152600390910160205260409020600201805460ff60a01b19169055565b60405180608001604052806004906020820280368337509192915050565b82600481019282156151c8579160200282015b828111156151c85782518255916020019190600101906151ad565b506144d3929150615213565b60405180604001604052806002906020820280368337509192915050565b50805460008255600302906000526020600020908101906115f29190615228565b5b808211156144d35760008155600101615214565b5b808211156144d35780546001600160a01b03191681556000600182018190556002820155600301615229565b6020808252825182820181905260009190848201906040850190845b818110156152965783516001600160a01b031683529284019291840191600101615271565b50909695505050505050565b6001600160a01b03811681146115f257600080fd5b8035612578816152a2565b6000602082840312156152d457600080fd5b813561323a816152a2565b6101208101818860005b60048110156153085781518352602092830192909101906001016152e9565b505050608082019690965260a081019490945260c084019290925260e0830152151561010090910152919050565b60008060c0838503121561534957600080fd5b604083018481111561535a57600080fd5b8392508460c08501111561536d57600080fd5b809150509250929050565b60006020828403121561538a57600080fd5b5035919050565b600060608284031215613d9157600080fd5b600080600060a084860312156153b857600080fd5b833592506153c98560208601615391565b9150608084013567ffffffffffffffff8111156153e557600080fd5b6153f186828701615391565b9150509250925092565b6000806040838503121561540e57600080fd5b8235615419816152a2565b946020939093013593505050565b60008083601f84011261543957600080fd5b50813567ffffffffffffffff81111561545157600080fd5b6020830191508360208260051b8501011115612e2757600080fd5b6000806020838503121561547f57600080fd5b823567ffffffffffffffff81111561549657600080fd5b6154a285828601615427565b90969095509350505050565b600080604083850312156154c157600080fd5b82356154cc816152a2565b9150602083013561536d816152a2565b6000806000606084860312156154f157600080fd5b8335925060208401359150604084013561550a816152a2565b809150509250925092565b80151581146115f257600080fd5b6000806040838503121561553657600080fd5b8235615541816152a2565b9150602083013561536d81615515565b600080600080600085870360e081121561556a57600080fd5b608081121561557857600080fd5b50859450608086013567ffffffffffffffff8082111561559757600080fd5b818801915088601f8301126155ab57600080fd5b8135818111156155ba57600080fd5b8960208260081b85010111156155cf57600080fd5b6020830196508095505050506155e760a087016152b7565b91506155f560c087016152b7565b90509295509295909350565b6000806000806000806000610100888a03121561561d57600080fd5b87359650602088013595506040880135945061563c8960608a01615391565b935060c088013567ffffffffffffffff8082111561565957600080fd5b6156658b838c01615391565b945060e08a013591508082111561567b57600080fd5b506156888a828b01615427565b989b979a50959850939692959293505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156116685761166861569b565b60808181019083833792915050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000600182016157115761571161569b565b5060010190565b8082018281126000831280158216821582161715612c3a57612c3a61569b565b60408152600061575f604083016007815266756e7374616b6560c81b602082015260400190565b828103602084015261323a816014815273494e53554646494349454e545f42414c414e434560601b602082015260400190565b8181036000831280158383131683831282161715611f7b57611f7b61569b565b6040815260006157d9604083016007815266756e7374616b6560c81b602082015260400190565b828103602084015261323a81600d81526c5354414b455f544f4f5f4c4f5760981b602082015260400190565b80820260008212600160ff1b841416156158215761582161569b565b81810583148215176116685761166861569b565b6040815260056040820152647374616b6560d81b606082015260806020820152600061166860808301600d81526c5354414b455f544f4f5f4c4f5760981b602082015260400190565b818103818111156116685761166861569b565b634e487b7160e01b600052601260045260246000fd5b6000826158b6576158b6615891565b500690565b60408152600061575f60408301600a815269756e64656c656761746560b01b602082015260400190565b60408152600061590f60408301600a815269756e64656c656761746560b01b602082015260400190565b828103602084015261323a81601281527144454c45474154494f4e5f544f4f5f4c4f5760701b602082015260400190565b634e487b7160e01b600052600160045260246000fd5b60408152600860408201526764656c656761746560c01b606082015260806020820152600061166860808301601281527144454c45474154494f4e5f544f4f5f4c4f5760701b602082015260400190565b6020808252600e908201526d0929cac82989288be988a9c8ea8960931b604082015260600190565b6000823560de198336030181126159e557600080fd5b9190910192915050565b6000808335601e19843603018112615a0657600080fd5b83018035915067ffffffffffffffff821115615a2157600080fd5b602001915036819003821315612e2757600080fd5b61010081016040858337608084604084013760c082018360005b6002811015615a6f578151835260209283019290910190600101615a50565b505050949350505050565b60008060408385031215615a8d57600080fd5b8251615a9881615515565b602084015190925061536d81615515565b6000808335601e19843603018112615ac057600080fd5b83018035915067ffffffffffffffff821115615adb57600080fd5b6020019150600681901b3603821315612e2757600080fd5b80820281158282048414176116685761166861569b565b600082615b1957615b19615891565b500490565b6040805190810167ffffffffffffffff81118282101715615b4f57634e487b7160e01b600052604160045260246000fd5b60405290565b600060408284031215615b6757600080fd5b615b6f615b1e565b8235615b7a816152a2565b81526020928301359281019290925250919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b858152606060208201526000615c1d606083018688615bda565b8281036040840152615c30818587615bda565b98975050505050505050565b60005b83811015615c57578181015183820152602001615c3f565b50506000910152565b600082516159e5818460208701615c3c565b600060208284031215615c8457600080fd5b815161323a81615515565b600081615c9e57615c9e61569b565b506000190190565b8281526040602082015260008251806040840152615ccb816060850160208701615c3c565b601f01601f1916919091016060019392505050565b600060408284031215615cf257600080fd5b82601f830112615d0157600080fd5b615d09615b1e565b806040840185811115615d1b57600080fd5b845b81811015615d35578051845260209384019301615d1d565b50909594505050505056fea264697066735822122092094018521e25da5faeab4a5ecf1d1635ccb2873dcf69bf47bd031dde1f06de64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var L2StateSenderArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"L2StateSender\",\n \"sourceName\": \"contracts/child/L2StateSender.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"L2StateSynced\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_LENGTH\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"counter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"syncState\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea26469706673582212206c9f53de0e976a5c12cb55444261aa26f481bc4f848ce52bf634c5ac75c6fef364736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fedaf3c471ebd67d60c29efe34b639ede7d6a1d92eaeb3f503e784971e67118a5858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea26469706673582212206c9f53de0e976a5c12cb55444261aa26f481bc4f848ce52bf634c5ac75c6fef364736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var StateReceiverArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"StateReceiver\",\n \"sourceName\": \"contracts/child/StateReceiver.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"only\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"NewCommitment\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"counter\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bool\",\n \"name\": \"status\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"message\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"StateSyncResult\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[][]\",\n \"name\": \"proofs\",\n \"type\": \"bytes32[][]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSync[]\",\n \"name\": \"objs\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"batchExecute\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSyncCommitment\",\n \"name\": \"commitment\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"signature\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"bitmap\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"commit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"commitmentCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"commitmentIds\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"commitments\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSync\",\n \"name\": \"obj\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"execute\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getCommitmentByStateSyncId\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"startId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"root\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct StateReceiver.StateSyncCommitment\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getRootByStateSyncId\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"lastCommittedId\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"processedStateSyncs\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50611450806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80639017c12711610097578063c59a18f711610066578063c59a18f71461022d578063c6df461714610240578063e0563ab114610253578063eb70ef441461025c57600080fd5b80639017c127146101fe578063947287cf1461021157806397e5230d1461021a578063ad240c2a1461022457600080fd5b806349ce8997116100d357806349ce89971461015e57806350d5b95b146101a857806351351d53146101bd578063544c5e0f146101cb57600080fd5b8063196f1b2d1461010557806323e281cf1461012b578063284017f5146101345780633b878c2214610155575b600080fd5b610118610113366004610ea8565b610291565b6040519081526020015b60405180910390f35b61011860325481565b61013d61202081565b6040516001600160a01b039091168152602001610122565b61013d61101081565b61018d61016c366004610ea8565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610122565b6101bb6101b6366004610f0d565b610310565b005b61013d6002600160a01b0381565b6101ee6101d9366004610ea8565b60346020526000908152604090205460ff1681565b6040519015158152602001610122565b6101bb61020c366004610f7d565b6103d7565b61011861520881565b610118620249f081565b61011860335481565b61011861023b366004610ea8565b610577565b6101bb61024e36600461102b565b610598565b61013d61203081565b61026f61026a366004610ea8565b61077c565b6040805182518152602080840151908201529181015190820152606001610122565b6000806035816102a260368661083f565b815260208101919091526040016000206002015490508061030a5760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061031c823561077c565b805190915061038c906103309084356110ca565b8251602084015161034191906110ca565b61034c9060016110dd565b83604001518787876040516020016103649190611135565b604051602081830303815290604052805190602001206108ec9095949392919063ffffffff16565b6103c85760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610301565b6103d182610a88565b50505050565b8281811461043a5760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610301565b60005b8181101561056f57600061047485858481811061045c5761045c6111d2565b905060200281019061046e91906111e8565b3561077c565b905060006105288260000151878786818110610492576104926111d2565b90506020028101906104a491906111e8565b6104af9190356110ca565b835160208501516104c091906110ca565b6104cb9060016110dd565b84604001518b8b888181106104e2576104e26111d2565b90506020028101906104f49190611208565b8b8b8a818110610506576105066111d2565b905060200281019061051891906111e8565b6040516020016103649190611135565b90508061053957505060010161043d565b61056586868581811061054e5761054e6111d2565b905060200281019061056091906111e8565b610a88565b505060010161043d565b505050505050565b6036818154811061058757600080fd5b600091825260209091200154905081565b336002600160a01b03146105dc5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610301565b6033546105ea9060016110dd565b85351461062c5760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610301565b8435602086013510156106725760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610301565b604080518635602080830191909152870135818301529086013560608201526106b7906080016040516020818303038152906040528051906020012085858585610ca3565b603280548691603591600091826106cd83611252565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b60408051606081018252600080825260208201819052918101829052906107a460368461083f565b60365490915081036108045760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610301565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b815460009081036108525750600061030a565b82546000905b8082101561089f57600061086c8383610da7565b6000878152602090209091508590820154111561088b57809150610899565b6108968160016110dd565b92505b50610858565b6000821180156108cb5750836108c8866108ba6001866110ca565b600091825260209091200190565b54145b156108e4576108db6001836110ca565b9250505061030a565b509392505050565b6000816108fa866001610dc9565b811461093f5760405162461bcd60e51b81526020600482015260146024820152730929cac82989288bea0a49e9e8cbe988a9c8ea8960631b6044820152606401610301565b8587106109835760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610301565b876109bf5760405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa622a0a360a11b6044820152606401610301565b8760005b82811015610a795760008686838181106109df576109df6111d2565b90506020020135905060028a6109f59190611281565b600003610a2d576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610a5a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b610a6560028b611295565b99505080610a7290611252565b90506109c3565b50909414979650505050505050565b803560009081526034602052604090205460ff1615610af85760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610301565b610b0860608201604083016112a9565b6001600160a01b03163b600003610b5c576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610b8a90606085019085016112a9565b6001600160a01b03168335610ba560408601602087016112a9565b610bb260608701876112c4565b604051602401610bc5949392919061130b565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610bfa9190611364565b6000604051808303816000865af19150503d8060008114610c37576040519150601f19603f3d011682016040523d82523d6000602084013e610c3c565b606091505b509150915081610c5f5782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610c969190611376565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610ccf9594939291906113a9565b60408051601f1981840301815290829052610ce991611364565b6000604051808303818686fa925050503d8060008114610d25576040519150601f19603f3d011682016040523d82523d6000602084013e610d2a565b606091505b5091509150600081806020019051810190610d4591906113e2565b9050828015610d515750805b610d9d5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610301565b5050505050505050565b6000610db66002848418611295565b610dc2908484166110dd565b9392505050565b600080610dd584610e14565b90506001836002811115610deb57610deb611404565b148015610dfb575083816001901b105b610e06576000610e09565b60015b60ff16019392505050565b600080608083901c15610e2957608092831c92015b604083901c15610e3b57604092831c92015b602083901c15610e4d57602092831c92015b601083901c15610e5f57601092831c92015b600883901c15610e7157600892831c92015b600483901c15610e8357600492831c92015b600283901c15610e9557600292831c92015b600183901c1561030a5760010192915050565b600060208284031215610eba57600080fd5b5035919050565b60008083601f840112610ed357600080fd5b50813567ffffffffffffffff811115610eeb57600080fd5b6020830191508360208260051b8501011115610f0657600080fd5b9250929050565b600080600060408486031215610f2257600080fd5b833567ffffffffffffffff80821115610f3a57600080fd5b610f4687838801610ec1565b90955093506020860135915080821115610f5f57600080fd5b50840160808187031215610f7257600080fd5b809150509250925092565b60008060008060408587031215610f9357600080fd5b843567ffffffffffffffff80821115610fab57600080fd5b610fb788838901610ec1565b90965094506020870135915080821115610fd057600080fd5b50610fdd87828801610ec1565b95989497509550505050565b60008083601f840112610ffb57600080fd5b50813567ffffffffffffffff81111561101357600080fd5b602083019150836020828501011115610f0657600080fd5b600080600080600085870360a081121561104457600080fd5b606081121561105257600080fd5b50859450606086013567ffffffffffffffff8082111561107157600080fd5b61107d89838a01610fe9565b9096509450608088013591508082111561109657600080fd5b506110a388828901610fe9565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561030a5761030a6110b4565b8082018082111561030a5761030a6110b4565b80356001600160a01b038116811461110757600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815281356020820152600061114e602084016110f0565b60018060a01b0380821660408501528061116a604087016110f0565b16606085015250506060830135601e1984360301811261118957600080fd5b830160208101903567ffffffffffffffff8111156111a657600080fd5b8036038213156111b557600080fd5b6080808501526111c960a08501828461110c565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126111fe57600080fd5b9190910192915050565b6000808335601e1984360301811261121f57600080fd5b83018035915067ffffffffffffffff82111561123a57600080fd5b6020019150600581901b3603821315610f0657600080fd5b600060018201611264576112646110b4565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826112905761129061126b565b500690565b6000826112a4576112a461126b565b500490565b6000602082840312156112bb57600080fd5b610dc2826110f0565b6000808335601e198436030181126112db57600080fd5b83018035915067ffffffffffffffff8211156112f657600080fd5b602001915036819003821315610f0657600080fd5b8481526001600160a01b0384166020820152606060408201819052600090611336908301848661110c565b9695505050505050565b60005b8381101561135b578181015183820152602001611343565b50506000910152565b600082516111fe818460208701611340565b6020815260008251806020840152611395816040850160208701611340565b601f01601f19169190910160400192915050565b8581526060602082015260006113c360608301868861110c565b82810360408401526113d681858761110c565b98975050505050505050565b6000602082840312156113f457600080fd5b81518015158114610dc257600080fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212204c6b96b5a43522a7a0c736d0473bd24754e04edd924ae7d3dd009308a29d4e9064736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101005760003560e01c80639017c12711610097578063c59a18f711610066578063c59a18f71461022d578063c6df461714610240578063e0563ab114610253578063eb70ef441461025c57600080fd5b80639017c127146101fe578063947287cf1461021157806397e5230d1461021a578063ad240c2a1461022457600080fd5b806349ce8997116100d357806349ce89971461015e57806350d5b95b146101a857806351351d53146101bd578063544c5e0f146101cb57600080fd5b8063196f1b2d1461010557806323e281cf1461012b578063284017f5146101345780633b878c2214610155575b600080fd5b610118610113366004610ea8565b610291565b6040519081526020015b60405180910390f35b61011860325481565b61013d61202081565b6040516001600160a01b039091168152602001610122565b61013d61101081565b61018d61016c366004610ea8565b60356020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610122565b6101bb6101b6366004610f0d565b610310565b005b61013d6002600160a01b0381565b6101ee6101d9366004610ea8565b60346020526000908152604090205460ff1681565b6040519015158152602001610122565b6101bb61020c366004610f7d565b6103d7565b61011861520881565b610118620249f081565b61011860335481565b61011861023b366004610ea8565b610577565b6101bb61024e36600461102b565b610598565b61013d61203081565b61026f61026a366004610ea8565b61077c565b6040805182518152602080840151908201529181015190820152606001610122565b6000806035816102a260368661083f565b815260208101919091526040016000206002015490508061030a5760405162461bcd60e51b815260206004820152601d60248201527f537461746552656365697665723a204e4f5f524f4f545f464f525f494400000060448201526064015b60405180910390fd5b92915050565b600061031c823561077c565b805190915061038c906103309084356110ca565b8251602084015161034191906110ca565b61034c9060016110dd565b83604001518787876040516020016103649190611135565b604051602081830303815290604052805190602001206108ec9095949392919063ffffffff16565b6103c85760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa82927a7a360991b6044820152606401610301565b6103d182610a88565b50505050565b8281811461043a5760405162461bcd60e51b815260206004820152602a60248201527f537461746552656365697665723a20554e4d4154434845445f4c454e4754485f604482015269504152414d455445525360b01b6064820152608401610301565b60005b8181101561056f57600061047485858481811061045c5761045c6111d2565b905060200281019061046e91906111e8565b3561077c565b905060006105288260000151878786818110610492576104926111d2565b90506020028101906104a491906111e8565b6104af9190356110ca565b835160208501516104c091906110ca565b6104cb9060016110dd565b84604001518b8b888181106104e2576104e26111d2565b90506020028101906104f49190611208565b8b8b8a818110610506576105066111d2565b905060200281019061051891906111e8565b6040516020016103649190611135565b90508061053957505060010161043d565b61056586868581811061054e5761054e6111d2565b905060200281019061056091906111e8565b610a88565b505060010161043d565b505050505050565b6036818154811061058757600080fd5b600091825260209091200154905081565b336002600160a01b03146105dc5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b6044820152606401610301565b6033546105ea9060016110dd565b85351461062c5760405162461bcd60e51b815260206004820152601060248201526f1253959053125117d4d510549517d25160821b6044820152606401610301565b8435602086013510156106725760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d1539117d25160921b6044820152606401610301565b604080518635602080830191909152870135818301529086013560608201526106b7906080016040516020818303038152906040528051906020012085858585610ca3565b603280548691603591600091826106cd83611252565b90915550815260208082019290925260409081016000208335815591830135600183015582013560028201555050603680546001810182556000919091526020868101357f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b89092018290556033829055604080519088013581528735917f11efd893530b26afc66d488ff54cb15df117cb6e0e4a08c6dcb166d766c3bf3b910160405180910390a35050505050565b60408051606081018252600080825260208201819052918101829052906107a460368461083f565b60365490915081036108045760405162461bcd60e51b815260206004820152602360248201527f537461746552656365697665723a204e4f5f434f4d4d49544d454e545f464f5260448201526217d25160ea1b6064820152608401610301565b600090815260356020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b815460009081036108525750600061030a565b82546000905b8082101561089f57600061086c8383610da7565b6000878152602090209091508590820154111561088b57809150610899565b6108968160016110dd565b92505b50610858565b6000821180156108cb5750836108c8866108ba6001866110ca565b600091825260209091200190565b54145b156108e4576108db6001836110ca565b9250505061030a565b509392505050565b6000816108fa866001610dc9565b811461093f5760405162461bcd60e51b81526020600482015260146024820152730929cac82989288bea0a49e9e8cbe988a9c8ea8960631b6044820152606401610301565b8587106109835760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610301565b876109bf5760405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa622a0a360a11b6044820152606401610301565b8760005b82811015610a795760008686838181106109df576109df6111d2565b90506020020135905060028a6109f59190611281565b600003610a2d576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610a5a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b610a6560028b611295565b99505080610a7290611252565b90506109c3565b50909414979650505050505050565b803560009081526034602052604090205460ff1615610af85760405162461bcd60e51b815260206004820152602660248201527f537461746552656365697665723a2053544154455f53594e435f49535f50524f60448201526510d154d4d15160d21b6064820152608401610301565b610b0860608201604083016112a9565b6001600160a01b03163b600003610b5c576040805160208082526000908201819052918335917f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae910160405180910390a350565b8035600090815260346020526040808220805460ff191660011790558190610b8a90606085019085016112a9565b6001600160a01b03168335610ba560408601602087016112a9565b610bb260608701876112c4565b604051602401610bc5949392919061130b565b60408051601f198184030181529181526020820180516001600160e01b031663eeb4994560e01b17905251610bfa9190611364565b6000604051808303816000865af19150503d8060008114610c37576040519150601f19603f3d011682016040523d82523d6000602084013e610c3c565b606091505b509150915081610c5f5782356000908152603460205260409020805460ff191690555b81151583600001357f31c652130602f3ce96ceaf8a4c2b8b49f049166c6fcf2eb31943a75ec7c936ae83604051610c969190611376565b60405180910390a3505050565b6000806120306001600160a01b0316620249f08888888888604051602001610ccf9594939291906113a9565b60408051601f1981840301815290829052610ce991611364565b6000604051808303818686fa925050503d8060008114610d25576040519150601f19603f3d011682016040523d82523d6000602084013e610d2a565b606091505b5091509150600081806020019051810190610d4591906113e2565b9050828015610d515750805b610d9d5760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610301565b5050505050505050565b6000610db66002848418611295565b610dc2908484166110dd565b9392505050565b600080610dd584610e14565b90506001836002811115610deb57610deb611404565b148015610dfb575083816001901b105b610e06576000610e09565b60015b60ff16019392505050565b600080608083901c15610e2957608092831c92015b604083901c15610e3b57604092831c92015b602083901c15610e4d57602092831c92015b601083901c15610e5f57601092831c92015b600883901c15610e7157600892831c92015b600483901c15610e8357600492831c92015b600283901c15610e9557600292831c92015b600183901c1561030a5760010192915050565b600060208284031215610eba57600080fd5b5035919050565b60008083601f840112610ed357600080fd5b50813567ffffffffffffffff811115610eeb57600080fd5b6020830191508360208260051b8501011115610f0657600080fd5b9250929050565b600080600060408486031215610f2257600080fd5b833567ffffffffffffffff80821115610f3a57600080fd5b610f4687838801610ec1565b90955093506020860135915080821115610f5f57600080fd5b50840160808187031215610f7257600080fd5b809150509250925092565b60008060008060408587031215610f9357600080fd5b843567ffffffffffffffff80821115610fab57600080fd5b610fb788838901610ec1565b90965094506020870135915080821115610fd057600080fd5b50610fdd87828801610ec1565b95989497509550505050565b60008083601f840112610ffb57600080fd5b50813567ffffffffffffffff81111561101357600080fd5b602083019150836020828501011115610f0657600080fd5b600080600080600085870360a081121561104457600080fd5b606081121561105257600080fd5b50859450606086013567ffffffffffffffff8082111561107157600080fd5b61107d89838a01610fe9565b9096509450608088013591508082111561109657600080fd5b506110a388828901610fe9565b969995985093965092949392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561030a5761030a6110b4565b8082018082111561030a5761030a6110b4565b80356001600160a01b038116811461110757600080fd5b919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815281356020820152600061114e602084016110f0565b60018060a01b0380821660408501528061116a604087016110f0565b16606085015250506060830135601e1984360301811261118957600080fd5b830160208101903567ffffffffffffffff8111156111a657600080fd5b8036038213156111b557600080fd5b6080808501526111c960a08501828461110c565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126111fe57600080fd5b9190910192915050565b6000808335601e1984360301811261121f57600080fd5b83018035915067ffffffffffffffff82111561123a57600080fd5b6020019150600581901b3603821315610f0657600080fd5b600060018201611264576112646110b4565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826112905761129061126b565b500690565b6000826112a4576112a461126b565b500490565b6000602082840312156112bb57600080fd5b610dc2826110f0565b6000808335601e198436030181126112db57600080fd5b83018035915067ffffffffffffffff8211156112f657600080fd5b602001915036819003821315610f0657600080fd5b8481526001600160a01b0384166020820152606060408201819052600090611336908301848661110c565b9695505050505050565b60005b8381101561135b578181015183820152602001611343565b50506000910152565b600082516111fe818460208701611340565b6020815260008251806020840152611395816040850160208701611340565b601f01601f19169190910160400192915050565b8581526060602082015260006113c360608301868861110c565b82810360408401526113d681858761110c565b98975050505050505050565b6000602082840312156113f457600080fd5b81518015158114610dc257600080fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212204c6b96b5a43522a7a0c736d0473bd24754e04edd924ae7d3dd009308a29d4e9064736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var NativeERC20Artifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"NativeERC20\",\n \"sourceName\": \"contracts/child/NativeERC20.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"only\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burn\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subtractedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"decreaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"addedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"increaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"predicate_\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"rootToken_\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"symbol_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint8\",\n \"name\": \"decimals_\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mint\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"predicate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"rootToken\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b506111de806100206000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b85780639dc29fac1161007c5780639dc29fac14610278578063a457c2d71461028b578063a9059cbb1461029e578063dd62ed3e146102b1578063e0563ab1146102c4578063e6198705146102cd57600080fd5b806370a082311461022d5780638420ce9914610248578063947287cf1461025d57806395d89b411461026657806397e5230d1461026e57600080fd5b8063284017f51161010a578063284017f5146101d2578063313ce567146101db57806339509351146101f05780633b878c221461020357806340c10f191461020c57806351351d531461021f57600080fd5b806306fdde0314610147578063095ea7b31461016557806318160ddd146101885780631f2d00651461019a57806323b872dd146101bf575b600080fd5b61014f6102de565b60405161015c9190610d5c565b60405180910390f35b610178610173366004610dab565b610370565b604051901515815260200161015c565b6034545b60405190815260200161015c565b6036546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b6101786101cd366004610dd5565b61038a565b6101a761202081565b60395460405160ff909116815260200161015c565b6101786101fe366004610dab565b6103ae565b6101a761101081565b61017861021a366004610dab565b6103d0565b6101a76002600160a01b0381565b61018c61023b366004610e11565b6001600160a01b03163190565b61025b610256366004610e7c565b610419565b005b61018c61520881565b61014f6105c8565b61018c620249f081565b610178610286366004610dab565b6105d7565b610178610299366004610dab565b61060e565b6101786102ac366004610dab565b610689565b61018c6102bf366004610f27565b610697565b6101a761203081565b6035546001600160a01b03166101a7565b6060603780546102ed90610f5a565b80601f016020809104026020016040519081016040528092919081815260200182805461031990610f5a565b80156103665780601f1061033b57610100808354040283529160200191610366565b820191906000526020600020905b81548152906001019060200180831161034957829003601f168201915b5050505050905090565b60003361037e8185856106c2565b60019150505b92915050565b6000336103988582856107e6565b6103a3858585610860565b506001949350505050565b60003361037e8185856103c18383610697565b6103cb9190610faa565b6106c2565b6035546000906001600160a01b031633146104065760405162461bcd60e51b81526004016103fd90610fbd565b60405180910390fd5b6104108383610a43565b50600192915050565b600054610100900460ff16158080156104395750600054600160ff909116105b806104535750303b158015610453575060005460ff166001145b6104b65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103fd565b6000805460ff1916600117905580156104d9576000805461ff0019166101001790555b336002600160a01b031461051d5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016103fd565b603580546001600160a01b03808b166001600160a01b03199283161790925560368054928a1692909116919091179055603761055a868883611066565b506038610568848683611066565b506039805460ff191660ff841617905580156105be576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6060603880546102ed90610f5a565b6035546000906001600160a01b031633146106045760405162461bcd60e51b81526004016103fd90610fbd565b6104108383610bbf565b6000338161061c8286610697565b90508381101561067c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103fd565b6103a382868684036106c2565b60003361037e818585610860565b6001600160a01b03918216600090815260336020908152604080832093909416825291909152205490565b6001600160a01b0383166107245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103fd565b6001600160a01b0382166107855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103fd565b6001600160a01b0383811660008181526033602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006107f28484610697565b9050600019811461085a578181101561084d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103fd565b61085a84848484036106c2565b50505050565b6001600160a01b0383166108c45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103fd565b6001600160a01b0382166109265760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103fd565b604080516001600160a01b0385811660208301528416918101919091526060810182905260009081906120209060800160408051601f198184030181529082905261097091611127565b6000604051808303816000865af19150503d80600081146109ad576040519150601f19603f3d011682016040523d82523d6000602084013e6109b2565b606091505b50915091508180156109d35750808060200190518101906109d39190611143565b6109ef5760405162461bcd60e51b81526004016103fd90611165565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a3491815260200190565b60405180910390a35050505050565b6001600160a01b038216610a995760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103fd565b8060346000828254610aab9190610faa565b9091555050604080516000602082018190526001600160a01b038516928201929092526060810183905281906120209060800160408051601f1981840301815290829052610af891611127565b6000604051808303816000865af19150503d8060008114610b35576040519150601f19603f3d011682016040523d82523d6000602084013e610b3a565b606091505b5091509150818015610b5b575080806020019051810190610b5b9190611143565b610b775760405162461bcd60e51b81526004016103fd90611165565b6040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b6001600160a01b038216610c1f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103fd565b8060346000828254610c319190611195565b9091555050604080516001600160a01b038416602082015260009181018290526060810183905281906120209060800160408051601f1981840301815290829052610c7b91611127565b6000604051808303816000865af19150503d8060008114610cb8576040519150601f19603f3d011682016040523d82523d6000602084013e610cbd565b606091505b5091509150818015610cde575080806020019051810190610cde9190611143565b610cfa5760405162461bcd60e51b81526004016103fd90611165565b6040518381526000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610bb1565b60005b83811015610d53578181015183820152602001610d3b565b50506000910152565b6020815260008251806020840152610d7b816040850160208701610d38565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610da657600080fd5b919050565b60008060408385031215610dbe57600080fd5b610dc783610d8f565b946020939093013593505050565b600080600060608486031215610dea57600080fd5b610df384610d8f565b9250610e0160208501610d8f565b9150604084013590509250925092565b600060208284031215610e2357600080fd5b610e2c82610d8f565b9392505050565b60008083601f840112610e4557600080fd5b50813567ffffffffffffffff811115610e5d57600080fd5b602083019150836020828501011115610e7557600080fd5b9250929050565b600080600080600080600060a0888a031215610e9757600080fd5b610ea088610d8f565b9650610eae60208901610d8f565b9550604088013567ffffffffffffffff80821115610ecb57600080fd5b610ed78b838c01610e33565b909750955060608a0135915080821115610ef057600080fd5b50610efd8a828b01610e33565b909450925050608088013560ff81168114610f1757600080fd5b8091505092959891949750929550565b60008060408385031215610f3a57600080fd5b610f4383610d8f565b9150610f5160208401610d8f565b90509250929050565b600181811c90821680610f6e57607f821691505b602082108103610f8e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561038457610384610f94565b60208082526024908201527f4e617469766545524332303a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561106157600081815260208120601f850160051c8101602086101561103e5750805b601f850160051c820191505b8181101561105d5782815560010161104a565b5050505b505050565b67ffffffffffffffff83111561107e5761107e611001565b6110928361108c8354610f5a565b83611017565b6000601f8411600181146110c657600085156110ae5750838201355b600019600387901b1c1916600186901b178355611120565b600083815260209020601f19861690835b828110156110f757868501358255602094850194600190920191016110d7565b50868210156111145760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008251611139818460208701610d38565b9190910192915050565b60006020828403121561115557600080fd5b81518015158114610e2c57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561038457610384610f9456fea2646970667358221220077e347c2fb9c035098996a8152ddb372f8aa33227e1e816d003b607eeedce6564736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b85780639dc29fac1161007c5780639dc29fac14610278578063a457c2d71461028b578063a9059cbb1461029e578063dd62ed3e146102b1578063e0563ab1146102c4578063e6198705146102cd57600080fd5b806370a082311461022d5780638420ce9914610248578063947287cf1461025d57806395d89b411461026657806397e5230d1461026e57600080fd5b8063284017f51161010a578063284017f5146101d2578063313ce567146101db57806339509351146101f05780633b878c221461020357806340c10f191461020c57806351351d531461021f57600080fd5b806306fdde0314610147578063095ea7b31461016557806318160ddd146101885780631f2d00651461019a57806323b872dd146101bf575b600080fd5b61014f6102de565b60405161015c9190610d5c565b60405180910390f35b610178610173366004610dab565b610370565b604051901515815260200161015c565b6034545b60405190815260200161015c565b6036546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b6101786101cd366004610dd5565b61038a565b6101a761202081565b60395460405160ff909116815260200161015c565b6101786101fe366004610dab565b6103ae565b6101a761101081565b61017861021a366004610dab565b6103d0565b6101a76002600160a01b0381565b61018c61023b366004610e11565b6001600160a01b03163190565b61025b610256366004610e7c565b610419565b005b61018c61520881565b61014f6105c8565b61018c620249f081565b610178610286366004610dab565b6105d7565b610178610299366004610dab565b61060e565b6101786102ac366004610dab565b610689565b61018c6102bf366004610f27565b610697565b6101a761203081565b6035546001600160a01b03166101a7565b6060603780546102ed90610f5a565b80601f016020809104026020016040519081016040528092919081815260200182805461031990610f5a565b80156103665780601f1061033b57610100808354040283529160200191610366565b820191906000526020600020905b81548152906001019060200180831161034957829003601f168201915b5050505050905090565b60003361037e8185856106c2565b60019150505b92915050565b6000336103988582856107e6565b6103a3858585610860565b506001949350505050565b60003361037e8185856103c18383610697565b6103cb9190610faa565b6106c2565b6035546000906001600160a01b031633146104065760405162461bcd60e51b81526004016103fd90610fbd565b60405180910390fd5b6104108383610a43565b50600192915050565b600054610100900460ff16158080156104395750600054600160ff909116105b806104535750303b158015610453575060005460ff166001145b6104b65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103fd565b6000805460ff1916600117905580156104d9576000805461ff0019166101001790555b336002600160a01b031461051d5760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064016103fd565b603580546001600160a01b03808b166001600160a01b03199283161790925560368054928a1692909116919091179055603761055a868883611066565b506038610568848683611066565b506039805460ff191660ff841617905580156105be576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6060603880546102ed90610f5a565b6035546000906001600160a01b031633146106045760405162461bcd60e51b81526004016103fd90610fbd565b6104108383610bbf565b6000338161061c8286610697565b90508381101561067c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103fd565b6103a382868684036106c2565b60003361037e818585610860565b6001600160a01b03918216600090815260336020908152604080832093909416825291909152205490565b6001600160a01b0383166107245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103fd565b6001600160a01b0382166107855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103fd565b6001600160a01b0383811660008181526033602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006107f28484610697565b9050600019811461085a578181101561084d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103fd565b61085a84848484036106c2565b50505050565b6001600160a01b0383166108c45760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103fd565b6001600160a01b0382166109265760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103fd565b604080516001600160a01b0385811660208301528416918101919091526060810182905260009081906120209060800160408051601f198184030181529082905261097091611127565b6000604051808303816000865af19150503d80600081146109ad576040519150601f19603f3d011682016040523d82523d6000602084013e6109b2565b606091505b50915091508180156109d35750808060200190518101906109d39190611143565b6109ef5760405162461bcd60e51b81526004016103fd90611165565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a3491815260200190565b60405180910390a35050505050565b6001600160a01b038216610a995760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103fd565b8060346000828254610aab9190610faa565b9091555050604080516000602082018190526001600160a01b038516928201929092526060810183905281906120209060800160408051601f1981840301815290829052610af891611127565b6000604051808303816000865af19150503d8060008114610b35576040519150601f19603f3d011682016040523d82523d6000602084013e610b3a565b606091505b5091509150818015610b5b575080806020019051810190610b5b9190611143565b610b775760405162461bcd60e51b81526004016103fd90611165565b6040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b6001600160a01b038216610c1f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016103fd565b8060346000828254610c319190611195565b9091555050604080516001600160a01b038416602082015260009181018290526060810183905281906120209060800160408051601f1981840301815290829052610c7b91611127565b6000604051808303816000865af19150503d8060008114610cb8576040519150601f19603f3d011682016040523d82523d6000602084013e610cbd565b606091505b5091509150818015610cde575080806020019051810190610cde9190611143565b610cfa5760405162461bcd60e51b81526004016103fd90611165565b6040518381526000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610bb1565b60005b83811015610d53578181015183820152602001610d3b565b50506000910152565b6020815260008251806020840152610d7b816040850160208701610d38565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114610da657600080fd5b919050565b60008060408385031215610dbe57600080fd5b610dc783610d8f565b946020939093013593505050565b600080600060608486031215610dea57600080fd5b610df384610d8f565b9250610e0160208501610d8f565b9150604084013590509250925092565b600060208284031215610e2357600080fd5b610e2c82610d8f565b9392505050565b60008083601f840112610e4557600080fd5b50813567ffffffffffffffff811115610e5d57600080fd5b602083019150836020828501011115610e7557600080fd5b9250929050565b600080600080600080600060a0888a031215610e9757600080fd5b610ea088610d8f565b9650610eae60208901610d8f565b9550604088013567ffffffffffffffff80821115610ecb57600080fd5b610ed78b838c01610e33565b909750955060608a0135915080821115610ef057600080fd5b50610efd8a828b01610e33565b909450925050608088013560ff81168114610f1757600080fd5b8091505092959891949750929550565b60008060408385031215610f3a57600080fd5b610f4383610d8f565b9150610f5160208401610d8f565b90509250929050565b600181811c90821680610f6e57607f821691505b602082108103610f8e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561038457610384610f94565b60208082526024908201527f4e617469766545524332303a204f6e6c79207072656469636174652063616e2060408201526318d85b1b60e21b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f82111561106157600081815260208120601f850160051c8101602086101561103e5750805b601f850160051c820191505b8181101561105d5782815560010161104a565b5050505b505050565b67ffffffffffffffff83111561107e5761107e611001565b6110928361108c8354610f5a565b83611017565b6000601f8411600181146110c657600085156110ae5750838201355b600019600387901b1c1916600186901b178355611120565b600083815260209020601f19861690835b828110156110f757868501358255602094850194600190920191016110d7565b50868210156111145760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008251611139818460208701610d38565b9190910192915050565b60006020828403121561115557600080fd5b81518015158114610e2c57600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561038457610384610f9456fea2646970667358221220077e347c2fb9c035098996a8152ddb372f8aa33227e1e816d003b607eeedce6564736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var ChildERC20Artifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ChildERC20\",\n \"sourceName\": \"contracts/child/ChildERC20.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"userAddress\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"relayerAddress\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"functionSignature\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"MetaTransactionExecuted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burn\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subtractedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"decreaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"userAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"functionSignature\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"sigR\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"sigS\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint8\",\n \"name\": \"sigV\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"executeMetaTransaction\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"user\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getNonce\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"nonce\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"addedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"increaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"rootToken_\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"symbol_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint8\",\n \"name\": \"decimals_\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mint\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"predicate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"rootToken\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b506118f9806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806340c10f19116100a2578063a457c2d711610071578063a457c2d71461026b578063a9059cbb1461027e578063dd62ed3e14610291578063e6198705146102a4578063f6d2ee86146102b557600080fd5b806340c10f191461021457806370a082311461022757806395d89b41146102505780639dc29fac1461025857600080fd5b80631f2d0065116100e95780631f2d00651461018157806323b872dd146101a65780632d0335ab146101b9578063313ce567146101e2578063395093511461020157600080fd5b806306fdde031461011b578063095ea7b3146101395780630c53c51c1461015c57806318160ddd1461016f575b600080fd5b6101236102ca565b60405161013091906113a7565b60405180910390f35b61014c6101473660046113dd565b61035c565b6040519015158152602001610130565b61012361016a366004611461565b610380565b603c545b604051908152602001610130565b606d546001600160a01b03165b6040516001600160a01b039091168152602001610130565b61014c6101b43660046114d7565b610663565b6101736101c7366004611513565b6001600160a01b031660009081526006602052604090205490565b606d54600160a01b900460ff1660405160ff9091168152602001610130565b61014c61020f3660046113dd565b610691565b61014c6102223660046113dd565b6106bd565b610173610235366004611513565b6001600160a01b03166000908152603a602052604090205490565b6101236106fd565b61014c6102663660046113dd565b61070c565b61014c6102793660046113dd565b610743565b61014c61028c3660046113dd565b6107c9565b61017361029f36600461152e565b6107e1565b606c546001600160a01b031661018e565b6102c86102c3366004611561565b61080c565b005b6060603d80546102d9906115e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610305906115e5565b80156103525780601f1061032757610100808354040283529160200191610352565b820191906000526020600020905b81548152906001019060200180831161033557829003601f168201915b5050505050905090565b600080610367610a8c565b9050610374818585610a9b565b60019150505b92915050565b606060006103c387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bc092505050565b90506001600160e01b031960003581169082160361044e5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084015b60405180910390fd5b604080516060810182526001600160a01b038a16600081815260066020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506104bf8982888888610bdb565b6105155760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610445565b600660008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161056a9392919061161f565b60408051601f198184030181529082905261058491611645565b6000604051808303816000865af19150503d80600081146105c1576040519150601f19603f3d011682016040523d82523d6000602084013e6105c6565b606091505b5091509150816106185760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610445565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161064d9493929190611661565b60405180910390a19a9950505050505050505050565b60008061066e610a8c565b905061067b858285610cb7565b610686858585610d31565b506001949350505050565b60008061069c610a8c565b90506103748185856106ae85896107e1565b6106b891906116ad565b610a9b565b606c546000906001600160a01b031633146106ea5760405162461bcd60e51b8152600401610445906116ce565b6106f48383610edc565b50600192915050565b6060603e80546102d9906115e5565b606c546000906001600160a01b031633146107395760405162461bcd60e51b8152600401610445906116ce565b6106f48383610f9e565b60008061074e610a8c565b9050600061075c82866107e1565b9050838110156107bc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610445565b6106868286868403610a9b565b6000806107d4610a8c565b9050610374818585610d31565b6001600160a01b039182166000908152603b6020908152604080832093909416825291909152205490565b600754610100900460ff161580801561082c5750600754600160ff909116105b806108465750303b158015610846575060075460ff166001145b6108a95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b6007805460ff1916600117905580156108cc576007805461ff0019166101001790555b6001600160a01b038716158015906108e357508415155b80156108ee57508215155b61093a5760405162461bcd60e51b815260206004820152601e60248201527f4368696c6445524332303a204241445f494e495449414c495a4154494f4e00006044820152606401610445565b606d805460ff8416600160a01b026001600160a81b03199091166001600160a01b038a1617179055606c80546001600160a01b03191633179055604080516020601f88018190048102820181019092528681526109e591889088908190840183828082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506110cf92505050565b610a3d86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b602082015291506111009050565b8015610a83576007805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000610a9661116c565b905090565b6001600160a01b038316610afd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610445565b6001600160a01b038216610b5e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610445565b6001600160a01b038381166000818152603b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008151600003610bd357506000919050565b506020015190565b6000806001610bf1610bec886111c8565b611245565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610c3f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610c965760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610445565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610cc384846107e1565b90506000198114610d2b5781811015610d1e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610445565b610d2b8484848403610a9b565b50505050565b6001600160a01b038316610d955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610445565b6001600160a01b038216610df75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610445565b6001600160a01b0383166000908152603a602052604090205481811015610e6f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610445565b6001600160a01b038085166000818152603a602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610ecf9086815260200190565b60405180910390a3610d2b565b6001600160a01b038216610f325760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610445565b80603c6000828254610f4491906116ad565b90915550506001600160a01b0382166000818152603a60209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b5050565b6001600160a01b038216610ffe5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610445565b6001600160a01b0382166000908152603a6020526040902054818110156110725760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610445565b6001600160a01b0383166000818152603a602090815260408083208686039055603c80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610bb3565b505050565b600754610100900460ff166110f65760405162461bcd60e51b815260040161044590611711565b610f9a8282611293565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61114e8184846112d3565b600055600280546001600160a01b0319163017905560055550505050565b60003033036111c257600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111c59050565b50335b90565b60006040518060800160405280604381526020016118816043913980516020918201208351848301516040808701518051908601209051611228950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061037a61125261131c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600754610100900460ff166112ba5760405162461bcd60e51b815260040161044590611711565b603d6112c683826117c0565b50603e6110ca82826117c0565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b03163014801561133a575060015446145b15611346575060005490565b610a966005546003546004546112d3565b60005b8381101561137257818101518382015260200161135a565b50506000910152565b60008151808452611393816020860160208601611357565b601f01601f19169290920160200192915050565b6020815260006113ba602083018461137b565b9392505050565b80356001600160a01b03811681146113d857600080fd5b919050565b600080604083850312156113f057600080fd5b6113f9836113c1565b946020939093013593505050565b60008083601f84011261141957600080fd5b50813567ffffffffffffffff81111561143157600080fd5b60208301915083602082850101111561144957600080fd5b9250929050565b803560ff811681146113d857600080fd5b60008060008060008060a0878903121561147a57600080fd5b611483876113c1565b9550602087013567ffffffffffffffff81111561149f57600080fd5b6114ab89828a01611407565b90965094505060408701359250606087013591506114cb60808801611450565b90509295509295509295565b6000806000606084860312156114ec57600080fd5b6114f5846113c1565b9250611503602085016113c1565b9150604084013590509250925092565b60006020828403121561152557600080fd5b6113ba826113c1565b6000806040838503121561154157600080fd5b61154a836113c1565b9150611558602084016113c1565b90509250929050565b6000806000806000806080878903121561157a57600080fd5b611583876113c1565b9550602087013567ffffffffffffffff808211156115a057600080fd5b6115ac8a838b01611407565b909750955060408901359150808211156115c557600080fd5b506115d289828a01611407565b90945092506114cb905060608801611450565b600181811c908216806115f957607f821691505b60208210810361161957634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251611657818460208701611357565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b8082018082111561037a57634e487b7160e01b600052601160045260246000fd5b60208082526023908201527f4368696c6445524332303a204f6e6c79207072656469636174652063616e2063604082015262185b1b60ea1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156110ca57600081815260208120601f850160051c810160208610156117995750805b601f850160051c820191505b818110156117b8578281556001016117a5565b505050505050565b815167ffffffffffffffff8111156117da576117da61175c565b6117ee816117e884546115e5565b84611772565b602080601f831160018114611823576000841561180b5750858301515b600019600386901b1c1916600185901b1785556117b8565b600085815260208120601f198616915b8281101561185257888601518255948401946001909101908401611833565b50858210156118705787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122043d252955a598bfaaf37a715cef833ae8b527f2a057ab49be2f942ef556c6bb264736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101165760003560e01c806340c10f19116100a2578063a457c2d711610071578063a457c2d71461026b578063a9059cbb1461027e578063dd62ed3e14610291578063e6198705146102a4578063f6d2ee86146102b557600080fd5b806340c10f191461021457806370a082311461022757806395d89b41146102505780639dc29fac1461025857600080fd5b80631f2d0065116100e95780631f2d00651461018157806323b872dd146101a65780632d0335ab146101b9578063313ce567146101e2578063395093511461020157600080fd5b806306fdde031461011b578063095ea7b3146101395780630c53c51c1461015c57806318160ddd1461016f575b600080fd5b6101236102ca565b60405161013091906113a7565b60405180910390f35b61014c6101473660046113dd565b61035c565b6040519015158152602001610130565b61012361016a366004611461565b610380565b603c545b604051908152602001610130565b606d546001600160a01b03165b6040516001600160a01b039091168152602001610130565b61014c6101b43660046114d7565b610663565b6101736101c7366004611513565b6001600160a01b031660009081526006602052604090205490565b606d54600160a01b900460ff1660405160ff9091168152602001610130565b61014c61020f3660046113dd565b610691565b61014c6102223660046113dd565b6106bd565b610173610235366004611513565b6001600160a01b03166000908152603a602052604090205490565b6101236106fd565b61014c6102663660046113dd565b61070c565b61014c6102793660046113dd565b610743565b61014c61028c3660046113dd565b6107c9565b61017361029f36600461152e565b6107e1565b606c546001600160a01b031661018e565b6102c86102c3366004611561565b61080c565b005b6060603d80546102d9906115e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610305906115e5565b80156103525780601f1061032757610100808354040283529160200191610352565b820191906000526020600020905b81548152906001019060200180831161033557829003601f168201915b5050505050905090565b600080610367610a8c565b9050610374818585610a9b565b60019150505b92915050565b606060006103c387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bc092505050565b90506001600160e01b031960003581169082160361044e5760405162461bcd60e51b815260206004820152603d60248201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060448201527f657865637574654d6574615472616e73616374696f6e206d6574686f6400000060648201526084015b60405180910390fd5b604080516060810182526001600160a01b038a16600081815260066020908152848220548452808401929092528351601f8b0183900483028101830185528a815290938301918b908b9081908401838280828437600092019190915250505091525090506104bf8982888888610bdb565b6105155760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610445565b600660008a6001600160a01b03166001600160a01b031681526020019081526020016000206000815460010191905081905550600080306001600160a01b03168a8a8d60405160200161056a9392919061161f565b60408051601f198184030181529082905261058491611645565b6000604051808303816000865af19150503d80600081146105c1576040519150601f19603f3d011682016040523d82523d6000602084013e6105c6565b606091505b5091509150816106185760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610445565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8b338c8c60405161064d9493929190611661565b60405180910390a19a9950505050505050505050565b60008061066e610a8c565b905061067b858285610cb7565b610686858585610d31565b506001949350505050565b60008061069c610a8c565b90506103748185856106ae85896107e1565b6106b891906116ad565b610a9b565b606c546000906001600160a01b031633146106ea5760405162461bcd60e51b8152600401610445906116ce565b6106f48383610edc565b50600192915050565b6060603e80546102d9906115e5565b606c546000906001600160a01b031633146107395760405162461bcd60e51b8152600401610445906116ce565b6106f48383610f9e565b60008061074e610a8c565b9050600061075c82866107e1565b9050838110156107bc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610445565b6106868286868403610a9b565b6000806107d4610a8c565b9050610374818585610d31565b6001600160a01b039182166000908152603b6020908152604080832093909416825291909152205490565b600754610100900460ff161580801561082c5750600754600160ff909116105b806108465750303b158015610846575060075460ff166001145b6108a95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610445565b6007805460ff1916600117905580156108cc576007805461ff0019166101001790555b6001600160a01b038716158015906108e357508415155b80156108ee57508215155b61093a5760405162461bcd60e51b815260206004820152601e60248201527f4368696c6445524332303a204241445f494e495449414c495a4154494f4e00006044820152606401610445565b606d805460ff8416600160a01b026001600160a81b03199091166001600160a01b038a1617179055606c80546001600160a01b03191633179055604080516020601f88018190048102820181019092528681526109e591889088908190840183828082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506110cf92505050565b610a3d86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260018152603160f81b602082015291506111009050565b8015610a83576007805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000610a9661116c565b905090565b6001600160a01b038316610afd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610445565b6001600160a01b038216610b5e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610445565b6001600160a01b038381166000818152603b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008151600003610bd357506000919050565b506020015190565b6000806001610bf1610bec886111c8565b611245565b6040805160008152602081018083529290925260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa158015610c3f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610c965760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610445565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610cc384846107e1565b90506000198114610d2b5781811015610d1e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610445565b610d2b8484848403610a9b565b50505050565b6001600160a01b038316610d955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610445565b6001600160a01b038216610df75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610445565b6001600160a01b0383166000908152603a602052604090205481811015610e6f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610445565b6001600160a01b038085166000818152603a602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610ecf9086815260200190565b60405180910390a3610d2b565b6001600160a01b038216610f325760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610445565b80603c6000828254610f4491906116ad565b90915550506001600160a01b0382166000818152603a60209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b5050565b6001600160a01b038216610ffe5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610445565b6001600160a01b0382166000908152603a6020526040902054818110156110725760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610445565b6001600160a01b0383166000818152603a602090815260408083208686039055603c80548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610bb3565b505050565b600754610100900460ff166110f65760405162461bcd60e51b815260040161044590611711565b610f9a8282611293565b815160208084019190912082519183019190912060038290556004819055466001557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61114e8184846112d3565b600055600280546001600160a01b0319163017905560055550505050565b60003033036111c257600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111c59050565b50335b90565b60006040518060800160405280604381526020016118816043913980516020918201208351848301516040808701518051908601209051611228950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061037a61125261131c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600754610100900460ff166112ba5760405162461bcd60e51b815260040161044590611711565b603d6112c683826117c0565b50603e6110ca82826117c0565b6040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6002546000906001600160a01b03163014801561133a575060015446145b15611346575060005490565b610a966005546003546004546112d3565b60005b8381101561137257818101518382015260200161135a565b50506000910152565b60008151808452611393816020860160208601611357565b601f01601f19169290920160200192915050565b6020815260006113ba602083018461137b565b9392505050565b80356001600160a01b03811681146113d857600080fd5b919050565b600080604083850312156113f057600080fd5b6113f9836113c1565b946020939093013593505050565b60008083601f84011261141957600080fd5b50813567ffffffffffffffff81111561143157600080fd5b60208301915083602082850101111561144957600080fd5b9250929050565b803560ff811681146113d857600080fd5b60008060008060008060a0878903121561147a57600080fd5b611483876113c1565b9550602087013567ffffffffffffffff81111561149f57600080fd5b6114ab89828a01611407565b90965094505060408701359250606087013591506114cb60808801611450565b90509295509295509295565b6000806000606084860312156114ec57600080fd5b6114f5846113c1565b9250611503602085016113c1565b9150604084013590509250925092565b60006020828403121561152557600080fd5b6113ba826113c1565b6000806040838503121561154157600080fd5b61154a836113c1565b9150611558602084016113c1565b90509250929050565b6000806000806000806080878903121561157a57600080fd5b611583876113c1565b9550602087013567ffffffffffffffff808211156115a057600080fd5b6115ac8a838b01611407565b909750955060408901359150808211156115c557600080fd5b506115d289828a01611407565b90945092506114cb905060608801611450565b600181811c908216806115f957607f821691505b60208210810361161957634e487b7160e01b600052602260045260246000fd5b50919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251611657818460208701611357565b9190910192915050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b8082018082111561037a57634e487b7160e01b600052601160045260246000fd5b60208082526023908201527f4368696c6445524332303a204f6e6c79207072656469636174652063616e2063604082015262185b1b60ea1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f8211156110ca57600081815260208120601f850160051c810160208610156117995750805b601f850160051c820191505b818110156117b8578281556001016117a5565b505050505050565b815167ffffffffffffffff8111156117da576117da61175c565b6117ee816117e884546115e5565b84611772565b602080601f831160018114611823576000841561180b5750858301515b600019600386901b1c1916600185901b1785556117b8565b600085815260208120601f198616915b8281101561185257888601518255948401946001909101908401611833565b50858210156118705787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122043d252955a598bfaaf37a715cef833ae8b527f2a057ab49be2f942ef556c6bb264736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var ChildERC20PredicateArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ChildERC20Predicate\",\n \"sourceName\": \"contracts/child/ChildERC20Predicate.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"only\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"L2ERC20Deposit\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"L2ERC20Withdraw\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"L2TokenMapped\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"DEPOSIT_SIG\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAP_TOKEN_SIG\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"WITHDRAW_SIG\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"childTokenTemplate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newL2StateSender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newStateReceiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newRootERC20Predicate\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newChildTokenTemplate\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newNativeTokenRootAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"l2StateSender\",\n \"outputs\": [\n {\n \"internalType\": \"contract IStateSender\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"onStateReceive\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"rootERC20Predicate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"rootTokenToChildToken\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"stateReceiver\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IChildERC20\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"withdraw\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IChildERC20\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"withdrawTo\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b5061146c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806397e5230d116100a2578063d41f177111610071578063d41f17711461023d578063e0563ab114610264578063eeb499451461026d578063f3fef3a314610280578063f64512551461029357600080fd5b806397e5230d146101e6578063b1768065146101f0578063b68ad1e414610217578063c3b35a7e1461022a57600080fd5b80633b878c22116100e95780633b878c221461017c57806351351d531461018557806371cf93b7146101935780637efab4f5146101a6578063947287cf146101cf57600080fd5b806305dc2e8f1461011b5780631459457a1461014b5780631bc114ba14610160578063284017f514610173575b600080fd5b60345461012e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015e610159366004610f8d565b6102ba565b005b60335461012e906001600160a01b031681565b61012e61202081565b61012e61101081565b61012e6002600160a01b0381565b60355461012e906001600160a01b031681565b61012e6101b4366004610ffe565b6037602052600090815260409020546001600160a01b031681565b6101d861520881565b604051908152602001610142565b6101d8620249f081565b6101d87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461012e906001600160a01b031681565b61015e610238366004611022565b61055a565b6101d87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61012e61203081565b61015e61027b366004611063565b61056a565b61015e61028e3660046110ec565b61073e565b6101d87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103035760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103235750600054600160ff909116105b8061033d5750303b15801561033d575060005460ff166001145b6103a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102fa565b6000805460ff1916600117905580156103c3576000805461ff0019166101001790555b6001600160a01b038616158015906103e357506001600160a01b03851615155b80156103f757506001600160a01b03841615155b801561040b57506001600160a01b03831615155b6104675760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016102fa565b603380546001600160a01b03199081166001600160a01b03898116919091179092556034805482168884161790556035805482168784161790556036805490911685831617905582161561050c576001600160a01b03821660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b8015610552576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61056583838361074d565b505050565b6034546001600160a01b031633146105d55760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016102fa565b6035546001600160a01b038481169116146106435760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016102fa565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610672602060008486611118565b61067b91611142565b0361069a576106956106908260208186611118565b610ab8565b610738565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6106c9602060008486611118565b6106d291611142565b036106e1576106958282610d5d565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016102fa565b50505050565b61074982338361074d565b5050565b826001600160a01b03163b6000036107b15760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016102fa565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108159190611160565b6001600160a01b038181166000908152603760205260409020549192508581169116146108545760405162461bcd60e51b81526004016102fa9061117d565b6001600160a01b03811661086a5761086a6111c0565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d69190611160565b6001600160a01b0316146108ec576108ec6111c0565b604051632770a7eb60e21b8152336004820152602481018390526001600160a01b03851690639dc29fac906044016020604051808303816000875af1158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d91906111d6565b6109a95760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016102fa565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610a349391169160c40161123e565b600060405180830381600087803b158015610a4e57600080fd5b505af1158015610a62573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945088811693508516917fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb27910160405180910390a450505050565b6000808080610ac98587018761126a565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610b0c5760405162461bcd60e51b81526004016102fa9061117d565b806001600160a01b03163b600003610b2657610b266111c0565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8a9190611160565b9050856001600160a01b0316816001600160a01b031614610bad57610bad6111c0565b6001600160a01b038116610bc357610bc36111c0565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2f9190611160565b6001600160a01b031614610c4557610c456111c0565b6040516340c10f1960e01b81526001600160a01b038581166004830152602482018590528316906340c10f19906044016020604051808303816000875af1158015610c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb891906111d6565b610d045760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016102fa565b604080516001600160a01b038781168252602082018690528087169285821692918a16917fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd910160405180910390a45050505050505050565b6000808080610d6e8587018761135e565b92975090955093509150506001600160a01b038416610d8f57610d8f6111c0565b6001600160a01b038481166000908152603760205260409020541615610db757610db76111c0565b6036546040516bffffffffffffffffffffffff19606087901b166020820152600091610e07916001600160a01b039091169060340160405160208183030381529060405280519060200120610ed2565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690610e5f9088908890889088906004016113eb565b600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116610f6f5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016102fa565b92915050565b6001600160a01b0381168114610f8a57600080fd5b50565b600080600080600060a08688031215610fa557600080fd5b8535610fb081610f75565b94506020860135610fc081610f75565b93506040860135610fd081610f75565b92506060860135610fe081610f75565b91506080860135610ff081610f75565b809150509295509295909350565b60006020828403121561101057600080fd5b813561101b81610f75565b9392505050565b60008060006060848603121561103757600080fd5b833561104281610f75565b9250602084013561105281610f75565b929592945050506040919091013590565b6000806000806060858703121561107957600080fd5b84359350602085013561108b81610f75565b9250604085013567ffffffffffffffff808211156110a857600080fd5b818701915087601f8301126110bc57600080fd5b8135818111156110cb57600080fd5b8860208285010111156110dd57600080fd5b95989497505060200194505050565b600080604083850312156110ff57600080fd5b823561110a81610f75565b946020939093013593505050565b6000808585111561112857600080fd5b8386111561113557600080fd5b5050820193919092039150565b80356020831015610f6f57600019602084900360031b1b1692915050565b60006020828403121561117257600080fd5b815161101b81610f75565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156111e857600080fd5b8151801515811461101b57600080fd5b6000815180845260005b8181101561121e57602081850181015186830182015201611202565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611262908301846111f8565b949350505050565b6000806000806080858703121561128057600080fd5b843561128b81610f75565b9350602085013561129b81610f75565b925060408501356112ab81610f75565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126112e257600080fd5b813567ffffffffffffffff808211156112fd576112fd6112bb565b604051601f8301601f19908116603f01168101908282118183101715611325576113256112bb565b8160405283815286602085880101111561133e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561137657600080fd5b85359450602086013561138881610f75565b9350604086013567ffffffffffffffff808211156113a557600080fd5b6113b189838a016112d1565b945060608801359150808211156113c757600080fd5b506113d4888289016112d1565b925050608086013560ff81168114610ff057600080fd5b6001600160a01b038516815260806020820181905260009061140f908301866111f8565b828103604084015261142181866111f8565b91505060ff831660608301529594505050505056fea2646970667358221220abc23fa7bf801933889525d07e9ed386b00afa2ff751a0b0b5c6dadf3565dcb864736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101165760003560e01c806397e5230d116100a2578063d41f177111610071578063d41f17711461023d578063e0563ab114610264578063eeb499451461026d578063f3fef3a314610280578063f64512551461029357600080fd5b806397e5230d146101e6578063b1768065146101f0578063b68ad1e414610217578063c3b35a7e1461022a57600080fd5b80633b878c22116100e95780633b878c221461017c57806351351d531461018557806371cf93b7146101935780637efab4f5146101a6578063947287cf146101cf57600080fd5b806305dc2e8f1461011b5780631459457a1461014b5780631bc114ba14610160578063284017f514610173575b600080fd5b60345461012e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015e610159366004610f8d565b6102ba565b005b60335461012e906001600160a01b031681565b61012e61202081565b61012e61101081565b61012e6002600160a01b0381565b60355461012e906001600160a01b031681565b61012e6101b4366004610ffe565b6037602052600090815260409020546001600160a01b031681565b6101d861520881565b604051908152602001610142565b6101d8620249f081565b6101d87f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b60365461012e906001600160a01b031681565b61015e610238366004611022565b61055a565b6101d87f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b61012e61203081565b61015e61027b366004611063565b61056a565b61015e61028e3660046110ec565b61073e565b6101d87f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b336002600160a01b03146103035760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b600054610100900460ff16158080156103235750600054600160ff909116105b8061033d5750303b15801561033d575060005460ff166001145b6103a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016102fa565b6000805460ff1916600117905580156103c3576000805461ff0019166101001790555b6001600160a01b038616158015906103e357506001600160a01b03851615155b80156103f757506001600160a01b03841615155b801561040b57506001600160a01b03831615155b6104675760405162461bcd60e51b815260206004820152602760248201527f4368696c6445524332305072656469636174653a204241445f494e495449414c60448201526624ad20aa24a7a760c91b60648201526084016102fa565b603380546001600160a01b03199081166001600160a01b03898116919091179092556034805482168884161790556035805482168784161790556036805490911685831617905582161561050c576001600160a01b03821660008181526037602052604080822080546001600160a01b03191661101090811790915590519092917f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d91a35b8015610552576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b61056583838361074d565b505050565b6034546001600160a01b031633146105d55760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f53544154455f6044820152672922a1a2a4ab22a960c11b60648201526084016102fa565b6035546001600160a01b038481169116146106435760405162461bcd60e51b815260206004820152602860248201527f4368696c6445524332305072656469636174653a204f4e4c595f524f4f545f50604482015267524544494341544560c01b60648201526084016102fa565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821610672602060008486611118565b61067b91611142565b0361069a576106956106908260208186611118565b610ab8565b610738565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad6106c9602060008486611118565b6106d291611142565b036106e1576106958282610d5d565b60405162461bcd60e51b815260206004820152602660248201527f4368696c6445524332305072656469636174653a20494e56414c49445f5349476044820152654e415455524560d01b60648201526084016102fa565b50505050565b61074982338361074d565b5050565b826001600160a01b03163b6000036107b15760405162461bcd60e51b815260206004820152602160248201527f4368696c6445524332305072656469636174653a204e4f545f434f4e545241436044820152601560fa1b60648201526084016102fa565b6000836001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108159190611160565b6001600160a01b038181166000908152603760205260409020549192508581169116146108545760405162461bcd60e51b81526004016102fa9061117d565b6001600160a01b03811661086a5761086a6111c0565b306001600160a01b0316846001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d69190611160565b6001600160a01b0316146108ec576108ec6111c0565b604051632770a7eb60e21b8152336004820152602481018390526001600160a01b03851690639dc29fac906044016020604051808303816000875af1158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d91906111d6565b6109a95760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204255524e5f4641494c454460448201526064016102fa565b603354603554604080517f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286960208201526001600160a01b0385811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352938416936316f1983193610a349391169160c40161123e565b600060405180830381600087803b158015610a4e57600080fd5b505af1158015610a62573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945088811693508516917fa0923f060a16fc784558d43de424ffde7b01643de5e5d335851b9df94c76bb27910160405180910390a450505050565b6000808080610ac98587018761126a565b6001600160a01b0380851660009081526037602052604090205494985092965090945092501680610b0c5760405162461bcd60e51b81526004016102fa9061117d565b806001600160a01b03163b600003610b2657610b266111c0565b6000816001600160a01b0316631f2d00656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8a9190611160565b9050856001600160a01b0316816001600160a01b031614610bad57610bad6111c0565b6001600160a01b038116610bc357610bc36111c0565b306001600160a01b0316826001600160a01b031663e61987056040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2f9190611160565b6001600160a01b031614610c4557610c456111c0565b6040516340c10f1960e01b81526001600160a01b038581166004830152602482018590528316906340c10f19906044016020604051808303816000875af1158015610c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb891906111d6565b610d045760405162461bcd60e51b815260206004820181905260248201527f4368696c6445524332305072656469636174653a204d494e545f4641494c454460448201526064016102fa565b604080516001600160a01b038781168252602082018690528087169285821692918a16917fdf34f3a3ed8bedc14a4b284ebaee5374d55b64bac6a84c270dabe8fd6b4cdafd910160405180910390a45050505050505050565b6000808080610d6e8587018761135e565b92975090955093509150506001600160a01b038416610d8f57610d8f6111c0565b6001600160a01b038481166000908152603760205260409020541615610db757610db76111c0565b6036546040516bffffffffffffffffffffffff19606087901b166020820152600091610e07916001600160a01b039091169060340160405160208183030381529060405280519060200120610ed2565b6001600160a01b038681166000908152603760205260409081902080546001600160a01b031916928416928317905551637b69774360e11b81529192509063f6d2ee8690610e5f9088908890889088906004016113eb565b600060405180830381600087803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50506040516001600160a01b038085169350881691507f46bd56f98e1b14fd35691959270a6e1edf7cb8fcd489e0f9dda89e46c0d1ff0d90600090a350505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b038116610f6f5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016102fa565b92915050565b6001600160a01b0381168114610f8a57600080fd5b50565b600080600080600060a08688031215610fa557600080fd5b8535610fb081610f75565b94506020860135610fc081610f75565b93506040860135610fd081610f75565b92506060860135610fe081610f75565b91506080860135610ff081610f75565b809150509295509295909350565b60006020828403121561101057600080fd5b813561101b81610f75565b9392505050565b60008060006060848603121561103757600080fd5b833561104281610f75565b9250602084013561105281610f75565b929592945050506040919091013590565b6000806000806060858703121561107957600080fd5b84359350602085013561108b81610f75565b9250604085013567ffffffffffffffff808211156110a857600080fd5b818701915087601f8301126110bc57600080fd5b8135818111156110cb57600080fd5b8860208285010111156110dd57600080fd5b95989497505060200194505050565b600080604083850312156110ff57600080fd5b823561110a81610f75565b946020939093013593505050565b6000808585111561112857600080fd5b8386111561113557600080fd5b5050820193919092039150565b80356020831015610f6f57600019602084900360031b1b1692915050565b60006020828403121561117257600080fd5b815161101b81610f75565b60208082526023908201527f4368696c6445524332305072656469636174653a20554e4d41505045445f544f60408201526225a2a760e91b606082015260800190565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156111e857600080fd5b8151801515811461101b57600080fd5b6000815180845260005b8181101561121e57602081850181015186830182015201611202565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b0383168152604060208201819052600090611262908301846111f8565b949350505050565b6000806000806080858703121561128057600080fd5b843561128b81610f75565b9350602085013561129b81610f75565b925060408501356112ab81610f75565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126112e257600080fd5b813567ffffffffffffffff808211156112fd576112fd6112bb565b604051601f8301601f19908116603f01168101908282118183101715611325576113256112bb565b8160405283815286602085880101111561133e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561137657600080fd5b85359450602086013561138881610f75565b9350604086013567ffffffffffffffff808211156113a557600080fd5b6113b189838a016112d1565b945060608801359150808211156113c757600080fd5b506113d4888289016112d1565b925050608086013560ff81168114610ff057600080fd5b6001600160a01b038516815260806020820181905260009061140f908301866111f8565b828103604084015261142181866111f8565b91505060ff831660608301529594505050505056fea2646970667358221220abc23fa7bf801933889525d07e9ed386b00afa2ff751a0b0b5c6dadf3565dcb864736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" var SystemArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"System\",\n \"sourceName\": \"contracts/child/System.sol\",\n \"abi\": [\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b5060f58061001f6000396000f3fe6080604052348015600f57600080fd5b5060043610605a5760003560e01c8063284017f514605f5780633b878c2214608457806351351d5314608c578063947287cf14609957806397e5230d1460ae578063e0563ab11460b7575b600080fd5b606761202081565b6040516001600160a01b0390911681526020015b60405180910390f35b606761101081565b60676002600160a01b0381565b60a161520881565b604051908152602001607b565b60a1620249f081565b60676120308156fea2646970667358221220aad87ef2580cba91881cfe524e6574b806786cd6970b5915c89d6c04ccf6f03b64736f6c63430008110033\",\n \"deployedBytecode\": \"0x6080604052348015600f57600080fd5b5060043610605a5760003560e01c8063284017f514605f5780633b878c2214608457806351351d5314608c578063947287cf14609957806397e5230d1460ae578063e0563ab11460b7575b600080fd5b606761202081565b6040516001600160a01b0390911681526020015b60405180910390f35b606761101081565b60676002600160a01b0381565b60a161520881565b604051908152602001607b565b60a1620249f081565b60676120308156fea2646970667358221220aad87ef2580cba91881cfe524e6574b806786cd6970b5915c89d6c04ccf6f03b64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" -var MRC20Artifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"MRC20\",\n \"sourceName\": \"contracts/child/MRC20.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"only\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TOKEN_CONTRACT\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"NATIVE_TRANSFER_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"SYSTEM\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VALIDATOR_PKCHECK_PRECOMPILE_GAS\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subtractedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"decreaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"addedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"increaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"predicate_\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name_\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"symbol_\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"onStateReceive\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"predicate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"withdraw\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50611150806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d71461025a578063a9059cbb1461026d578063dd62ed3e14610280578063e0563ab114610293578063e61987051461029c578063eeb49945146102af57600080fd5b806370a082311461020f578063906571471461022a578063947287cf1461023f57806395d89b411461024857806397e5230d1461025057600080fd5b80632e1a7d4d116100ff5780632e1a7d4d146101c3578063313ce567146101d657806339509351146101e55780633b878c22146101f857806351351d531461020157600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806323b872dd1461018f578063284017f5146101a2575b600080fd5b6101446102c2565b6040516101519190610c5b565b60405180910390f35b61016d610168366004610ca6565b610354565b6040519015158152602001610151565b6033545b604051908152602001610151565b61016d61019d366004610cd2565b61036e565b6101ab61202081565b6040516001600160a01b039091168152602001610151565b61016d6101d1366004610d13565b610392565b60405160128152602001610151565b61016d6101f3366004610ca6565b6103a6565b6101ab61101081565b6101ab6002600160a01b0381565b61018161021d366004610d2c565b6001600160a01b03163190565b61023d610238366004610df3565b6103c8565b005b61018161520881565b61014461044b565b610181620249f081565b61016d610268366004610ca6565b61045a565b61016d61027b366004610ca6565b6104d5565b61018161028e366004610e69565b6104e3565b6101ab61203081565b6036546101ab906001600160a01b031681565b61023d6102bd366004610ea2565b61050e565b6060603480546102d190610f2b565b80601f01602080910402602001604051908101604052809291908181526020018280546102fd90610f2b565b801561034a5780601f1061031f5761010080835404028352916020019161034a565b820191906000526020600020905b81548152906001019060200180831161032d57829003601f168201915b5050505050905090565b6000336103628185856105c7565b60019150505b92915050565b60003361037c8582856106eb565b61038785858561075f565b506001949350505050565b600061039e3383610942565b506001919050565b6000336103628185856103b983836104e3565b6103c39190610f7b565b6105c7565b336002600160a01b03146104115760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b603680546001600160a01b0319166001600160a01b03851617905560346104388382610fd9565b5060356104458282610fd9565b50505050565b6060603580546102d190610f2b565b6000338161046882866104e3565b9050838110156104c85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610408565b61038782868684036105c7565b60003361036281858561075f565b6001600160a01b03918216600090815260326020908152604080832093909416825291909152205490565b61100133146105545760405162461bcd60e51b815260206004820152601260248201527127a7262cafa9aa20aa22a922a1a2a4ab22a960711b6044820152606401610408565b6036546001600160a01b038481169116146105a25760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a2a72222a960911b6044820152606401610408565b6000806105b183850185610ca6565b915091506105bf8282610ac5565b505050505050565b6001600160a01b0383166106295760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610408565b6001600160a01b03821661068a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610408565b6001600160a01b0383811660008181526032602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006106f784846104e3565b9050600019811461044557818110156107525760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610408565b61044584848484036105c7565b6001600160a01b0383166107c35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610408565b6001600160a01b0382166108255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610408565b604080516001600160a01b0385811660208301528416918101919091526060810182905260009081906120209060800160408051601f198184030181529082905261086f91611099565b6000604051808303816000865af19150503d80600081146108ac576040519150601f19603f3d011682016040523d82523d6000602084013e6108b1565b606091505b50915091508180156108d25750808060200190518101906108d291906110b5565b6108ee5760405162461bcd60e51b8152600401610408906110d7565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161093391815260200190565b60405180910390a35050505050565b6001600160a01b0382166109a25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610408565b80603360008282546109b49190611107565b9091555050604080516001600160a01b038416602082015260009181018290526060810183905281906120209060800160408051601f19818403018152908290526109fe91611099565b6000604051808303816000865af19150503d8060008114610a3b576040519150601f19603f3d011682016040523d82523d6000602084013e610a40565b606091505b5091509150818015610a61575080806020019051810190610a6191906110b5565b610a7d5760405162461bcd60e51b8152600401610408906110d7565b6040518381526000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b6001600160a01b038216610b1b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610408565b8060336000828254610b2d9190610f7b565b9091555050604080516000602082018190526001600160a01b038516928201929092526060810183905281906120209060800160408051601f1981840301815290829052610b7a91611099565b6000604051808303816000865af19150503d8060008114610bb7576040519150601f19603f3d011682016040523d82523d6000602084013e610bbc565b606091505b5091509150818015610bdd575080806020019051810190610bdd91906110b5565b610bf95760405162461bcd60e51b8152600401610408906110d7565b6040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ab7565b60005b83811015610c52578181015183820152602001610c3a565b50506000910152565b6020815260008251806020840152610c7a816040850160208701610c37565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610ca357600080fd5b50565b60008060408385031215610cb957600080fd5b8235610cc481610c8e565b946020939093013593505050565b600080600060608486031215610ce757600080fd5b8335610cf281610c8e565b92506020840135610d0281610c8e565b929592945050506040919091013590565b600060208284031215610d2557600080fd5b5035919050565b600060208284031215610d3e57600080fd5b8135610d4981610c8e565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610d7757600080fd5b813567ffffffffffffffff80821115610d9257610d92610d50565b604051601f8301601f19908116603f01168101908282118183101715610dba57610dba610d50565b81604052838152866020858801011115610dd357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610e0857600080fd5b8335610e1381610c8e565b9250602084013567ffffffffffffffff80821115610e3057600080fd5b610e3c87838801610d66565b93506040860135915080821115610e5257600080fd5b50610e5f86828701610d66565b9150509250925092565b60008060408385031215610e7c57600080fd5b8235610e8781610c8e565b91506020830135610e9781610c8e565b809150509250929050565b60008060008060608587031215610eb857600080fd5b843593506020850135610eca81610c8e565b9250604085013567ffffffffffffffff80821115610ee757600080fd5b818701915087601f830112610efb57600080fd5b813581811115610f0a57600080fd5b886020828501011115610f1c57600080fd5b95989497505060200194505050565b600181811c90821680610f3f57607f821691505b602082108103610f5f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561036857610368610f65565b601f821115610fd457600081815260208120601f850160051c81016020861015610fb55750805b601f850160051c820191505b818110156105bf57828155600101610fc1565b505050565b815167ffffffffffffffff811115610ff357610ff3610d50565b611007816110018454610f2b565b84610f8e565b602080601f83116001811461103c57600084156110245750858301515b600019600386901b1c1916600185901b1785556105bf565b600085815260208120601f198616915b8281101561106b5788860151825594840194600190910190840161104c565b50858210156110895787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516110ab818460208701610c37565b9190910192915050565b6000602082840312156110c757600080fd5b81518015158114610d4957600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561036857610368610f6556fea2646970667358221220808bbda55719e937960992f7b84b2b25d2323385c55dfa1d2b899e89409cf9dc64736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d71461025a578063a9059cbb1461026d578063dd62ed3e14610280578063e0563ab114610293578063e61987051461029c578063eeb49945146102af57600080fd5b806370a082311461020f578063906571471461022a578063947287cf1461023f57806395d89b411461024857806397e5230d1461025057600080fd5b80632e1a7d4d116100ff5780632e1a7d4d146101c3578063313ce567146101d657806339509351146101e55780633b878c22146101f857806351351d531461020157600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806323b872dd1461018f578063284017f5146101a2575b600080fd5b6101446102c2565b6040516101519190610c5b565b60405180910390f35b61016d610168366004610ca6565b610354565b6040519015158152602001610151565b6033545b604051908152602001610151565b61016d61019d366004610cd2565b61036e565b6101ab61202081565b6040516001600160a01b039091168152602001610151565b61016d6101d1366004610d13565b610392565b60405160128152602001610151565b61016d6101f3366004610ca6565b6103a6565b6101ab61101081565b6101ab6002600160a01b0381565b61018161021d366004610d2c565b6001600160a01b03163190565b61023d610238366004610df3565b6103c8565b005b61018161520881565b61014461044b565b610181620249f081565b61016d610268366004610ca6565b61045a565b61016d61027b366004610ca6565b6104d5565b61018161028e366004610e69565b6104e3565b6101ab61203081565b6036546101ab906001600160a01b031681565b61023d6102bd366004610ea2565b61050e565b6060603480546102d190610f2b565b80601f01602080910402602001604051908101604052809291908181526020018280546102fd90610f2b565b801561034a5780601f1061031f5761010080835404028352916020019161034a565b820191906000526020600020905b81548152906001019060200180831161032d57829003601f168201915b5050505050905090565b6000336103628185856105c7565b60019150505b92915050565b60003361037c8582856106eb565b61038785858561075f565b506001949350505050565b600061039e3383610942565b506001919050565b6000336103628185856103b983836104e3565b6103c39190610f7b565b6105c7565b336002600160a01b03146104115760405163973d02cb60e01b815260206004820152600a60248201526914d654d5115350d0531360b21b60448201526064015b60405180910390fd5b603680546001600160a01b0319166001600160a01b03851617905560346104388382610fd9565b5060356104458282610fd9565b50505050565b6060603580546102d190610f2b565b6000338161046882866104e3565b9050838110156104c85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610408565b61038782868684036105c7565b60003361036281858561075f565b6001600160a01b03918216600090815260326020908152604080832093909416825291909152205490565b61100133146105545760405162461bcd60e51b815260206004820152601260248201527127a7262cafa9aa20aa22a922a1a2a4ab22a960711b6044820152606401610408565b6036546001600160a01b038481169116146105a25760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a2a72222a960911b6044820152606401610408565b6000806105b183850185610ca6565b915091506105bf8282610ac5565b505050505050565b6001600160a01b0383166106295760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610408565b6001600160a01b03821661068a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610408565b6001600160a01b0383811660008181526032602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006106f784846104e3565b9050600019811461044557818110156107525760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610408565b61044584848484036105c7565b6001600160a01b0383166107c35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610408565b6001600160a01b0382166108255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610408565b604080516001600160a01b0385811660208301528416918101919091526060810182905260009081906120209060800160408051601f198184030181529082905261086f91611099565b6000604051808303816000865af19150503d80600081146108ac576040519150601f19603f3d011682016040523d82523d6000602084013e6108b1565b606091505b50915091508180156108d25750808060200190518101906108d291906110b5565b6108ee5760405162461bcd60e51b8152600401610408906110d7565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161093391815260200190565b60405180910390a35050505050565b6001600160a01b0382166109a25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610408565b80603360008282546109b49190611107565b9091555050604080516001600160a01b038416602082015260009181018290526060810183905281906120209060800160408051601f19818403018152908290526109fe91611099565b6000604051808303816000865af19150503d8060008114610a3b576040519150601f19603f3d011682016040523d82523d6000602084013e610a40565b606091505b5091509150818015610a61575080806020019051810190610a6191906110b5565b610a7d5760405162461bcd60e51b8152600401610408906110d7565b6040518381526000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350505050565b6001600160a01b038216610b1b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610408565b8060336000828254610b2d9190610f7b565b9091555050604080516000602082018190526001600160a01b038516928201929092526060810183905281906120209060800160408051601f1981840301815290829052610b7a91611099565b6000604051808303816000865af19150503d8060008114610bb7576040519150601f19603f3d011682016040523d82523d6000602084013e610bbc565b606091505b5091509150818015610bdd575080806020019051810190610bdd91906110b5565b610bf95760405162461bcd60e51b8152600401610408906110d7565b6040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ab7565b60005b83811015610c52578181015183820152602001610c3a565b50506000910152565b6020815260008251806020840152610c7a816040850160208701610c37565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610ca357600080fd5b50565b60008060408385031215610cb957600080fd5b8235610cc481610c8e565b946020939093013593505050565b600080600060608486031215610ce757600080fd5b8335610cf281610c8e565b92506020840135610d0281610c8e565b929592945050506040919091013590565b600060208284031215610d2557600080fd5b5035919050565b600060208284031215610d3e57600080fd5b8135610d4981610c8e565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610d7757600080fd5b813567ffffffffffffffff80821115610d9257610d92610d50565b604051601f8301601f19908116603f01168101908282118183101715610dba57610dba610d50565b81604052838152866020858801011115610dd357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610e0857600080fd5b8335610e1381610c8e565b9250602084013567ffffffffffffffff80821115610e3057600080fd5b610e3c87838801610d66565b93506040860135915080821115610e5257600080fd5b50610e5f86828701610d66565b9150509250925092565b60008060408385031215610e7c57600080fd5b8235610e8781610c8e565b91506020830135610e9781610c8e565b809150509250929050565b60008060008060608587031215610eb857600080fd5b843593506020850135610eca81610c8e565b9250604085013567ffffffffffffffff80821115610ee757600080fd5b818701915087601f830112610efb57600080fd5b813581811115610f0a57600080fd5b886020828501011115610f1c57600080fd5b95989497505060200194505050565b600181811c90821680610f3f57607f821691505b602082108103610f5f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561036857610368610f65565b601f821115610fd457600081815260208120601f850160051c81016020861015610fb55750805b601f850160051c820191505b818110156105bf57828155600101610fc1565b505050565b815167ffffffffffffffff811115610ff357610ff3610d50565b611007816110018454610f2b565b84610f8e565b602080601f83116001811461103c57600084156110245750858301515b600019600386901b1c1916600185901b1785556105bf565b600085815260208120601f198616915b8281101561106b5788860151825594840194600190910190840161104c565b50858210156110895787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516110ab818460208701610c37565b9190910192915050565b6000602082840312156110c757600080fd5b81518015158114610d4957600080fd5b60208082526016908201527514149150d3d35412531157d0d0531317d1905253115160521b604082015260600190565b8181038181111561036857610368610f6556fea2646970667358221220808bbda55719e937960992f7b84b2b25d2323385c55dfa1d2b899e89409cf9dc64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var BLSArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"BLS\",\n \"sourceName\": \"contracts/common/BLS.sol\",\n \"abi\": [\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"domain\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"message\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"expandMsgTo96\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"domain\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"messages\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"hashToField\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"domain\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"message\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"hashToPoint\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"point\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"isOnCurveG1\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"_isOnCurve\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"point\",\n \"type\": \"uint256[4]\"\n }\n ],\n \"name\": \"isOnCurveG2\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"_isOnCurve\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"isValidSignature\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_x\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mapToPoint\",\n \"outputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"p\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4][]\",\n \"name\": \"pubkeys\",\n \"type\": \"uint256[4][]\"\n },\n {\n \"internalType\": \"uint256[2][]\",\n \"name\": \"messages\",\n \"type\": \"uint256[2][]\"\n }\n ],\n \"name\": \"verifyMultiple\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"checkResult\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"callSuccess\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4][]\",\n \"name\": \"pubkeys\",\n \"type\": \"uint256[4][]\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"message\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"verifyMultipleSameMsg\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"checkResult\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"callSuccess\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"pubkey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"message\",\n \"type\": \"uint256[2]\"\n }\n ],\n \"name\": \"verifySingle\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50612e62806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806391ec2d2b1161006657806391ec2d2b1461013b578063a850a9091461015b578063d58e77331461016e578063e242cce914610181578063ebbdac911461019457600080fd5b8063115000fe146100a3578063247dd9fb146100cb5780633e5476ce146100de5780638669026f146101085780639141376314610128575b600080fd5b6100b66100b13660046127eb565b6101a7565b60405190151581526020015b60405180910390f35b6100b66100d9366004612869565b61030e565b6100f16100ec366004612926565b6103b8565b6040805192151583529015156020830152016100c2565b61011b6101163660046129b5565b6107e8565b6040516100c29190612a3f565b6100f1610136366004612a70565b610904565b61014e6101493660046129b5565b610dee565b6040516100c29190612b6f565b61011b6101693660046129b5565b61108b565b61011b61017c366004612b89565b61126d565b6100b661018f366004612869565b611643565b6100f16101a2366004612ba2565b6116a2565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528283098182830101600080516020612e0d8339815191528283840108600080516020612e0d8339815191528682600080516020612e0d83398151915203860109935050600080516020612e0d8339815191528483600080516020612e0d833981519152038301099150600080516020612e0d8339815191527f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e584089450600080516020612e0d8339815191527e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2830893506040870151925060608701519150600080516020612e0d8339815191528083600080516020612e0d833981519152038508600080516020612e0d833981519152848608099050600080516020612e0d833981519152828460011b0994149290931491909116949350505050565b8051600090600080516020612e0d83398151915211158061034157506020820151600080516020612e0d83398151915211155b1561034e57506000919050565b60405163e242cce960e01b8152309063e242cce990610371908590600401612a3f565b602060405180830381865afa15801561038e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b29190612c05565b92915050565b60008083806103e25760405162461bcd60e51b81526004016103d990612c27565b60405180910390fd5b60006103ef826001612c7e565b6103fa906006612c91565b905060008167ffffffffffffffff8111156104175761041761277b565b604051908082528060200260200182016040528015610440578160200160208202803683370190505b50905088600060200201358160008151811061045e5761045e612bef565b602090810291909101015288600160200201358160018151811061048457610484612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2816002815181106104c4576104c4612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed8160038151811061050457610504612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec8160048151811061054457610544612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8160058151811061058457610584612bef565b60200260200101818152505060005b838110156107a3578635826105a9836006612c91565b6105b4906006612c7e565b815181106105c4576105c4612bef565b60209081029190910101528660016020020135826105e3836006612c91565b6105ee906007612c7e565b815181106105fe576105fe612bef565b60200260200101818152505088888281811061061c5761061c612bef565b90506080020160016004811061063457610634612bef565b602002013582610645836006612c91565b610650906008612c7e565b8151811061066057610660612bef565b60200260200101818152505088888281811061067e5761067e612bef565b90506080020160006004811061069657610696612bef565b6020020135826106a7836006612c91565b6106b2906009612c7e565b815181106106c2576106c2612bef565b6020026020010181815250508888828181106106e0576106e0612bef565b9050608002016003600481106106f8576106f8612bef565b602002013582610709836006612c91565b61071490600a612c7e565b8151811061072457610724612bef565b60200260200101818152505088888281811061074257610742612bef565b90506080020160026004811061075a5761075a612bef565b60200201358261076b836006612c91565b61077690600b612c7e565b8151811061078657610786612bef565b60209081029190910101528061079b81612ca8565b915050610593565b506107ac612721565b602081602085026020850160085afa9450846107d25760008095509550505050506107df565b5115159450600193505050505b94509492505050565b6107f061273f565b6040516391ec2d2b60e01b815260009030906391ec2d2b906108189087908790600401612cc1565b600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190612ce2565b9050600080600080601885016001600160c01b0381511693506030860190506001600160c01b038151169450600080516020612e0d83398151915285600080516020612e0d833981519152600160c01b870908604887015160608801516001600160c01b0390811697501694509250600080516020612e0d83398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b60008084806109255760405162461bcd60e51b81526004016103d990612c27565b8084146109925760405162461bcd60e51b815260206004820152603560248201527f424c533a206e756d626572206f66207075626c6963206b65797320616e64206d604482015274195cdcd859d95cc81b5d5cdd08189948195c5d585b605a1b60648201526084016103d9565b600061099f826001612c7e565b6109aa906006612c91565b905060008167ffffffffffffffff8111156109c7576109c761277b565b6040519080825280602002602001820160405280156109f0578160200160208202803683370190505b509050896000602002013581600081518110610a0e57610a0e612bef565b6020908102919091010152896001602002013581600181518110610a3457610a34612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281600281518110610a7457610a74612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81600381518110610ab457610ab4612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81600481518110610af457610af4612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81600581518110610b3457610b34612bef565b60200260200101818152505060005b83811015610da857878782818110610b5d57610b5d612bef565b905060400201600060028110610b7557610b75612bef565b602002013582610b86836006612c91565b610b91906006612c7e565b81518110610ba157610ba1612bef565b602002602001018181525050878782818110610bbf57610bbf612bef565b905060400201600160028110610bd757610bd7612bef565b602002013582610be8836006612c91565b610bf3906007612c7e565b81518110610c0357610c03612bef565b602002602001018181525050898982818110610c2157610c21612bef565b905060800201600160048110610c3957610c39612bef565b602002013582610c4a836006612c91565b610c55906008612c7e565b81518110610c6557610c65612bef565b602002602001018181525050898982818110610c8357610c83612bef565b905060800201600060048110610c9b57610c9b612bef565b602002013582610cac836006612c91565b610cb7906009612c7e565b81518110610cc757610cc7612bef565b602002602001018181525050898982818110610ce557610ce5612bef565b905060800201600360048110610cfd57610cfd612bef565b602002013582610d0e836006612c91565b610d1990600a612c7e565b81518110610d2957610d29612bef565b602002602001018181525050898982818110610d4757610d47612bef565b905060800201600260048110610d5f57610d5f612bef565b602002013582610d70836006612c91565b610d7b90600b612c7e565b81518110610d8b57610d8b612bef565b602090810291909101015280610da081612ca8565b915050610b43565b50610db1612721565b602081602085026020850160085afa945084610dd7576000809550955050505050610de4565b5115159450600193505050505b9550959350505050565b80516060906000610e00826020612c7e565b610e0b906040612c7e565b610e16906004612c7e565b67ffffffffffffffff811115610e2e57610e2e61277b565b6040519080825280601f01601f191660200182016040528015610e58576020820181803683370190505b5060408051606080825260808201909252919250600091906020820181803683370190505090506060820160005b84811015610ea05760208188018101518383015201610e86565b5083016000815360010160608153600101600081536001810187905260210160208153506000600283604051610ed69190612d59565b602060405180830381855afa158015610ef3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f169190612d75565b9050600060429450848452816020850152600160408501536041840188905260206061850153600284604051610f4c9190612d59565b602060405180830381855afa158015610f69573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8c9190612d75565b905080602084015280821880602086015250600260408501536041840188905260206061850153600284604051610fc39190612d59565b602060405180830381855afa158015610fe0573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110039190612d75565b90508060408401528082188060208601525060036040850153604184018890526020606185015360028460405161103a9190612d59565b602060405180830381855afa158015611057573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061107a9190612d75565b606084015250909695505050505050565b61109361273f565b604051638669026f60e01b81526000903090638669026f906110bb9087908790600401612cc1565b6040805180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190612d8e565b805160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa15801561113f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111639190612d8e565b602083015160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa1580156111aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190612d8e565b90506111d861275d565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa9050808061121357fe5b50806112615760405162461bcd60e51b815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c656400000000000000000060448201526064016103d9565b50919695505050505050565b61127561273f565b600080516020612e0d83398151915282106112de5760405162461bcd60e51b815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d604482015262195b9d60ea1b60648201526084016103d9565b8160006112ea82611871565b9150506000600080516020612e0d8339815191528061130b5761130b612de3565b8384099050600080516020612e0d8339815191526004820890506000600080516020612e0d83398151915277b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd850990506000600080516020612e0d83398151915283830990506113728161189a565b9050600080516020612e0d8339815191528283099150600080516020612e0d8339815191528183099150600080516020612e0d8339815191528286099150600080516020612e0d8339815191526113d783600080516020612e0d833981519152612df9565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe089450600080516020612e0d8339815191528586099150600080516020612e0d8339815191528583099150600080516020612e0d833981519152600383089150600061143b83611871565b9093509050801561148357846114665761146383600080516020612e0d833981519152612df9565b92505b505060408051808201909152938452602084015250909392505050565b600080516020612e0d833981519152600187086114ae90600080516020612e0d833981519152612df9565b9550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506114f683611871565b9093509050801561151e57846114665761146383600080516020612e0d833981519152612df9565b600080516020612e0d8339815191528485099550600080516020612e0d8339815191528687099550600080516020612e0d8339815191528287099550600080516020612e0d8339815191528287099550600080516020612e0d833981519152600187089550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506115c983611871565b9093509050806116265760405162461bcd60e51b815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201526137b760f11b60648201526084016103d9565b846114665761146383600080516020612e0d833981519152612df9565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528382099050600080516020612e0d833981519152600382089050600080516020612e0d83398151915282830914949350505050565b6000806000604051806101800160405280876000600281106116c6576116c6612bef565b60200201358152602001876001600281106116e3576116e3612bef565b602002013581526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81526020018560006002811061179857611798612bef565b60200201358152602001856001600281106117b5576117b5612bef565b60200201358152602001866001600481106117d2576117d2612bef565b60200201358152602001866000600481106117ef576117ef612bef565b602002013581526020018660036004811061180c5761180c612bef565b602002013581526020018660026004811061182957611829612bef565b60200201359052905061183a612721565b60006020826101808560085afa90508061185d5760008094509450505050611869565b50511515925060019150505b935093915050565b60008061187d836118a5565b915082600080516020612e0d833981519152838409149050915091565b60006103b282611fda565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156127b4576127b461277b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156127e3576127e361277b565b604052919050565b6000608082840312156127fd57600080fd5b82601f83011261280c57600080fd5b6040516080810181811067ffffffffffffffff8211171561282f5761282f61277b565b60405280608084018581111561284457600080fd5b845b8181101561285e578035835260209283019201612846565b509195945050505050565b60006040828403121561287b57600080fd5b82601f83011261288a57600080fd5b612892612791565b8060408401858111156128a457600080fd5b845b818110156128be5780358452602093840193016128a6565b509095945050505050565b80604081018310156103b257600080fd5b60008083601f8401126128ec57600080fd5b50813567ffffffffffffffff81111561290457600080fd5b6020830191508360208260071b850101111561291f57600080fd5b9250929050565b60008060008060a0858703121561293c57600080fd5b61294686866128c9565b9350604085013567ffffffffffffffff81111561296257600080fd5b61296e878288016128da565b9094509250612982905086606087016128c9565b905092959194509250565b600067ffffffffffffffff8211156129a7576129a761277b565b50601f01601f191660200190565b600080604083850312156129c857600080fd5b82359150602083013567ffffffffffffffff8111156129e657600080fd5b8301601f810185136129f757600080fd5b8035612a0a612a058261298d565b6127ba565b818152866020838501011115612a1f57600080fd5b816020840160208301376000602083830101528093505050509250929050565b60408101818360005b6002811015612a67578151835260209283019290910190600101612a48565b50505092915050565b600080600080600060808688031215612a8857600080fd5b612a9287876128c9565b9450604086013567ffffffffffffffff80821115612aaf57600080fd5b612abb89838a016128da565b90965094506060880135915080821115612ad457600080fd5b818801915088601f830112612ae857600080fd5b813581811115612af757600080fd5b8960208260061b8501011115612b0c57600080fd5b9699959850939650602001949392505050565b60005b83811015612b3a578181015183820152602001612b22565b50506000910152565b60008151808452612b5b816020860160208601612b1f565b601f01601f19169290920160200192915050565b602081526000612b826020830184612b43565b9392505050565b600060208284031215612b9b57600080fd5b5035919050565b60008060006101008486031215612bb857600080fd5b612bc285856128c9565b925060c0840185811115612bd557600080fd5b604085019250612be586826128c9565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c1757600080fd5b81518015158114612b8257600080fd5b60208082526021908201527f424c533a206e756d626572206f66207075626c6963206b6579206973207a65726040820152606f60f81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808201808211156103b2576103b2612c68565b80820281158282048414176103b2576103b2612c68565b600060018201612cba57612cba612c68565b5060010190565b828152604060208201526000612cda6040830184612b43565b949350505050565b600060208284031215612cf457600080fd5b815167ffffffffffffffff811115612d0b57600080fd5b8201601f81018413612d1c57600080fd5b8051612d2a612a058261298d565b818152856020838501011115612d3f57600080fd5b612d50826020830160208601612b1f565b95945050505050565b60008251612d6b818460208701612b1f565b9190910192915050565b600060208284031215612d8757600080fd5b5051919050565b600060408284031215612da057600080fd5b82601f830112612daf57600080fd5b612db7612791565b806040840185811115612dc957600080fd5b845b818110156128be578051845260209384019301612dcb565b634e487b7160e01b600052601260045260246000fd5b818103818111156103b2576103b2612c6856fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220046fd04cf652b14b5d4629e14b0659a560d128e873764c278e0250d47ac47cde64736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806391ec2d2b1161006657806391ec2d2b1461013b578063a850a9091461015b578063d58e77331461016e578063e242cce914610181578063ebbdac911461019457600080fd5b8063115000fe146100a3578063247dd9fb146100cb5780633e5476ce146100de5780638669026f146101085780639141376314610128575b600080fd5b6100b66100b13660046127eb565b6101a7565b60405190151581526020015b60405180910390f35b6100b66100d9366004612869565b61030e565b6100f16100ec366004612926565b6103b8565b6040805192151583529015156020830152016100c2565b61011b6101163660046129b5565b6107e8565b6040516100c29190612a3f565b6100f1610136366004612a70565b610904565b61014e6101493660046129b5565b610dee565b6040516100c29190612b6f565b61011b6101693660046129b5565b61108b565b61011b61017c366004612b89565b61126d565b6100b661018f366004612869565b611643565b6100f16101a2366004612ba2565b6116a2565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528283098182830101600080516020612e0d8339815191528283840108600080516020612e0d8339815191528682600080516020612e0d83398151915203860109935050600080516020612e0d8339815191528483600080516020612e0d833981519152038301099150600080516020612e0d8339815191527f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e584089450600080516020612e0d8339815191527e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2830893506040870151925060608701519150600080516020612e0d8339815191528083600080516020612e0d833981519152038508600080516020612e0d833981519152848608099050600080516020612e0d833981519152828460011b0994149290931491909116949350505050565b8051600090600080516020612e0d83398151915211158061034157506020820151600080516020612e0d83398151915211155b1561034e57506000919050565b60405163e242cce960e01b8152309063e242cce990610371908590600401612a3f565b602060405180830381865afa15801561038e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b29190612c05565b92915050565b60008083806103e25760405162461bcd60e51b81526004016103d990612c27565b60405180910390fd5b60006103ef826001612c7e565b6103fa906006612c91565b905060008167ffffffffffffffff8111156104175761041761277b565b604051908082528060200260200182016040528015610440578160200160208202803683370190505b50905088600060200201358160008151811061045e5761045e612bef565b602090810291909101015288600160200201358160018151811061048457610484612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2816002815181106104c4576104c4612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed8160038151811061050457610504612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec8160048151811061054457610544612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8160058151811061058457610584612bef565b60200260200101818152505060005b838110156107a3578635826105a9836006612c91565b6105b4906006612c7e565b815181106105c4576105c4612bef565b60209081029190910101528660016020020135826105e3836006612c91565b6105ee906007612c7e565b815181106105fe576105fe612bef565b60200260200101818152505088888281811061061c5761061c612bef565b90506080020160016004811061063457610634612bef565b602002013582610645836006612c91565b610650906008612c7e565b8151811061066057610660612bef565b60200260200101818152505088888281811061067e5761067e612bef565b90506080020160006004811061069657610696612bef565b6020020135826106a7836006612c91565b6106b2906009612c7e565b815181106106c2576106c2612bef565b6020026020010181815250508888828181106106e0576106e0612bef565b9050608002016003600481106106f8576106f8612bef565b602002013582610709836006612c91565b61071490600a612c7e565b8151811061072457610724612bef565b60200260200101818152505088888281811061074257610742612bef565b90506080020160026004811061075a5761075a612bef565b60200201358261076b836006612c91565b61077690600b612c7e565b8151811061078657610786612bef565b60209081029190910101528061079b81612ca8565b915050610593565b506107ac612721565b602081602085026020850160085afa9450846107d25760008095509550505050506107df565b5115159450600193505050505b94509492505050565b6107f061273f565b6040516391ec2d2b60e01b815260009030906391ec2d2b906108189087908790600401612cc1565b600060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261085d9190810190612ce2565b9050600080600080601885016001600160c01b0381511693506030860190506001600160c01b038151169450600080516020612e0d83398151915285600080516020612e0d833981519152600160c01b870908604887015160608801516001600160c01b0390811697501694509250600080516020612e0d83398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b60008084806109255760405162461bcd60e51b81526004016103d990612c27565b8084146109925760405162461bcd60e51b815260206004820152603560248201527f424c533a206e756d626572206f66207075626c6963206b65797320616e64206d604482015274195cdcd859d95cc81b5d5cdd08189948195c5d585b605a1b60648201526084016103d9565b600061099f826001612c7e565b6109aa906006612c91565b905060008167ffffffffffffffff8111156109c7576109c761277b565b6040519080825280602002602001820160405280156109f0578160200160208202803683370190505b509050896000602002013581600081518110610a0e57610a0e612bef565b6020908102919091010152896001602002013581600181518110610a3457610a34612bef565b6020026020010181815250507f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281600281518110610a7457610a74612bef565b6020026020010181815250507f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81600381518110610ab457610ab4612bef565b6020026020010181815250507f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81600481518110610af457610af4612bef565b6020026020010181815250507f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81600581518110610b3457610b34612bef565b60200260200101818152505060005b83811015610da857878782818110610b5d57610b5d612bef565b905060400201600060028110610b7557610b75612bef565b602002013582610b86836006612c91565b610b91906006612c7e565b81518110610ba157610ba1612bef565b602002602001018181525050878782818110610bbf57610bbf612bef565b905060400201600160028110610bd757610bd7612bef565b602002013582610be8836006612c91565b610bf3906007612c7e565b81518110610c0357610c03612bef565b602002602001018181525050898982818110610c2157610c21612bef565b905060800201600160048110610c3957610c39612bef565b602002013582610c4a836006612c91565b610c55906008612c7e565b81518110610c6557610c65612bef565b602002602001018181525050898982818110610c8357610c83612bef565b905060800201600060048110610c9b57610c9b612bef565b602002013582610cac836006612c91565b610cb7906009612c7e565b81518110610cc757610cc7612bef565b602002602001018181525050898982818110610ce557610ce5612bef565b905060800201600360048110610cfd57610cfd612bef565b602002013582610d0e836006612c91565b610d1990600a612c7e565b81518110610d2957610d29612bef565b602002602001018181525050898982818110610d4757610d47612bef565b905060800201600260048110610d5f57610d5f612bef565b602002013582610d70836006612c91565b610d7b90600b612c7e565b81518110610d8b57610d8b612bef565b602090810291909101015280610da081612ca8565b915050610b43565b50610db1612721565b602081602085026020850160085afa945084610dd7576000809550955050505050610de4565b5115159450600193505050505b9550959350505050565b80516060906000610e00826020612c7e565b610e0b906040612c7e565b610e16906004612c7e565b67ffffffffffffffff811115610e2e57610e2e61277b565b6040519080825280601f01601f191660200182016040528015610e58576020820181803683370190505b5060408051606080825260808201909252919250600091906020820181803683370190505090506060820160005b84811015610ea05760208188018101518383015201610e86565b5083016000815360010160608153600101600081536001810187905260210160208153506000600283604051610ed69190612d59565b602060405180830381855afa158015610ef3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f169190612d75565b9050600060429450848452816020850152600160408501536041840188905260206061850153600284604051610f4c9190612d59565b602060405180830381855afa158015610f69573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8c9190612d75565b905080602084015280821880602086015250600260408501536041840188905260206061850153600284604051610fc39190612d59565b602060405180830381855afa158015610fe0573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110039190612d75565b90508060408401528082188060208601525060036040850153604184018890526020606185015360028460405161103a9190612d59565b602060405180830381855afa158015611057573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061107a9190612d75565b606084015250909695505050505050565b61109361273f565b604051638669026f60e01b81526000903090638669026f906110bb9087908790600401612cc1565b6040805180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb9190612d8e565b805160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa15801561113f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111639190612d8e565b602083015160405163d58e773360e01b81526004810191909152909150600090309063d58e7733906024016040805180830381865afa1580156111aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190612d8e565b90506111d861275d565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa9050808061121357fe5b50806112615760405162461bcd60e51b815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c656400000000000000000060448201526064016103d9565b50919695505050505050565b61127561273f565b600080516020612e0d83398151915282106112de5760405162461bcd60e51b815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d604482015262195b9d60ea1b60648201526084016103d9565b8160006112ea82611871565b9150506000600080516020612e0d8339815191528061130b5761130b612de3565b8384099050600080516020612e0d8339815191526004820890506000600080516020612e0d83398151915277b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd850990506000600080516020612e0d83398151915283830990506113728161189a565b9050600080516020612e0d8339815191528283099150600080516020612e0d8339815191528183099150600080516020612e0d8339815191528286099150600080516020612e0d8339815191526113d783600080516020612e0d833981519152612df9565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe089450600080516020612e0d8339815191528586099150600080516020612e0d8339815191528583099150600080516020612e0d833981519152600383089150600061143b83611871565b9093509050801561148357846114665761146383600080516020612e0d833981519152612df9565b92505b505060408051808201909152938452602084015250909392505050565b600080516020612e0d833981519152600187086114ae90600080516020612e0d833981519152612df9565b9550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506114f683611871565b9093509050801561151e57846114665761146383600080516020612e0d833981519152612df9565b600080516020612e0d8339815191528485099550600080516020612e0d8339815191528687099550600080516020612e0d8339815191528287099550600080516020612e0d8339815191528287099550600080516020612e0d833981519152600187089550600080516020612e0d8339815191528687099250600080516020612e0d8339815191528684099250600080516020612e0d8339815191526003840892506115c983611871565b9093509050806116265760405162461bcd60e51b815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201526137b760f11b60648201526084016103d9565b846114665761146383600080516020612e0d833981519152612df9565b600081516020830151600080516020612e0d833981519152828309600080516020612e0d8339815191528382099050600080516020612e0d833981519152600382089050600080516020612e0d83398151915282830914949350505050565b6000806000604051806101800160405280876000600281106116c6576116c6612bef565b60200201358152602001876001600281106116e3576116e3612bef565b602002013581526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81526020018560006002811061179857611798612bef565b60200201358152602001856001600281106117b5576117b5612bef565b60200201358152602001866001600481106117d2576117d2612bef565b60200201358152602001866000600481106117ef576117ef612bef565b602002013581526020018660036004811061180c5761180c612bef565b602002013581526020018660026004811061182957611829612bef565b60200201359052905061183a612721565b60006020826101808560085afa90508061185d5760008094509450505050611869565b50511515925060019150505b935093915050565b60008061187d836118a5565b915082600080516020612e0d833981519152838409149050915091565b60006103b282611fda565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b6000600080516020612e0d8339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156127b4576127b461277b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156127e3576127e361277b565b604052919050565b6000608082840312156127fd57600080fd5b82601f83011261280c57600080fd5b6040516080810181811067ffffffffffffffff8211171561282f5761282f61277b565b60405280608084018581111561284457600080fd5b845b8181101561285e578035835260209283019201612846565b509195945050505050565b60006040828403121561287b57600080fd5b82601f83011261288a57600080fd5b612892612791565b8060408401858111156128a457600080fd5b845b818110156128be5780358452602093840193016128a6565b509095945050505050565b80604081018310156103b257600080fd5b60008083601f8401126128ec57600080fd5b50813567ffffffffffffffff81111561290457600080fd5b6020830191508360208260071b850101111561291f57600080fd5b9250929050565b60008060008060a0858703121561293c57600080fd5b61294686866128c9565b9350604085013567ffffffffffffffff81111561296257600080fd5b61296e878288016128da565b9094509250612982905086606087016128c9565b905092959194509250565b600067ffffffffffffffff8211156129a7576129a761277b565b50601f01601f191660200190565b600080604083850312156129c857600080fd5b82359150602083013567ffffffffffffffff8111156129e657600080fd5b8301601f810185136129f757600080fd5b8035612a0a612a058261298d565b6127ba565b818152866020838501011115612a1f57600080fd5b816020840160208301376000602083830101528093505050509250929050565b60408101818360005b6002811015612a67578151835260209283019290910190600101612a48565b50505092915050565b600080600080600060808688031215612a8857600080fd5b612a9287876128c9565b9450604086013567ffffffffffffffff80821115612aaf57600080fd5b612abb89838a016128da565b90965094506060880135915080821115612ad457600080fd5b818801915088601f830112612ae857600080fd5b813581811115612af757600080fd5b8960208260061b8501011115612b0c57600080fd5b9699959850939650602001949392505050565b60005b83811015612b3a578181015183820152602001612b22565b50506000910152565b60008151808452612b5b816020860160208601612b1f565b601f01601f19169290920160200192915050565b602081526000612b826020830184612b43565b9392505050565b600060208284031215612b9b57600080fd5b5035919050565b60008060006101008486031215612bb857600080fd5b612bc285856128c9565b925060c0840185811115612bd557600080fd5b604085019250612be586826128c9565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c1757600080fd5b81518015158114612b8257600080fd5b60208082526021908201527f424c533a206e756d626572206f66207075626c6963206b6579206973207a65726040820152606f60f81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808201808211156103b2576103b2612c68565b80820281158282048414176103b2576103b2612c68565b600060018201612cba57612cba612c68565b5060010190565b828152604060208201526000612cda6040830184612b43565b949350505050565b600060208284031215612cf457600080fd5b815167ffffffffffffffff811115612d0b57600080fd5b8201601f81018413612d1c57600080fd5b8051612d2a612a058261298d565b818152856020838501011115612d3f57600080fd5b612d50826020830160208601612b1f565b95945050505050565b60008251612d6b818460208701612b1f565b9190910192915050565b600060208284031215612d8757600080fd5b5051919050565b600060408284031215612da057600080fd5b82601f830112612daf57600080fd5b612db7612791565b806040840185811115612dc957600080fd5b845b818110156128be578051845260209384019301612dcb565b634e487b7160e01b600052601260045260246000fd5b818103818111156103b2576103b2612c6856fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220046fd04cf652b14b5d4629e14b0659a560d128e873764c278e0250d47ac47cde64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var BN256G2Artifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"BN256G2\",\n \"sourceName\": \"contracts/common/BN256G2.sol\",\n \"abi\": [\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_X_IM\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_X_RE\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_Y_IM\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"G2_NEG_Y_RE\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2xx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2xy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2yx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt2yy\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ecTwistAdd\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"s\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1xy\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yx\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"pt1yy\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ecTwistMul\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getFieldModulus\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610e0d806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639b0c399a1161005b5780639b0c399a146100f7578063ad50f9c11461011e578063cbe96a5014610145578063defbcdee1461017857600080fd5b80635120675214610082578063779d890d146100bc578063783bde80146100d0575b600080fd5b6100a97f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81565b6040519081526020015b60405180910390f35b600080516020610db88339815191526100a9565b6100a97f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281565b6100a97f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81565b6100a97f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81565b610158610153366004610c9c565b61018b565b6040805194855260208501939093529183015260608201526080016100b3565b610158610186366004610cf1565b61032a565b60008080808b15801561019c57508a155b80156101a6575089155b80156101b0575088155b1561021a57871580156101c1575086155b80156101cb575085155b80156101d5575084155b61020a576101e5888888886103c1565b61020a5760405162461bcd60e51b815260040161020190610d2c565b60405180910390fd5b508692508591508490508361031b565b87158015610226575086155b8015610230575085155b801561023a575084155b156102775761024b8c8c8c8c6103c1565b6102675760405162461bcd60e51b815260040161020190610d2c565b508a92508991508890508761031b565b6102838c8c8c8c6103c1565b61029f5760405162461bcd60e51b815260040161020190610d2c565b6102ab888888886103c1565b6102c75760405162461bcd60e51b815260040161020190610d2c565b60006102e18d8d8d8d600160008f8f8f8f60016000610476565b90506103118160005b602090810291909101519083015160408401516060850151608086015160a0870151610701565b9450945094509450505b98509850985098945050505050565b600080808060018815801561033d575087155b8015610347575086155b8015610351575085155b15610365575060019750879550600061038d565b610371898989896103c1565b61038d5760405162461bcd60e51b815260040161020190610d2c565b600061039f8b8b8b8b8b87600061076c565b90506103ac8160006102ea565b929e919d509b50909950975050505050505050565b60008060008060006103d5878789896107ef565b90945092506103e6898981816107ef565b90925090506103f782828b8b6107ef565b909250905061040884848484610860565b909450925061045884847f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e57e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2610860565b909450925083158015610469575082155b9998505050505050505050565b61047e610c60565b8815801561048a575087155b156104cc578686868686868660005b60a089019290925260808801929092526060870192909252604086019290925260208581019390935290910201526106f1565b821580156104d8575081155b156104eb578c8c8c8c8c8c866000610499565b6104f785858b8b6107ef565b90955093506105088b8b85856107ef565b6060830152604082015261051e87878b8b6107ef565b909750955061052f8d8d85856107ef565b60a0830152608082018190528714801561054c575060a081015186145b15610591576040810151851480156105675750606081015184145b156105825761057a8d8d8d8d8d8d6108a2565b866000610499565b60016000818180808681610499565b61059d898985856107ef565b90935091506105bd858583600260200201518460035b6020020151610860565b909d509b506105d887878360045b60200201518460056105b3565b909b5099506105e98b8b81816107ef565b909950975061060a89898360045b60200201518460055b60200201516107ef565b909550935061061b89898d8d6107ef565b909950975061062c898985856107ef565b60a083015260808201526106428d8d81816107ef565b9097509550610653878785856107ef565b909750955061066487878b8b610860565b909750955061067585856002610aea565b909350915061068687878585610860565b90975095506106978b8b89896107ef565b602083015281526106aa85858989610860565b909b5099506106bb8d8d8d8d6107ef565b909b5099506106d589898360026020020151846003610600565b909d509b506106e68b8b8f8f610860565b606083015260408201525b9c9b505050505050505050505050565b600080600080600080610712610c7e565b61071c8989610b1d565b909350915061072d8d8d85856107ef565b602083015281526107408b8b85856107ef565b60608301819052604083018290528251602090930151929f929e50909c509a5098505050505050505050565b610774610c60565b87156107e45760018816156107b5578051602082015160408301516060840151608085015160a08601516107b29594939291908d8d8d8d8d8d610476565b90505b6107c38787878787876108a2565b949b509299509097509550935091506107dd600289610d6e565b9750610774565b979650505050505050565b60008061082d600080516020610db8833981519152858809600080516020610db8833981519152858809600080516020610db8833981519152610ba8565b600080516020610db883398151915280868809600080516020610db8833981519152868a09089150915094509492505050565b60008061087c8685600080516020610db8833981519152610ba8565b6108958685600080516020610db8833981519152610ba8565b9150915094509492505050565b6000806000806000806108b3610c60565b6108bf8d8d6003610aea565b602083018190528183526108d591908f8f6107ef565b602083015281526108e88b8b8b8b6107ef565b90995097506108f98d8d8d8d6107ef565b606083015260408201819052610919908260035b60200201518b8b6107ef565b60608301526040820152805161093c908260015b60200201518351846001610600565b6040830151919e509c5061095a908260035b60200201516008610aea565b60a083015260808201526109718d8d8360046105cb565b909d509b50610982898981816107ef565b60a08301526080820152604081015160608201516109a291906004610aea565b60608301819052604083018290526109bc91908f8f610860565b6060830152604082018190526109d49082600361092d565b606083015260408201526109ea8b8b6008610aea565b60208301819052818352610a0091908d8d6107ef565b60208301819052818352610a1791908360046105f7565b602083015280825260408201516060830151610a35928460016105b3565b60608301526040820152610a4b8d8d6002610aea565b6020830152808252610a5f9082600161090d565b60208301528152610a7389898360046105f7565b60a083015260808201819052610a8b9082600561094e565b826004602002018360056020020191909152528060006020020151816001602002015182600260200201518360036020020151846004602002015185600560200201519650965096509650965096505096509650965096509650969050565b600080600080516020610db8833981519152838609600080516020610db883398151915284860991509150935093915050565b60008080610b5e600080516020610db883398151915280878809600080516020610db883398151915287880908600080516020610db8833981519152610bcc565b9050600080516020610db8833981519152818609600080516020610db8833981519152828609610b9c90600080516020610db8833981519152610d90565b92509250509250929050565b60008180610bb857610bb8610d58565b610bc28484610d90565b8508949350505050565b60008060405160208152602080820152602060408201528460608201526002840360808201528360a082015260208160c08360056107d05a03fa90519250905080610c595760405162461bcd60e51b815260206004820152601a60248201527f6572726f722077697468206d6f64756c617220696e76657273650000000000006044820152606401610201565b5092915050565b6040518060c001604052806006906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b600080600080600080600080610100898b031215610cb957600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b600080600080600060a08688031215610d0957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825260129082015271706f696e74206e6f7420696e20637572766560701b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082610d8b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610db157634e487b7160e01b600052601160045260246000fd5b9291505056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212201adcf05e36cc0972d841126d8c6be8c04faf8e0e619d376b86d705cbb30a1c2864736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80639b0c399a1161005b5780639b0c399a146100f7578063ad50f9c11461011e578063cbe96a5014610145578063defbcdee1461017857600080fd5b80635120675214610082578063779d890d146100bc578063783bde80146100d0575b600080fd5b6100a97f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d81565b6040519081526020015b60405180910390f35b600080516020610db88339815191526100a9565b6100a97f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281565b6100a97f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81565b6100a97f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81565b610158610153366004610c9c565b61018b565b6040805194855260208501939093529183015260608201526080016100b3565b610158610186366004610cf1565b61032a565b60008080808b15801561019c57508a155b80156101a6575089155b80156101b0575088155b1561021a57871580156101c1575086155b80156101cb575085155b80156101d5575084155b61020a576101e5888888886103c1565b61020a5760405162461bcd60e51b815260040161020190610d2c565b60405180910390fd5b508692508591508490508361031b565b87158015610226575086155b8015610230575085155b801561023a575084155b156102775761024b8c8c8c8c6103c1565b6102675760405162461bcd60e51b815260040161020190610d2c565b508a92508991508890508761031b565b6102838c8c8c8c6103c1565b61029f5760405162461bcd60e51b815260040161020190610d2c565b6102ab888888886103c1565b6102c75760405162461bcd60e51b815260040161020190610d2c565b60006102e18d8d8d8d600160008f8f8f8f60016000610476565b90506103118160005b602090810291909101519083015160408401516060850151608086015160a0870151610701565b9450945094509450505b98509850985098945050505050565b600080808060018815801561033d575087155b8015610347575086155b8015610351575085155b15610365575060019750879550600061038d565b610371898989896103c1565b61038d5760405162461bcd60e51b815260040161020190610d2c565b600061039f8b8b8b8b8b87600061076c565b90506103ac8160006102ea565b929e919d509b50909950975050505050505050565b60008060008060006103d5878789896107ef565b90945092506103e6898981816107ef565b90925090506103f782828b8b6107ef565b909250905061040884848484610860565b909450925061045884847f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e57e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2610860565b909450925083158015610469575082155b9998505050505050505050565b61047e610c60565b8815801561048a575087155b156104cc578686868686868660005b60a089019290925260808801929092526060870192909252604086019290925260208581019390935290910201526106f1565b821580156104d8575081155b156104eb578c8c8c8c8c8c866000610499565b6104f785858b8b6107ef565b90955093506105088b8b85856107ef565b6060830152604082015261051e87878b8b6107ef565b909750955061052f8d8d85856107ef565b60a0830152608082018190528714801561054c575060a081015186145b15610591576040810151851480156105675750606081015184145b156105825761057a8d8d8d8d8d8d6108a2565b866000610499565b60016000818180808681610499565b61059d898985856107ef565b90935091506105bd858583600260200201518460035b6020020151610860565b909d509b506105d887878360045b60200201518460056105b3565b909b5099506105e98b8b81816107ef565b909950975061060a89898360045b60200201518460055b60200201516107ef565b909550935061061b89898d8d6107ef565b909950975061062c898985856107ef565b60a083015260808201526106428d8d81816107ef565b9097509550610653878785856107ef565b909750955061066487878b8b610860565b909750955061067585856002610aea565b909350915061068687878585610860565b90975095506106978b8b89896107ef565b602083015281526106aa85858989610860565b909b5099506106bb8d8d8d8d6107ef565b909b5099506106d589898360026020020151846003610600565b909d509b506106e68b8b8f8f610860565b606083015260408201525b9c9b505050505050505050505050565b600080600080600080610712610c7e565b61071c8989610b1d565b909350915061072d8d8d85856107ef565b602083015281526107408b8b85856107ef565b60608301819052604083018290528251602090930151929f929e50909c509a5098505050505050505050565b610774610c60565b87156107e45760018816156107b5578051602082015160408301516060840151608085015160a08601516107b29594939291908d8d8d8d8d8d610476565b90505b6107c38787878787876108a2565b949b509299509097509550935091506107dd600289610d6e565b9750610774565b979650505050505050565b60008061082d600080516020610db8833981519152858809600080516020610db8833981519152858809600080516020610db8833981519152610ba8565b600080516020610db883398151915280868809600080516020610db8833981519152868a09089150915094509492505050565b60008061087c8685600080516020610db8833981519152610ba8565b6108958685600080516020610db8833981519152610ba8565b9150915094509492505050565b6000806000806000806108b3610c60565b6108bf8d8d6003610aea565b602083018190528183526108d591908f8f6107ef565b602083015281526108e88b8b8b8b6107ef565b90995097506108f98d8d8d8d6107ef565b606083015260408201819052610919908260035b60200201518b8b6107ef565b60608301526040820152805161093c908260015b60200201518351846001610600565b6040830151919e509c5061095a908260035b60200201516008610aea565b60a083015260808201526109718d8d8360046105cb565b909d509b50610982898981816107ef565b60a08301526080820152604081015160608201516109a291906004610aea565b60608301819052604083018290526109bc91908f8f610860565b6060830152604082018190526109d49082600361092d565b606083015260408201526109ea8b8b6008610aea565b60208301819052818352610a0091908d8d6107ef565b60208301819052818352610a1791908360046105f7565b602083015280825260408201516060830151610a35928460016105b3565b60608301526040820152610a4b8d8d6002610aea565b6020830152808252610a5f9082600161090d565b60208301528152610a7389898360046105f7565b60a083015260808201819052610a8b9082600561094e565b826004602002018360056020020191909152528060006020020151816001602002015182600260200201518360036020020151846004602002015185600560200201519650965096509650965096505096509650965096509650969050565b600080600080516020610db8833981519152838609600080516020610db883398151915284860991509150935093915050565b60008080610b5e600080516020610db883398151915280878809600080516020610db883398151915287880908600080516020610db8833981519152610bcc565b9050600080516020610db8833981519152818609600080516020610db8833981519152828609610b9c90600080516020610db8833981519152610d90565b92509250509250929050565b60008180610bb857610bb8610d58565b610bc28484610d90565b8508949350505050565b60008060405160208152602080820152602060408201528460608201526002840360808201528360a082015260208160c08360056107d05a03fa90519250905080610c595760405162461bcd60e51b815260206004820152601a60248201527f6572726f722077697468206d6f64756c617220696e76657273650000000000006044820152606401610201565b5092915050565b6040518060c001604052806006906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b600080600080600080600080610100898b031215610cb957600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b600080600080600060a08688031215610d0957600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825260129082015271706f696e74206e6f7420696e20637572766560701b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082610d8b57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610db157634e487b7160e01b600052601160045260246000fd5b9291505056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212201adcf05e36cc0972d841126d8c6be8c04faf8e0e619d376b86d705cbb30a1c2864736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var MerkleArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"Merkle\",\n \"sourceName\": \"contracts/common/Merkle.sol\",\n \"abi\": [],\n \"bytecode\": \"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206abc980d4a59a28340d0d3e7161da94ace17866ff22189323189d1aefdf7079964736f6c63430008110033\",\n \"deployedBytecode\": \"0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206abc980d4a59a28340d0d3e7161da94ace17866ff22189323189d1aefdf7079964736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var CheckpointManagerArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"CheckpointManager\",\n \"sourceName\": \"contracts/root/CheckpointManager.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"DOMAIN\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"bls\",\n \"outputs\": [\n {\n \"internalType\": \"contract IBLS\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"bn256G2\",\n \"outputs\": [\n {\n \"internalType\": \"contract IBN256G2\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"chainId\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"checkpointBlockNumbers\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"checkpoints\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"eventRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentCheckpointBlockNumber\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentEpoch\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"currentValidatorSet\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_address\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"votingPower\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentValidatorSetHash\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"currentValidatorSetLength\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"leaf\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"getEventMembershipByBlockNumber\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"leaf\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"getEventMembershipByEpoch\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getEventRootByBlock\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IBLS\",\n \"name\": \"newBls\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract IBN256G2\",\n \"name\": \"newBn256G2\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"chainId_\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_address\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"blsKey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"votingPower\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.Validator[]\",\n \"name\": \"newValidatorSet\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"blockHash\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockRound\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"currentValidatorSetHash\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.CheckpointMetadata\",\n \"name\": \"checkpointMetadata\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"epoch\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"eventRoot\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.Checkpoint\",\n \"name\": \"checkpoint\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"uint256[2]\",\n \"name\": \"signature\",\n \"type\": \"uint256[2]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_address\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256[4]\",\n \"name\": \"blsKey\",\n \"type\": \"uint256[4]\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"votingPower\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ICheckpointManager.Validator[]\",\n \"name\": \"newValidatorSet\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"bitmap\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"submit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalVotingPower\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b5061168b806100206000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806376671808116100a2578063babd4ee411610071578063babd4ee414610293578063d4c8e3e8146102a6578063e416d677146102b9578063e9193d2b146102c2578063f896f1a5146102d557600080fd5b8063766718081461020c57806395b0b027146102155780639a8a059214610240578063b8a242521461024957600080fd5b8063671b3793116100de578063671b3793146101895780636969a25c14610192578063729e7c6e146101e457806373cb1a11146101f757600080fd5b80631d1d4f26146101105780633569ed931461012c57806352a9674b1461013f57806361a0220814610166575b600080fd5b61011960035481565b6040519081526020015b60405180910390f35b61011961013a366004610faa565b6102de565b6101197fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe281565b610179610174366004610fc3565b610312565b6040519015158152602001610123565b61011960055481565b6101c56101a0366004610faa565b600960205260009081526040902080546005909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610123565b6101796101f2366004610fc3565b61038a565b61020a6102053660046110b7565b6103e9565b005b61011960025481565b600654610228906001600160a01b031681565b6040516001600160a01b039091168152602001610123565b61011960015481565b610278610257366004610faa565b60086020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610123565b61020a6102a1366004611142565b61053b565b600754610228906001600160a01b031681565b61011960045481565b6101196102d0366004610faa565b6107c4565b610119600b5481565b60006008816102ee600a856107e5565b6102f9906001611231565b8152602001908152602001600020600201549050919050565b60008061031e876102de565b9050806103725760405162461bcd60e51b815260206004820152601e60248201527f4e4f5f4556454e545f524f4f545f464f525f424c4f434b5f4e554d424552000060448201526064015b60405180910390fd5b61037f8686838787610894565b979650505050505050565b600085815260086020526040812060020154806103725760405162461bcd60e51b815260206004820152601760248201527f4e4f5f4556454e545f524f4f545f464f525f45504f43480000000000000000006044820152606401610369565b600054610100900460ff16158080156104095750600054600160ff909116105b806104235750303b158015610423575060005460ff166001145b6104865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610369565b6000805460ff1916600117905580156104a9576000805461ff0019166101001790555b6001849055600680546001600160a01b038089166001600160a01b031992831617909255600780549288169290911691909117905560038290556104ed83836109e9565b8015610533576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b8660400135600b54146105905760405162461bcd60e51b815260206004820152601a60248201527f494e56414c49445f56414c494441544f525f5345545f484153480000000000006044820152606401610369565b6000600154876020013589600001358a602001358a600001358b604001358d604001358b8b6040516020016105c6929190611244565b60408051601f198184030181528282528051602091820120908301999099528101969096526060860194909452608085019290925260a084015260c083015260e08201526101008101919091526101200160408051601f198184030181528282528051602091820120908301520160408051601f198184030181529082905260065463a850a90960e01b83529092506106e3916001600160a01b039091169063a850a9099061069b907fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe29086906004016112a7565b6040805180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906112fd565b878585610aef565b6002546106f08189610e24565b8735600081815260086020908152604091829020838155908b01356001820155908a013560029091015581101561077357600a8054600181018255600091825260208a01357fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909101556002805490919061076a9061138b565b909155506107a7565b600a805460208a0135919061078a906001906113a4565b8154811061079a5761079a6113b7565b6000918252602090912001555b60208801356004556107b986866109e9565b505050505050505050565b600a81815481106107d457600080fd5b600091825260209091200154905081565b815460009081036107f85750600061088e565b82546000905b808210156108455760006108128383610f01565b600087815260209020909150859082015411156108315780915061083f565b61083c816001611231565b92505b506107fe565b60008211801561087157508361086e866108606001866113a4565b600091825260209091200190565b54145b1561088a576108816001836113a4565b9250505061088e565b5090505b92915050565b6000816108a28160026114b1565b86106108e55760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610369565b866109215760405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa622a0a360a11b6044820152606401610369565b8660005b828110156109db576000868683818110610941576109416113b7565b90506020020135905060028961095791906114d3565b60000361098f5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506109bc565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b6109c760028a6114e7565b985050806109d49061138b565b9050610925565b509094149695505050505050565b60038190556040518190610a039084908390602001611244565b60408051601f198184030181529190528051602090910120600b556000805b82811015610ae6576000858583818110610a3e57610a3e6113b7565b905060c0020160a00135905060008111610a8e5760405162461bcd60e51b8152602060048201526011602482015270564f54494e475f504f5745525f5a45524f60781b6044820152606401610369565b610a988184611231565b9250858583818110610aac57610aac6113b7565b905060c00201600960008481526020019081526020016000208181610ad19190611512565b9050505080610adf9061138b565b9050610a22565b50600555505050565b600354610afa610f8c565b6000805b83811015610ca557610b11868683610f23565b15610c9d5781600003610b65576000818152600960205260409081902081516080810190925260010160048282826020028201915b815481526020019060010190808311610b465750505050509250610c7e565b60008181526009602052604080822081516080810190925260010160048282826020028201915b815481526020019060010190808311610b8c57505060075488516020808b01516040808d01516060808f01518b51958c0151848d0151928d01519451630cbe96a560e41b81526004810198909852602488019590955260448701929092526064860191909152608485019390935260a484019190915260c483019190915260e48201529495506001600160a01b03169363cbe96a50935061010401915050608060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611571565b6060880152604087015260208601528452505b600081815260096020526040902060050154610c9a9083611231565b91505b600101610afe565b5080600003610ce85760405162461bcd60e51b815260206004820152600f60248201526e4249544d41505f49535f454d50545960881b6044820152606401610369565b60036005546002610cf991906114fb565b610d0391906114e7565b8111610d515760405162461bcd60e51b815260206004820152601960248201527f494e53554646494349454e545f564f54494e475f504f574552000000000000006044820152606401610369565b60065460405163ebbdac9160e01b815260009182916001600160a01b039091169063ebbdac9190610d8a908b9088908e906004016115a7565b6040805180830381865afa158015610da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dca9190611622565b91509150818015610dd85750805b6107b95760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610369565b600082815260086020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925282351480610e7657508051610e72906001611231565b8235145b610eb25760405162461bcd60e51b815260206004820152600d60248201526c0929cac82989288be8aa09e869609b1b6044820152606401610369565b8060200151826020013511610efc5760405162461bcd60e51b815260206004820152601060248201526f115354151657d0d21150d2d413d2539560821b6044820152606401610369565b505050565b6000610f1060028484186114e7565b610f1c90848416611231565b9392505050565b600080610f316008846114e7565b90506000610f406008856114d3565b9050848210610f5457600092505050610f1c565b6000600160ff83161b878785818110610f6f57610f6f6113b7565b9050013560f81c60f81b60f81c60ff161611925050509392505050565b60405180608001604052806004906020820280368337509192915050565b600060208284031215610fbc57600080fd5b5035919050565b600080600080600060808688031215610fdb57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8082111561100857600080fd5b818801915088601f83011261101c57600080fd5b81358181111561102b57600080fd5b8960208260051b850101111561104057600080fd5b9699959850939650602001949392505050565b6001600160a01b038116811461106857600080fd5b50565b60008083601f84011261107d57600080fd5b50813567ffffffffffffffff81111561109557600080fd5b60208301915083602060c0830285010111156110b057600080fd5b9250929050565b6000806000806000608086880312156110cf57600080fd5b85356110da81611053565b945060208601356110ea81611053565b935060408601359250606086013567ffffffffffffffff81111561110d57600080fd5b6111198882890161106b565b969995985093965092949392505050565b60006060828403121561113c57600080fd5b50919050565b6000806000806000806000610140888a03121561115e57600080fd5b611168898961112a565b96506111778960608a0161112a565b955061010088018981111561118b57600080fd5b60c0890195503567ffffffffffffffff808211156111a857600080fd5b6111b48b838c0161106b565b90965094506101208a01359150808211156111ce57600080fd5b818a0191508a601f8301126111e257600080fd5b8135818111156111f157600080fd5b8b602082850101111561120357600080fd5b60208301945080935050505092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b8082018082111561088e5761088e61121b565b60208082528181018390526000908460408401835b8681101561129c57823561126c81611053565b6001600160a01b0316825260808385018584013760a0838101359083015260c09283019290910190600101611259565b509695505050505050565b82815260006020604081840152835180604085015260005b818110156112db578581018301518582016060015282016112bf565b506000606082860101526060601f19601f830116850101925050509392505050565b60006040828403121561130f57600080fd5b82601f83011261131e57600080fd5b6040516040810181811067ffffffffffffffff8211171561134f57634e487b7160e01b600052604160045260246000fd5b806040525080604084018581111561136657600080fd5b845b81811015611380578051835260209283019201611368565b509195945050505050565b60006001820161139d5761139d61121b565b5060010190565b8181038181111561088e5761088e61121b565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156114085781600019048211156113ee576113ee61121b565b808516156113fb57918102915b93841c93908002906113d2565b509250929050565b60008261141f5750600161088e565b8161142c5750600061088e565b8160018114611442576002811461144c57611468565b600191505061088e565b60ff84111561145d5761145d61121b565b50506001821b61088e565b5060208310610133831016604e8410600b841016171561148b575081810a61088e565b61149583836113cd565b80600019048211156114a9576114a961121b565b029392505050565b6000610f1c8383611410565b634e487b7160e01b600052601260045260246000fd5b6000826114e2576114e26114bd565b500690565b6000826114f6576114f66114bd565b500490565b808202811582820484141761088e5761088e61121b565b813561151d81611053565b81546001600160a01b0319166001600160a01b0391909116178155602082810160005b600481101561156057813560018286018101919091559183019101611540565b50505060a082013560058201555050565b6000806000806080858703121561158757600080fd5b505082516020840151604085015160609095015191969095509092509050565b61010081016040858337604082018460005b60048110156115d85781518352602092830192909101906001016115b9565b50505060c082018360005b60028110156116025781518352602092830192909101906001016115e3565b505050949350505050565b8051801515811461161d57600080fd5b919050565b6000806040838503121561163557600080fd5b61163e8361160d565b915061164c6020840161160d565b9050925092905056fea264697066735822122037a84625106f0bc27a934fd8211fce0731357b85f1de33a837c165cd866353ed64736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806376671808116100a2578063babd4ee411610071578063babd4ee414610293578063d4c8e3e8146102a6578063e416d677146102b9578063e9193d2b146102c2578063f896f1a5146102d557600080fd5b8063766718081461020c57806395b0b027146102155780639a8a059214610240578063b8a242521461024957600080fd5b8063671b3793116100de578063671b3793146101895780636969a25c14610192578063729e7c6e146101e457806373cb1a11146101f757600080fd5b80631d1d4f26146101105780633569ed931461012c57806352a9674b1461013f57806361a0220814610166575b600080fd5b61011960035481565b6040519081526020015b60405180910390f35b61011961013a366004610faa565b6102de565b6101197fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe281565b610179610174366004610fc3565b610312565b6040519015158152602001610123565b61011960055481565b6101c56101a0366004610faa565b600960205260009081526040902080546005909101546001600160a01b039091169082565b604080516001600160a01b039093168352602083019190915201610123565b6101796101f2366004610fc3565b61038a565b61020a6102053660046110b7565b6103e9565b005b61011960025481565b600654610228906001600160a01b031681565b6040516001600160a01b039091168152602001610123565b61011960015481565b610278610257366004610faa565b60086020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610123565b61020a6102a1366004611142565b61053b565b600754610228906001600160a01b031681565b61011960045481565b6101196102d0366004610faa565b6107c4565b610119600b5481565b60006008816102ee600a856107e5565b6102f9906001611231565b8152602001908152602001600020600201549050919050565b60008061031e876102de565b9050806103725760405162461bcd60e51b815260206004820152601e60248201527f4e4f5f4556454e545f524f4f545f464f525f424c4f434b5f4e554d424552000060448201526064015b60405180910390fd5b61037f8686838787610894565b979650505050505050565b600085815260086020526040812060020154806103725760405162461bcd60e51b815260206004820152601760248201527f4e4f5f4556454e545f524f4f545f464f525f45504f43480000000000000000006044820152606401610369565b600054610100900460ff16158080156104095750600054600160ff909116105b806104235750303b158015610423575060005460ff166001145b6104865760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610369565b6000805460ff1916600117905580156104a9576000805461ff0019166101001790555b6001849055600680546001600160a01b038089166001600160a01b031992831617909255600780549288169290911691909117905560038290556104ed83836109e9565b8015610533576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b8660400135600b54146105905760405162461bcd60e51b815260206004820152601a60248201527f494e56414c49445f56414c494441544f525f5345545f484153480000000000006044820152606401610369565b6000600154876020013589600001358a602001358a600001358b604001358d604001358b8b6040516020016105c6929190611244565b60408051601f198184030181528282528051602091820120908301999099528101969096526060860194909452608085019290925260a084015260c083015260e08201526101008101919091526101200160408051601f198184030181528282528051602091820120908301520160408051601f198184030181529082905260065463a850a90960e01b83529092506106e3916001600160a01b039091169063a850a9099061069b907fbee7fa562a38908559e4a988e62d6c08b84ef05f2ebd5d2bb2b855dc19d19fe29086906004016112a7565b6040805180830381865afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db91906112fd565b878585610aef565b6002546106f08189610e24565b8735600081815260086020908152604091829020838155908b01356001820155908a013560029091015581101561077357600a8054600181018255600091825260208a01357fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909101556002805490919061076a9061138b565b909155506107a7565b600a805460208a0135919061078a906001906113a4565b8154811061079a5761079a6113b7565b6000918252602090912001555b60208801356004556107b986866109e9565b505050505050505050565b600a81815481106107d457600080fd5b600091825260209091200154905081565b815460009081036107f85750600061088e565b82546000905b808210156108455760006108128383610f01565b600087815260209020909150859082015411156108315780915061083f565b61083c816001611231565b92505b506107fe565b60008211801561087157508361086e866108606001866113a4565b600091825260209091200190565b54145b1561088a576108816001836113a4565b9250505061088e565b5090505b92915050565b6000816108a28160026114b1565b86106108e55760405162461bcd60e51b81526020600482015260126024820152710929cac82989288be988a828cbe929c888ab60731b6044820152606401610369565b866109215760405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa622a0a360a11b6044820152606401610369565b8660005b828110156109db576000868683818110610941576109416113b7565b90506020020135905060028961095791906114d3565b60000361098f5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506109bc565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b6109c760028a6114e7565b985050806109d49061138b565b9050610925565b509094149695505050505050565b60038190556040518190610a039084908390602001611244565b60408051601f198184030181529190528051602090910120600b556000805b82811015610ae6576000858583818110610a3e57610a3e6113b7565b905060c0020160a00135905060008111610a8e5760405162461bcd60e51b8152602060048201526011602482015270564f54494e475f504f5745525f5a45524f60781b6044820152606401610369565b610a988184611231565b9250858583818110610aac57610aac6113b7565b905060c00201600960008481526020019081526020016000208181610ad19190611512565b9050505080610adf9061138b565b9050610a22565b50600555505050565b600354610afa610f8c565b6000805b83811015610ca557610b11868683610f23565b15610c9d5781600003610b65576000818152600960205260409081902081516080810190925260010160048282826020028201915b815481526020019060010190808311610b465750505050509250610c7e565b60008181526009602052604080822081516080810190925260010160048282826020028201915b815481526020019060010190808311610b8c57505060075488516020808b01516040808d01516060808f01518b51958c0151848d0151928d01519451630cbe96a560e41b81526004810198909852602488019590955260448701929092526064860191909152608485019390935260a484019190915260c483019190915260e48201529495506001600160a01b03169363cbe96a50935061010401915050608060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611571565b6060880152604087015260208601528452505b600081815260096020526040902060050154610c9a9083611231565b91505b600101610afe565b5080600003610ce85760405162461bcd60e51b815260206004820152600f60248201526e4249544d41505f49535f454d50545960881b6044820152606401610369565b60036005546002610cf991906114fb565b610d0391906114e7565b8111610d515760405162461bcd60e51b815260206004820152601960248201527f494e53554646494349454e545f564f54494e475f504f574552000000000000006044820152606401610369565b60065460405163ebbdac9160e01b815260009182916001600160a01b039091169063ebbdac9190610d8a908b9088908e906004016115a7565b6040805180830381865afa158015610da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dca9190611622565b91509150818015610dd85750805b6107b95760405162461bcd60e51b815260206004820152601d60248201527f5349474e41545552455f564552494649434154494f4e5f4641494c45440000006044820152606401610369565b600082815260086020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925282351480610e7657508051610e72906001611231565b8235145b610eb25760405162461bcd60e51b815260206004820152600d60248201526c0929cac82989288be8aa09e869609b1b6044820152606401610369565b8060200151826020013511610efc5760405162461bcd60e51b815260206004820152601060248201526f115354151657d0d21150d2d413d2539560821b6044820152606401610369565b505050565b6000610f1060028484186114e7565b610f1c90848416611231565b9392505050565b600080610f316008846114e7565b90506000610f406008856114d3565b9050848210610f5457600092505050610f1c565b6000600160ff83161b878785818110610f6f57610f6f6113b7565b9050013560f81c60f81b60f81c60ff161611925050509392505050565b60405180608001604052806004906020820280368337509192915050565b600060208284031215610fbc57600080fd5b5035919050565b600080600080600060808688031215610fdb57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8082111561100857600080fd5b818801915088601f83011261101c57600080fd5b81358181111561102b57600080fd5b8960208260051b850101111561104057600080fd5b9699959850939650602001949392505050565b6001600160a01b038116811461106857600080fd5b50565b60008083601f84011261107d57600080fd5b50813567ffffffffffffffff81111561109557600080fd5b60208301915083602060c0830285010111156110b057600080fd5b9250929050565b6000806000806000608086880312156110cf57600080fd5b85356110da81611053565b945060208601356110ea81611053565b935060408601359250606086013567ffffffffffffffff81111561110d57600080fd5b6111198882890161106b565b969995985093965092949392505050565b60006060828403121561113c57600080fd5b50919050565b6000806000806000806000610140888a03121561115e57600080fd5b611168898961112a565b96506111778960608a0161112a565b955061010088018981111561118b57600080fd5b60c0890195503567ffffffffffffffff808211156111a857600080fd5b6111b48b838c0161106b565b90965094506101208a01359150808211156111ce57600080fd5b818a0191508a601f8301126111e257600080fd5b8135818111156111f157600080fd5b8b602082850101111561120357600080fd5b60208301945080935050505092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b8082018082111561088e5761088e61121b565b60208082528181018390526000908460408401835b8681101561129c57823561126c81611053565b6001600160a01b0316825260808385018584013760a0838101359083015260c09283019290910190600101611259565b509695505050505050565b82815260006020604081840152835180604085015260005b818110156112db578581018301518582016060015282016112bf565b506000606082860101526060601f19601f830116850101925050509392505050565b60006040828403121561130f57600080fd5b82601f83011261131e57600080fd5b6040516040810181811067ffffffffffffffff8211171561134f57634e487b7160e01b600052604160045260246000fd5b806040525080604084018581111561136657600080fd5b845b81811015611380578051835260209283019201611368565b509195945050505050565b60006001820161139d5761139d61121b565b5060010190565b8181038181111561088e5761088e61121b565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156114085781600019048211156113ee576113ee61121b565b808516156113fb57918102915b93841c93908002906113d2565b509250929050565b60008261141f5750600161088e565b8161142c5750600061088e565b8160018114611442576002811461144c57611468565b600191505061088e565b60ff84111561145d5761145d61121b565b50506001821b61088e565b5060208310610133831016604e8410600b841016171561148b575081810a61088e565b61149583836113cd565b80600019048211156114a9576114a961121b565b029392505050565b6000610f1c8383611410565b634e487b7160e01b600052601260045260246000fd5b6000826114e2576114e26114bd565b500690565b6000826114f6576114f66114bd565b500490565b808202811582820484141761088e5761088e61121b565b813561151d81611053565b81546001600160a01b0319166001600160a01b0391909116178155602082810160005b600481101561156057813560018286018101919091559183019101611540565b50505060a082013560058201555050565b6000806000806080858703121561158757600080fd5b505082516020840151604085015160609095015191969095509092509050565b61010081016040858337604082018460005b60048110156115d85781518352602092830192909101906001016115b9565b50505060c082018360005b60028110156116025781518352602092830192909101906001016115e3565b505050949350505050565b8051801515811461161d57600080fd5b919050565b6000806040838503121561163557600080fd5b61163e8361160d565b915061164c6020840161160d565b9050925092905056fea264697066735822122037a84625106f0bc27a934fd8211fce0731357b85f1de33a837c165cd866353ed64736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var ExitHelperArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"ExitHelper\",\n \"sourceName\": \"contracts/root/ExitHelper.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"returnData\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"ExitProcessed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"unhashedLeaf\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"internalType\": \"struct IExitHelper.BatchExitInput[]\",\n \"name\": \"inputs\",\n \"type\": \"tuple[]\"\n }\n ],\n \"name\": \"batchExit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"checkpointManager\",\n \"outputs\": [\n {\n \"internalType\": \"contract ICheckpointManager\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"blockNumber\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"leafIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"unhashedLeaf\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"proof\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"name\": \"exit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract ICheckpointManager\",\n \"name\": \"newCheckpointManager\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"processedExits\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610b8b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806350607b351461005c578063aa209cc314610071578063bd88ea7914610084578063c0857ba0146100bc578063c4d66de8146100e7575b600080fd5b61006f61006a366004610729565b6100fa565b005b61006f61007f36600461076b565b61022c565b6100a761009236600461081c565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6002546100cf906001600160a01b031681565b6040516001600160a01b0390911681526020016100b3565b61006f6100f536600461084d565b61029c565b6002546001600160a01b03166101575760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a4544000000000060448201526064015b60405180910390fd5b8060005b818110156102265761021e84848381811061017857610178610871565b905060200281019061018a9190610887565b3585858481811061019d5761019d610871565b90506020028101906101af9190610887565b602001358686858181106101c5576101c5610871565b90506020028101906101d79190610887565b6101e59060408101906108a7565b8888878181106101f7576101f7610871565b90506020028101906102099190610887565b6102179060608101906108ee565b600161042e565b60010161015b565b50505050565b6002546001600160a01b03166102845760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a45440000000000604482015260640161014e565b610294868686868686600061042e565b505050505050565b600054610100900460ff16158080156102bc5750600054600160ff909116105b806102d65750303b1580156102d6575060005460ff166001145b6103395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161014e565b6000805460ff19166001179055801561035c576000805461ff0019166101001790555b6001600160a01b0382161580159061037d57506001600160a01b0382163b15155b6103c95760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a20494e56414c49445f414444524553530000000000604482015260640161014e565b600280546001600160a01b0319166001600160a01b038416179055801561042a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600080808061043f888a018a61094e565b935093509350935084156104725760008481526001602052604090205460ff161561046d57505050506106d4565b6104dc565b60008481526001602052604090205460ff16156104dc5760405162461bcd60e51b815260206004820152602260248201527f4578697448656c7065723a20455849545f414c52454144595f50524f43455353604482015261115160f21b606482015260840161014e565b6002546040516001600160a01b03909116906361a02208908d90610503908d908d90610a2e565b6040519081900381206001600160e01b031960e085901b16825261053092918f908d908d90600401610a3e565b602060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190610a8b565b6105bd5760405162461bcd60e51b815260206004820152601960248201527f4578697448656c7065723a20494e56414c49445f50524f4f4600000000000000604482015260640161014e565b6000848152600160208190526040808320805460ff19169092179091555181906001600160a01b038516906105fa90889088908790602401610afd565b60408051601f198184030181529181526020820180516001600160e01b031663f43cda8b60e01b1790525161062f9190610b30565b6000604051808303816000865af19150503d806000811461066c576040519150601f19603f3d011682016040523d82523d6000602084013e610671565b606091505b509150915081610692576000868152600160205260409020805460ff191690555b811515867f8bbfa0c9bee3785c03700d2a909592286efb83fc7e7002be5764424b9842f7ec836040516106c59190610b42565b60405180910390a35050505050505b50505050505050565b60008083601f8401126106ef57600080fd5b50813567ffffffffffffffff81111561070757600080fd5b6020830191508360208260051b850101111561072257600080fd5b9250929050565b6000806020838503121561073c57600080fd5b823567ffffffffffffffff81111561075357600080fd5b61075f858286016106dd565b90969095509350505050565b6000806000806000806080878903121561078457600080fd5b8635955060208701359450604087013567ffffffffffffffff808211156107aa57600080fd5b818901915089601f8301126107be57600080fd5b8135818111156107cd57600080fd5b8a60208285010111156107df57600080fd5b6020830196508095505060608901359150808211156107fd57600080fd5b5061080a89828a016106dd565b979a9699509497509295939492505050565b60006020828403121561082e57600080fd5b5035919050565b6001600160a01b038116811461084a57600080fd5b50565b60006020828403121561085f57600080fd5b813561086a81610835565b9392505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261089d57600080fd5b9190910192915050565b6000808335601e198436030181126108be57600080fd5b83018035915067ffffffffffffffff8211156108d957600080fd5b60200191503681900382131561072257600080fd5b6000808335601e1984360301811261090557600080fd5b83018035915067ffffffffffffffff82111561092057600080fd5b6020019150600581901b360382131561072257600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561096457600080fd5b84359350602085013561097681610835565b9250604085013561098681610835565b9150606085013567ffffffffffffffff808211156109a357600080fd5b818701915087601f8301126109b757600080fd5b8135818111156109c9576109c9610938565b604051601f8201601f19908116603f011681019083821181831017156109f1576109f1610938565b816040528281528a6020848701011115610a0a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8183823760009101908152919050565b85815284602082015283604082015260806060820152816080820152600060018060fb1b03831115610a6f57600080fd5b8260051b808560a08501379190910160a0019695505050505050565b600060208284031215610a9d57600080fd5b8151801515811461086a57600080fd5b60005b83811015610ac8578181015183820152602001610ab0565b50506000910152565b60008151808452610ae9816020860160208601610aad565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090610b2790830184610ad1565b95945050505050565b6000825161089d818460208701610aad565b60208152600061086a6020830184610ad156fea264697066735822122015950e3b9ae768ee45b864abec459fdba63c937e8210e6e641a0e05caa1a584364736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100575760003560e01c806350607b351461005c578063aa209cc314610071578063bd88ea7914610084578063c0857ba0146100bc578063c4d66de8146100e7575b600080fd5b61006f61006a366004610729565b6100fa565b005b61006f61007f36600461076b565b61022c565b6100a761009236600461081c565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6002546100cf906001600160a01b031681565b6040516001600160a01b0390911681526020016100b3565b61006f6100f536600461084d565b61029c565b6002546001600160a01b03166101575760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a4544000000000060448201526064015b60405180910390fd5b8060005b818110156102265761021e84848381811061017857610178610871565b905060200281019061018a9190610887565b3585858481811061019d5761019d610871565b90506020028101906101af9190610887565b602001358686858181106101c5576101c5610871565b90506020028101906101d79190610887565b6101e59060408101906108a7565b8888878181106101f7576101f7610871565b90506020028101906102099190610887565b6102179060608101906108ee565b600161042e565b60010161015b565b50505050565b6002546001600160a01b03166102845760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a204e4f545f494e495449414c495a45440000000000604482015260640161014e565b610294868686868686600061042e565b505050505050565b600054610100900460ff16158080156102bc5750600054600160ff909116105b806102d65750303b1580156102d6575060005460ff166001145b6103395760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161014e565b6000805460ff19166001179055801561035c576000805461ff0019166101001790555b6001600160a01b0382161580159061037d57506001600160a01b0382163b15155b6103c95760405162461bcd60e51b815260206004820152601b60248201527f4578697448656c7065723a20494e56414c49445f414444524553530000000000604482015260640161014e565b600280546001600160a01b0319166001600160a01b038416179055801561042a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600080808061043f888a018a61094e565b935093509350935084156104725760008481526001602052604090205460ff161561046d57505050506106d4565b6104dc565b60008481526001602052604090205460ff16156104dc5760405162461bcd60e51b815260206004820152602260248201527f4578697448656c7065723a20455849545f414c52454144595f50524f43455353604482015261115160f21b606482015260840161014e565b6002546040516001600160a01b03909116906361a02208908d90610503908d908d90610a2e565b6040519081900381206001600160e01b031960e085901b16825261053092918f908d908d90600401610a3e565b602060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190610a8b565b6105bd5760405162461bcd60e51b815260206004820152601960248201527f4578697448656c7065723a20494e56414c49445f50524f4f4600000000000000604482015260640161014e565b6000848152600160208190526040808320805460ff19169092179091555181906001600160a01b038516906105fa90889088908790602401610afd565b60408051601f198184030181529181526020820180516001600160e01b031663f43cda8b60e01b1790525161062f9190610b30565b6000604051808303816000865af19150503d806000811461066c576040519150601f19603f3d011682016040523d82523d6000602084013e610671565b606091505b509150915081610692576000868152600160205260409020805460ff191690555b811515867f8bbfa0c9bee3785c03700d2a909592286efb83fc7e7002be5764424b9842f7ec836040516106c59190610b42565b60405180910390a35050505050505b50505050505050565b60008083601f8401126106ef57600080fd5b50813567ffffffffffffffff81111561070757600080fd5b6020830191508360208260051b850101111561072257600080fd5b9250929050565b6000806020838503121561073c57600080fd5b823567ffffffffffffffff81111561075357600080fd5b61075f858286016106dd565b90969095509350505050565b6000806000806000806080878903121561078457600080fd5b8635955060208701359450604087013567ffffffffffffffff808211156107aa57600080fd5b818901915089601f8301126107be57600080fd5b8135818111156107cd57600080fd5b8a60208285010111156107df57600080fd5b6020830196508095505060608901359150808211156107fd57600080fd5b5061080a89828a016106dd565b979a9699509497509295939492505050565b60006020828403121561082e57600080fd5b5035919050565b6001600160a01b038116811461084a57600080fd5b50565b60006020828403121561085f57600080fd5b813561086a81610835565b9392505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261089d57600080fd5b9190910192915050565b6000808335601e198436030181126108be57600080fd5b83018035915067ffffffffffffffff8211156108d957600080fd5b60200191503681900382131561072257600080fd5b6000808335601e1984360301811261090557600080fd5b83018035915067ffffffffffffffff82111561092057600080fd5b6020019150600581901b360382131561072257600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561096457600080fd5b84359350602085013561097681610835565b9250604085013561098681610835565b9150606085013567ffffffffffffffff808211156109a357600080fd5b818701915087601f8301126109b757600080fd5b8135818111156109c9576109c9610938565b604051601f8201601f19908116603f011681019083821181831017156109f1576109f1610938565b816040528281528a6020848701011115610a0a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8183823760009101908152919050565b85815284602082015283604082015260806060820152816080820152600060018060fb1b03831115610a6f57600080fd5b8260051b808560a08501379190910160a0019695505050505050565b600060208284031215610a9d57600080fd5b8151801515811461086a57600080fd5b60005b83811015610ac8578181015183820152602001610ab0565b50506000910152565b60008151808452610ae9816020860160208601610aad565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090610b2790830184610ad1565b95945050505050565b6000825161089d818460208701610aad565b60208152600061086a6020830184610ad156fea264697066735822122015950e3b9ae768ee45b864abec459fdba63c937e8210e6e641a0e05caa1a584364736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var StateSenderArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"StateSender\",\n \"sourceName\": \"contracts/root/StateSender.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"StateSynced\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_LENGTH\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"counter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"syncState\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fd1d7f6609674cc5871fdb4b0bcd4f0a214118411de9e38983866514f22659165858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea2646970667358221220f8a17f835a121e627d506f2fe72e05d5d9e2cf528975ae9cd0a32556de49d8a564736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100415760003560e01c806316f198311461004657806361bc221a1461005b578063a6f9885c14610076575b600080fd5b61005961005436600461017a565b61007f565b005b61006460005481565b60405190815260200160405180910390f35b61006461080081565b6001600160a01b0383166100cd5760405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b60448201526064015b60405180910390fd5b6108008111156101145760405162461bcd60e51b815260206004820152601260248201527108ab0868a8a88a6be9a82b0be988a9c8ea8960731b60448201526064016100c4565b826001600160a01b0316336001600160a01b031660008081546101369061020b565b9190508190557fd1d7f6609674cc5871fdb4b0bcd4f0a214118411de9e38983866514f22659165858560405161016d929190610232565b60405180910390a4505050565b60008060006040848603121561018f57600080fd5b83356001600160a01b03811681146101a657600080fd5b9250602084013567ffffffffffffffff808211156101c357600080fd5b818601915086601f8301126101d757600080fd5b8135818111156101e657600080fd5b8760208285010111156101f857600080fd5b6020830194508093505050509250925092565b60006001820161022b57634e487b7160e01b600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f1916010191905056fea2646970667358221220f8a17f835a121e627d506f2fe72e05d5d9e2cf528975ae9cd0a32556de49d8a564736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var RootERC20PredicateArtifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"RootERC20Predicate\",\n \"sourceName\": \"contracts/root/RootERC20Predicate.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"depositor\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC20Deposit\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"withdrawer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ERC20Withdraw\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint8\",\n \"name\": \"version\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"Initialized\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"childToken\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TokenMapped\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"DEPOSIT_SIG\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAP_TOKEN_SIG\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"WITHDRAW_SIG\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"childERC20Predicate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"childTokenTemplate\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IERC20Metadata\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"deposit\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IERC20Metadata\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"receiver\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"depositTo\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"exitHelper\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newStateSender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newExitHelper\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newChildERC20Predicate\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"newChildTokenTemplate\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nativeTokenRootAddress\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"initialize\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IERC20Metadata\",\n \"name\": \"rootToken\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"mapToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"onL2StateReceive\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"rootTokenToChildToken\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"stateSender\",\n \"outputs\": [\n {\n \"internalType\": \"contract IStateSender\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x608060405234801561001057600080fd5b506113bd806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063cb10f94c1161008c578063f213159c11610066578063f213159c146101f0578063f43cda8b14610203578063f4a120f714610216578063f64512551461022957600080fd5b8063cb10f94c1461019d578063d41f1771146101b6578063d57184e4146101dd57600080fd5b80631459457a146100d457806347e7ef24146100e95780637efab4f5146100fc57806395c7041c14610142578063b176806514610155578063b68ad1e41461018a575b600080fd5b6100e76100e2366004610f5a565b610250565b005b6100e76100f7366004610fcb565b6104be565b61012561010a366004610ff7565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b600154610125906001600160a01b031681565b61017c7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b604051908152602001610139565b600354610125906001600160a01b031681565b600054610125906201000090046001600160a01b031681565b61017c7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b600254610125906001600160a01b031681565b6100e76101fe36600461101b565b6104cd565b6100e761021136600461105c565b6104dd565b6100e7610224366004610ff7565b610664565b61017c7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b600054610100900460ff16158080156102705750600054600160ff909116105b8061028a5750303b15801561028a575060005460ff166001145b6102f25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610315576000805461ff0019166101001790555b6001600160a01b0386161580159061033557506001600160a01b03851615155b801561034957506001600160a01b03841615155b801561035d57506001600160a01b03831615155b6103b85760405162461bcd60e51b815260206004820152602660248201527f526f6f7445524332305072656469636174653a204241445f494e495449414c496044820152652d20aa24a7a760d11b60648201526084016102e9565b6000805462010000600160b01b031916620100006001600160a01b038981169190910291909117909155600180546001600160a01b03199081168884161790915560028054821687841617905560038054909116858316179055821615610470576001600160a01b03821660008181526004602052604080822080546001600160a01b03191661101090811790915590519092917f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e61791a35b80156104b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6104c9823383610a1b565b5050565b6104d8838383610a1b565b505050565b6001546001600160a01b031633146105435760405162461bcd60e51b8152602060048201526024808201527f526f6f7445524332305072656469636174653a204f4e4c595f455849545f4845604482015263262822a960e11b60648201526084016102e9565b6002546001600160a01b038481169116146105b15760405162461bcd60e51b815260206004820152602860248201527f526f6f7445524332305072656469636174653a204f4e4c595f4348494c445f50604482015267524544494341544560c01b60648201526084016102e9565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696105e06020600084866110e5565b6105e99161110f565b03610608576106036105fe82602081866110e5565b610b95565b61065e565b60405162461bcd60e51b815260206004820152602560248201527f526f6f7445524332305072656469636174653a20494e56414c49445f5349474e604482015264415455524560d81b60648201526084016102e9565b50505050565b6001600160a01b0381166106c45760405162461bcd60e51b815260206004820152602160248201527f526f6f7445524332305072656469636174653a20494e56414c49445f544f4b456044820152602760f91b60648201526084016102e9565b6001600160a01b0381811660009081526004602052604090205416156107375760405162461bcd60e51b815260206004820152602260248201527f526f6f7445524332305072656469636174653a20414c52454144595f4d415050604482015261115160f21b60648201526084016102e9565b60035460408051606084901b6bffffffffffffffffffffffff19166020808301919091528251601481840301815260348301808552815191909201206002546001600160a01b03908116606c8501526f5af43d82803e903d91602b57fd5bf3ff60588501529094166048830152733d602d80600a3d3981f3363d3d373d3d3d363d739052608c81019290925260379082012060ac82015260556077909101206000906001600160a01b03838116600081815260046020819052604080832080546001600160a01b031916878716179055825460025482516306fdde0360e01b81529251979850620100009091048616966316f198319691909116947f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad948a9491936306fdde03938184019390918290030181865afa15801561087d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108a59190810190611168565b876001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090b9190810190611168565b886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096d919061120a565b604051602001610981959493929190611259565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016109ad9291906112ab565b600060405180830381600087803b1580156109c757600080fd5b505af11580156109db573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e61790600090a35050565b6001600160a01b0383811660009081526004602052604090205416610a4357610a4383610664565b6001600160a01b038084166000908152600460205260409020541680610a6b57610a6b6112cf565b610a806001600160a01b038516333085610c45565b600054600254604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352620100009094048416936316f1983193610b119391169160c4016112ab565b600060405180830381600087803b158015610b2b57600080fd5b505af1158015610b3f573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917f8be9001bb612c7123a1861dc0d9d94e683261f6cbbd7c7438b708975bc4908a3910160405180910390a450505050565b6000808080610ba6858701876112e5565b6001600160a01b0380851660009081526004602052604090205494985092965090945092501680610bd957610bd96112cf565b610bed6001600160a01b0386168484610cb0565b604080516001600160a01b038681168252602082018590528086169284821692918916917f9c4f744b2e971d7058a9d8f43977e0e17bf7d57a48659f0e18541b7ee3d022e4910160405180910390a450505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261065e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610ce0565b6040516001600160a01b0383166024820152604481018290526104d890849063a9059cbb60e01b90606401610c79565b6000610d35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610db29092919063ffffffff16565b8051909150156104d85780806020019051810190610d539190611336565b6104d85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102e9565b6060610dc18484600085610dc9565b949350505050565b606082471015610e2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102e9565b600080866001600160a01b03168587604051610e469190611358565b60006040518083038185875af1925050503d8060008114610e83576040519150601f19603f3d011682016040523d82523d6000602084013e610e88565b606091505b5091509150610e9987838387610ea4565b979650505050505050565b60608315610f13578251600003610f0c576001600160a01b0385163b610f0c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102e9565b5081610dc1565b610dc18383815115610f285781518083602001fd5b8060405162461bcd60e51b81526004016102e99190611374565b6001600160a01b0381168114610f5757600080fd5b50565b600080600080600060a08688031215610f7257600080fd5b8535610f7d81610f42565b94506020860135610f8d81610f42565b93506040860135610f9d81610f42565b92506060860135610fad81610f42565b91506080860135610fbd81610f42565b809150509295509295909350565b60008060408385031215610fde57600080fd5b8235610fe981610f42565b946020939093013593505050565b60006020828403121561100957600080fd5b813561101481610f42565b9392505050565b60008060006060848603121561103057600080fd5b833561103b81610f42565b9250602084013561104b81610f42565b929592945050506040919091013590565b6000806000806060858703121561107257600080fd5b84359350602085013561108481610f42565b9250604085013567ffffffffffffffff808211156110a157600080fd5b818701915087601f8301126110b557600080fd5b8135818111156110c457600080fd5b8860208285010111156110d657600080fd5b95989497505060200194505050565b600080858511156110f557600080fd5b8386111561110257600080fd5b5050820193919092039150565b8035602083101561112857600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561115f578181015183820152602001611147565b50506000910152565b60006020828403121561117a57600080fd5b815167ffffffffffffffff8082111561119257600080fd5b818401915084601f8301126111a657600080fd5b8151818111156111b8576111b861112e565b604051601f8201601f19908116603f011681019083821181831017156111e0576111e061112e565b816040528281528760208487010111156111f957600080fd5b610e99836020830160208801611144565b60006020828403121561121c57600080fd5b815160ff8116811461101457600080fd5b60008151808452611245816020860160208601611144565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a0604082018190526000906112839083018661122d565b8281036060840152611295818661122d565b91505060ff831660808301529695505050505050565b6001600160a01b0383168152604060208201819052600090610dc19083018461122d565b634e487b7160e01b600052600160045260246000fd5b600080600080608085870312156112fb57600080fd5b843561130681610f42565b9350602085013561131681610f42565b9250604085013561132681610f42565b9396929550929360600135925050565b60006020828403121561134857600080fd5b8151801515811461101457600080fd5b6000825161136a818460208701611144565b9190910192915050565b602081526000611014602083018461122d56fea264697066735822122004c3a8a362434a433974726c40ffa2b36429c5374d5d526487c70de6f6e54be864736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063cb10f94c1161008c578063f213159c11610066578063f213159c146101f0578063f43cda8b14610203578063f4a120f714610216578063f64512551461022957600080fd5b8063cb10f94c1461019d578063d41f1771146101b6578063d57184e4146101dd57600080fd5b80631459457a146100d457806347e7ef24146100e95780637efab4f5146100fc57806395c7041c14610142578063b176806514610155578063b68ad1e41461018a575b600080fd5b6100e76100e2366004610f5a565b610250565b005b6100e76100f7366004610fcb565b6104be565b61012561010a366004610ff7565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b600154610125906001600160a01b031681565b61017c7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e98286981565b604051908152602001610139565b600354610125906001600160a01b031681565b600054610125906201000090046001600160a01b031681565b61017c7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b600254610125906001600160a01b031681565b6100e76101fe36600461101b565b6104cd565b6100e761021136600461105c565b6104dd565b6100e7610224366004610ff7565b610664565b61017c7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b600054610100900460ff16158080156102705750600054600160ff909116105b8061028a5750303b15801561028a575060005460ff166001145b6102f25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610315576000805461ff0019166101001790555b6001600160a01b0386161580159061033557506001600160a01b03851615155b801561034957506001600160a01b03841615155b801561035d57506001600160a01b03831615155b6103b85760405162461bcd60e51b815260206004820152602660248201527f526f6f7445524332305072656469636174653a204241445f494e495449414c496044820152652d20aa24a7a760d11b60648201526084016102e9565b6000805462010000600160b01b031916620100006001600160a01b038981169190910291909117909155600180546001600160a01b03199081168884161790915560028054821687841617905560038054909116858316179055821615610470576001600160a01b03821660008181526004602052604080822080546001600160a01b03191661101090811790915590519092917f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e61791a35b80156104b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6104c9823383610a1b565b5050565b6104d8838383610a1b565b505050565b6001546001600160a01b031633146105435760405162461bcd60e51b8152602060048201526024808201527f526f6f7445524332305072656469636174653a204f4e4c595f455849545f4845604482015263262822a960e11b60648201526084016102e9565b6002546001600160a01b038481169116146105b15760405162461bcd60e51b815260206004820152602860248201527f526f6f7445524332305072656469636174653a204f4e4c595f4348494c445f50604482015267524544494341544560c01b60648201526084016102e9565b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696105e06020600084866110e5565b6105e99161110f565b03610608576106036105fe82602081866110e5565b610b95565b61065e565b60405162461bcd60e51b815260206004820152602560248201527f526f6f7445524332305072656469636174653a20494e56414c49445f5349474e604482015264415455524560d81b60648201526084016102e9565b50505050565b6001600160a01b0381166106c45760405162461bcd60e51b815260206004820152602160248201527f526f6f7445524332305072656469636174653a20494e56414c49445f544f4b456044820152602760f91b60648201526084016102e9565b6001600160a01b0381811660009081526004602052604090205416156107375760405162461bcd60e51b815260206004820152602260248201527f526f6f7445524332305072656469636174653a20414c52454144595f4d415050604482015261115160f21b60648201526084016102e9565b60035460408051606084901b6bffffffffffffffffffffffff19166020808301919091528251601481840301815260348301808552815191909201206002546001600160a01b03908116606c8501526f5af43d82803e903d91602b57fd5bf3ff60588501529094166048830152733d602d80600a3d3981f3363d3d373d3d3d363d739052608c81019290925260379082012060ac82015260556077909101206000906001600160a01b03838116600081815260046020819052604080832080546001600160a01b031916878716179055825460025482516306fdde0360e01b81529251979850620100009091048616966316f198319691909116947f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad948a9491936306fdde03938184019390918290030181865afa15801561087d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108a59190810190611168565b876001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090b9190810190611168565b886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096d919061120a565b604051602001610981959493929190611259565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016109ad9291906112ab565b600060405180830381600087803b1580156109c757600080fd5b505af11580156109db573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e61790600090a35050565b6001600160a01b0383811660009081526004602052604090205416610a4357610a4383610664565b6001600160a01b038084166000908152600460205260409020541680610a6b57610a6b6112cf565b610a806001600160a01b038516333085610c45565b600054600254604080517f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82160208201526001600160a01b0388811682840152336060830152878116608083015260a08083018890528351808403909101815260c08301938490526316f1983160e01b909352620100009094048416936316f1983193610b119391169160c4016112ab565b600060405180830381600087803b158015610b2b57600080fd5b505af1158015610b3f573d6000803e3d6000fd5b505060408051338152602081018690526001600160a01b03808816945085811693508816917f8be9001bb612c7123a1861dc0d9d94e683261f6cbbd7c7438b708975bc4908a3910160405180910390a450505050565b6000808080610ba6858701876112e5565b6001600160a01b0380851660009081526004602052604090205494985092965090945092501680610bd957610bd96112cf565b610bed6001600160a01b0386168484610cb0565b604080516001600160a01b038681168252602082018590528086169284821692918916917f9c4f744b2e971d7058a9d8f43977e0e17bf7d57a48659f0e18541b7ee3d022e4910160405180910390a450505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261065e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610ce0565b6040516001600160a01b0383166024820152604481018290526104d890849063a9059cbb60e01b90606401610c79565b6000610d35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610db29092919063ffffffff16565b8051909150156104d85780806020019051810190610d539190611336565b6104d85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102e9565b6060610dc18484600085610dc9565b949350505050565b606082471015610e2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102e9565b600080866001600160a01b03168587604051610e469190611358565b60006040518083038185875af1925050503d8060008114610e83576040519150601f19603f3d011682016040523d82523d6000602084013e610e88565b606091505b5091509150610e9987838387610ea4565b979650505050505050565b60608315610f13578251600003610f0c576001600160a01b0385163b610f0c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102e9565b5081610dc1565b610dc18383815115610f285781518083602001fd5b8060405162461bcd60e51b81526004016102e99190611374565b6001600160a01b0381168114610f5757600080fd5b50565b600080600080600060a08688031215610f7257600080fd5b8535610f7d81610f42565b94506020860135610f8d81610f42565b93506040860135610f9d81610f42565b92506060860135610fad81610f42565b91506080860135610fbd81610f42565b809150509295509295909350565b60008060408385031215610fde57600080fd5b8235610fe981610f42565b946020939093013593505050565b60006020828403121561100957600080fd5b813561101481610f42565b9392505050565b60008060006060848603121561103057600080fd5b833561103b81610f42565b9250602084013561104b81610f42565b929592945050506040919091013590565b6000806000806060858703121561107257600080fd5b84359350602085013561108481610f42565b9250604085013567ffffffffffffffff808211156110a157600080fd5b818701915087601f8301126110b557600080fd5b8135818111156110c457600080fd5b8860208285010111156110d657600080fd5b95989497505060200194505050565b600080858511156110f557600080fd5b8386111561110257600080fd5b5050820193919092039150565b8035602083101561112857600019602084900360031b1b165b92915050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561115f578181015183820152602001611147565b50506000910152565b60006020828403121561117a57600080fd5b815167ffffffffffffffff8082111561119257600080fd5b818401915084601f8301126111a657600080fd5b8151818111156111b8576111b861112e565b604051601f8201601f19908116603f011681019083821181831017156111e0576111e061112e565b816040528281528760208487010111156111f957600080fd5b610e99836020830160208801611144565b60006020828403121561121c57600080fd5b815160ff8116811461101457600080fd5b60008151808452611245816020860160208601611144565b601f01601f19169290920160200192915050565b8581526001600160a01b038516602082015260a0604082018190526000906112839083018661122d565b8281036060840152611295818661122d565b91505060ff831660808301529695505050505050565b6001600160a01b0383168152604060208201819052600090610dc19083018461122d565b634e487b7160e01b600052600160045260246000fd5b600080600080608085870312156112fb57600080fd5b843561130681610f42565b9350602085013561131681610f42565b9250604085013561132681610f42565b9396929550929360600135925050565b60006020828403121561134857600080fd5b8151801515811461101457600080fd5b6000825161136a818460208701611144565b9190910192915050565b602081526000611014602083018461122d56fea264697066735822122004c3a8a362434a433974726c40ffa2b36429c5374d5d526487c70de6f6e54be864736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" +var MockERC20Artifact string = "{\n \"_format\": \"hh-sol-artifact-1\",\n \"contractName\": \"MockERC20\",\n \"sourceName\": \"contracts/mocks/MockERC20.sol\",\n \"abi\": [\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"previousAdminRole\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"newAdminRole\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"RoleAdminChanged\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"RoleGranted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"RoleRevoked\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"DEFAULT_ADMIN_ROLE\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MINTER_ROLE\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"PAUSER_ROLE\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burn\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"burnFrom\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subtractedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"decreaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getRoleAdmin\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"index\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getRoleMember\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getRoleMemberCount\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"grantRole\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"hasRole\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"addedValue\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"increaseAllowance\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mint\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"renounceRole\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"role\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"revokeRole\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"interfaceId\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"supportsInterface\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n ],\n \"bytecode\": \"0x60806040523480156200001157600080fd5b50604080518082018252600480825263151154d560e21b60208084018290528451808601909552918452908301529081816005620000508382620002e2565b5060066200005f8282620002e2565b50506007805460ff191690555062000079600033620000d9565b620000a57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000d9565b620000d17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620000d9565b5050620003ae565b620000e58282620000e9565b5050565b6200010082826200012c60201b6200093d1760201c565b600082815260016020908152604090912062000127918390620009c1620001cc821b17901c565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000e5576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001883390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000620001e3836001600160a01b038416620001ec565b90505b92915050565b60008181526001830160205260408120546200023557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001e6565b506000620001e6565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200026957607f821691505b6020821081036200028a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200012757600081815260208120601f850160051c81016020861015620002b95750805b601f850160051c820191505b81811015620002da57828155600101620002c5565b505050505050565b81516001600160401b03811115620002fe57620002fe6200023e565b62000316816200030f845462000254565b8462000290565b602080601f8311600181146200034e5760008415620003355750858301515b600019600386901b1c1916600185901b178555620002da565b600085815260208120601f198616915b828110156200037f578886015182559484019460019091019084016200035e565b50858210156200039e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61188c80620003be6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d5391393146103af578063d547741f146103d6578063dd62ed3e146103e9578063e63ab1e9146103fc57600080fd5b8063a457c2d714610376578063a9059cbb14610389578063ca15c8731461039c57600080fd5b80639010d07c116100d35780639010d07c1461032857806391d148541461035357806395d89b4114610366578063a217fddf1461036e57600080fd5b806370a08231146102e457806379cc67901461030d5780638456cb591461032057600080fd5b8063313ce567116101665780633f4ba83a116101405780633f4ba83a146102ab57806340c10f19146102b357806342966c68146102c65780635c975abb146102d957600080fd5b8063313ce5671461027657806336568abe14610285578063395093511461029857600080fd5b806318160ddd116101a257806318160ddd1461021957806323b872dd1461022b578063248a9ca31461023e5780632f2ff15d1461026157600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d736600461154c565b610423565b60405190151581526020015b60405180910390f35b6101f961044e565b6040516101e8919061159a565b6101dc6102143660046115e9565b6104e0565b6004545b6040519081526020016101e8565b6101dc610239366004611613565b6104f8565b61021d61024c36600461164f565b60009081526020819052604090206001015490565b61027461026f366004611668565b61051c565b005b604051601281526020016101e8565b610274610293366004611668565b610546565b6101dc6102a63660046115e9565b6105c9565b6102746105eb565b6102746102c13660046115e9565b610691565b6102746102d436600461164f565b610730565b60075460ff166101dc565b61021d6102f2366004611694565b6001600160a01b031660009081526002602052604090205490565b61027461031b3660046115e9565b61073d565b610274610752565b61033b6103363660046116af565b6107f6565b6040516001600160a01b0390911681526020016101e8565b6101dc610361366004611668565b610815565b6101f961083e565b61021d600081565b6101dc6103843660046115e9565b61084d565b6101dc6103973660046115e9565b6108c8565b61021d6103aa36600461164f565b6108d6565b61021d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102746103e4366004611668565b6108ed565b61021d6103f73660046116d1565b610912565b61021d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006001600160e01b03198216635a05180f60e01b14806104485750610448826109d6565b92915050565b60606005805461045d906116fb565b80601f0160208091040260200160405190810160405280929190818152602001828054610489906116fb565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b6000336104ee818585610a0b565b5060019392505050565b600033610506858285610b2f565b610511858585610ba9565b506001949350505050565b60008281526020819052604090206001015461053781610d5f565b6105418383610d69565b505050565b6001600160a01b03811633146105bb5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6105c58282610d8b565b5050565b6000336104ee8185856105dc8383610912565b6105e6919061174b565b610a0b565b6106157f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610815565b6106875760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e70617573650000000000000060648201526084016105b2565b61068f610dad565b565b6106bb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610815565b6107265760405162461bcd60e51b815260206004820152603660248201527f45524332305072657365744d696e7465725061757365723a206d7573742068616044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b60648201526084016105b2565b6105c58282610dff565b61073a3382610ecc565b50565b610748823383610b2f565b6105c58282610ecc565b61077c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610815565b6107ee5760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20706175736500000000000000000060648201526084016105b2565b61068f61100c565b600082815260016020526040812061080e9083611049565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606006805461045d906116fb565b6000338161085b8286610912565b9050838110156108bb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105b2565b6105118286868403610a0b565b6000336104ee818585610ba9565b600081815260016020526040812061044890611055565b60008281526020819052604090206001015461090881610d5f565b6105418383610d8b565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6109478282610815565b6105c5576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561097d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061080e836001600160a01b03841661105f565b60006001600160e01b03198216637965db0b60e01b148061044857506301ffc9a760e01b6001600160e01b0319831614610448565b6001600160a01b038316610a6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105b2565b6001600160a01b038216610ace5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105b2565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610b3b8484610912565b90506000198114610ba35781811015610b965760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105b2565b610ba38484848403610a0b565b50505050565b6001600160a01b038316610c0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105b2565b6001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105b2565b610c7a8383836110ae565b6001600160a01b03831660009081526002602052604090205481811015610cf25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105b2565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d529086815260200190565b60405180910390a3610ba3565b61073a81336110b9565b610d73828261093d565b600082815260016020526040902061054190826109c1565b610d958282611112565b60008281526001602052604090206105419082611177565b610db561118c565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216610e555760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b2565b610e61600083836110ae565b8060046000828254610e73919061174b565b90915550506001600160a01b0382166000818152600260209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610f2c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105b2565b610f38826000836110ae565b6001600160a01b03821660009081526002602052604090205481811015610fac5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105b2565b6001600160a01b03831660008181526002602090815260408083208686039055600480548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6110146111d5565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610de23390565b600061080e838361121b565b6000610448825490565b60008181526001830160205260408120546110a657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610448565b506000610448565b610541838383611245565b6110c38282610815565b6105c5576110d0816112ab565b6110db8360206112bd565b6040516020016110ec92919061175e565b60408051601f198184030181529082905262461bcd60e51b82526105b29160040161159a565b61111c8282610815565b156105c5576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061080e836001600160a01b038416611459565b60075460ff1661068f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105b2565b60075460ff161561068f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105b2565b6000826000018281548110611232576112326117d3565b9060005260206000200154905092915050565b60075460ff16156105415760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016105b2565b60606104486001600160a01b03831660145b606060006112cc8360026117e9565b6112d790600261174b565b67ffffffffffffffff8111156112ef576112ef611800565b6040519080825280601f01601f191660200182016040528015611319576020820181803683370190505b509050600360fc1b81600081518110611334576113346117d3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611363576113636117d3565b60200101906001600160f81b031916908160001a90535060006113878460026117e9565b61139290600161174b565b90505b600181111561140a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106113c6576113c66117d3565b1a60f81b8282815181106113dc576113dc6117d3565b60200101906001600160f81b031916908160001a90535060049490941c9361140381611816565b9050611395565b50831561080e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105b2565b6000818152600183016020526040812054801561154257600061147d60018361182d565b85549091506000906114919060019061182d565b90508181146114f65760008660000182815481106114b1576114b16117d3565b90600052602060002001549050808760000184815481106114d4576114d46117d3565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061150757611507611840565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610448565b6000915050610448565b60006020828403121561155e57600080fd5b81356001600160e01b03198116811461080e57600080fd5b60005b83811015611591578181015183820152602001611579565b50506000910152565b60208152600082518060208401526115b9816040850160208701611576565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146115e457600080fd5b919050565b600080604083850312156115fc57600080fd5b611605836115cd565b946020939093013593505050565b60008060006060848603121561162857600080fd5b611631846115cd565b925061163f602085016115cd565b9150604084013590509250925092565b60006020828403121561166157600080fd5b5035919050565b6000806040838503121561167b57600080fd5b8235915061168b602084016115cd565b90509250929050565b6000602082840312156116a657600080fd5b61080e826115cd565b600080604083850312156116c257600080fd5b50508035926020909101359150565b600080604083850312156116e457600080fd5b6116ed836115cd565b915061168b602084016115cd565b600181811c9082168061170f57607f821691505b60208210810361172f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561044857610448611735565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611796816017850160208801611576565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516117c7816028840160208801611576565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761044857610448611735565b634e487b7160e01b600052604160045260246000fd5b60008161182557611825611735565b506000190190565b8181038181111561044857610448611735565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220fa3f941a17c17d2b401d57fbbdcb4f1b88410e428bf90ee7e0456834f9400d3364736f6c63430008110033\",\n \"deployedBytecode\": \"0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d5391393146103af578063d547741f146103d6578063dd62ed3e146103e9578063e63ab1e9146103fc57600080fd5b8063a457c2d714610376578063a9059cbb14610389578063ca15c8731461039c57600080fd5b80639010d07c116100d35780639010d07c1461032857806391d148541461035357806395d89b4114610366578063a217fddf1461036e57600080fd5b806370a08231146102e457806379cc67901461030d5780638456cb591461032057600080fd5b8063313ce567116101665780633f4ba83a116101405780633f4ba83a146102ab57806340c10f19146102b357806342966c68146102c65780635c975abb146102d957600080fd5b8063313ce5671461027657806336568abe14610285578063395093511461029857600080fd5b806318160ddd116101a257806318160ddd1461021957806323b872dd1461022b578063248a9ca31461023e5780632f2ff15d1461026157600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d736600461154c565b610423565b60405190151581526020015b60405180910390f35b6101f961044e565b6040516101e8919061159a565b6101dc6102143660046115e9565b6104e0565b6004545b6040519081526020016101e8565b6101dc610239366004611613565b6104f8565b61021d61024c36600461164f565b60009081526020819052604090206001015490565b61027461026f366004611668565b61051c565b005b604051601281526020016101e8565b610274610293366004611668565b610546565b6101dc6102a63660046115e9565b6105c9565b6102746105eb565b6102746102c13660046115e9565b610691565b6102746102d436600461164f565b610730565b60075460ff166101dc565b61021d6102f2366004611694565b6001600160a01b031660009081526002602052604090205490565b61027461031b3660046115e9565b61073d565b610274610752565b61033b6103363660046116af565b6107f6565b6040516001600160a01b0390911681526020016101e8565b6101dc610361366004611668565b610815565b6101f961083e565b61021d600081565b6101dc6103843660046115e9565b61084d565b6101dc6103973660046115e9565b6108c8565b61021d6103aa36600461164f565b6108d6565b61021d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102746103e4366004611668565b6108ed565b61021d6103f73660046116d1565b610912565b61021d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006001600160e01b03198216635a05180f60e01b14806104485750610448826109d6565b92915050565b60606005805461045d906116fb565b80601f0160208091040260200160405190810160405280929190818152602001828054610489906116fb565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b6000336104ee818585610a0b565b5060019392505050565b600033610506858285610b2f565b610511858585610ba9565b506001949350505050565b60008281526020819052604090206001015461053781610d5f565b6105418383610d69565b505050565b6001600160a01b03811633146105bb5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6105c58282610d8b565b5050565b6000336104ee8185856105dc8383610912565b6105e6919061174b565b610a0b565b6106157f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610815565b6106875760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e70617573650000000000000060648201526084016105b2565b61068f610dad565b565b6106bb7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610815565b6107265760405162461bcd60e51b815260206004820152603660248201527f45524332305072657365744d696e7465725061757365723a206d7573742068616044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b60648201526084016105b2565b6105c58282610dff565b61073a3382610ecc565b50565b610748823383610b2f565b6105c58282610ecc565b61077c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610815565b6107ee5760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20706175736500000000000000000060648201526084016105b2565b61068f61100c565b600082815260016020526040812061080e9083611049565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606006805461045d906116fb565b6000338161085b8286610912565b9050838110156108bb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105b2565b6105118286868403610a0b565b6000336104ee818585610ba9565b600081815260016020526040812061044890611055565b60008281526020819052604090206001015461090881610d5f565b6105418383610d8b565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6109478282610815565b6105c5576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561097d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061080e836001600160a01b03841661105f565b60006001600160e01b03198216637965db0b60e01b148061044857506301ffc9a760e01b6001600160e01b0319831614610448565b6001600160a01b038316610a6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105b2565b6001600160a01b038216610ace5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105b2565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610b3b8484610912565b90506000198114610ba35781811015610b965760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105b2565b610ba38484848403610a0b565b50505050565b6001600160a01b038316610c0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105b2565b6001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105b2565b610c7a8383836110ae565b6001600160a01b03831660009081526002602052604090205481811015610cf25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105b2565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d529086815260200190565b60405180910390a3610ba3565b61073a81336110b9565b610d73828261093d565b600082815260016020526040902061054190826109c1565b610d958282611112565b60008281526001602052604090206105419082611177565b610db561118c565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216610e555760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b2565b610e61600083836110ae565b8060046000828254610e73919061174b565b90915550506001600160a01b0382166000818152600260209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610f2c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105b2565b610f38826000836110ae565b6001600160a01b03821660009081526002602052604090205481811015610fac5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105b2565b6001600160a01b03831660008181526002602090815260408083208686039055600480548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6110146111d5565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610de23390565b600061080e838361121b565b6000610448825490565b60008181526001830160205260408120546110a657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610448565b506000610448565b610541838383611245565b6110c38282610815565b6105c5576110d0816112ab565b6110db8360206112bd565b6040516020016110ec92919061175e565b60408051601f198184030181529082905262461bcd60e51b82526105b29160040161159a565b61111c8282610815565b156105c5576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061080e836001600160a01b038416611459565b60075460ff1661068f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105b2565b60075460ff161561068f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105b2565b6000826000018281548110611232576112326117d3565b9060005260206000200154905092915050565b60075460ff16156105415760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016105b2565b60606104486001600160a01b03831660145b606060006112cc8360026117e9565b6112d790600261174b565b67ffffffffffffffff8111156112ef576112ef611800565b6040519080825280601f01601f191660200182016040528015611319576020820181803683370190505b509050600360fc1b81600081518110611334576113346117d3565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611363576113636117d3565b60200101906001600160f81b031916908160001a90535060006113878460026117e9565b61139290600161174b565b90505b600181111561140a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106113c6576113c66117d3565b1a60f81b8282815181106113dc576113dc6117d3565b60200101906001600160f81b031916908160001a90535060049490941c9361140381611816565b9050611395565b50831561080e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105b2565b6000818152600183016020526040812054801561154257600061147d60018361182d565b85549091506000906114919060019061182d565b90508181146114f65760008660000182815481106114b1576114b16117d3565b90600052602060002001549050808760000184815481106114d4576114d46117d3565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061150757611507611840565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610448565b6000915050610448565b60006020828403121561155e57600080fd5b81356001600160e01b03198116811461080e57600080fd5b60005b83811015611591578181015183820152602001611579565b50506000910152565b60208152600082518060208401526115b9816040850160208701611576565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146115e457600080fd5b919050565b600080604083850312156115fc57600080fd5b611605836115cd565b946020939093013593505050565b60008060006060848603121561162857600080fd5b611631846115cd565b925061163f602085016115cd565b9150604084013590509250925092565b60006020828403121561166157600080fd5b5035919050565b6000806040838503121561167b57600080fd5b8235915061168b602084016115cd565b90509250929050565b6000602082840312156116a657600080fd5b61080e826115cd565b600080604083850312156116c257600080fd5b50508035926020909101359150565b600080604083850312156116e457600080fd5b6116ed836115cd565b915061168b602084016115cd565b600181811c9082168061170f57607f821691505b60208210810361172f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561044857610448611735565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611796816017850160208801611576565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516117c7816028840160208801611576565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761044857610448611735565b634e487b7160e01b600052604160045260246000fd5b60008161182557611825611735565b506000190190565b8181038181111561044857610448611735565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220fa3f941a17c17d2b401d57fbbdcb4f1b88410e428bf90ee7e0456834f9400d3364736f6c63430008110033\",\n \"linkReferences\": {},\n \"deployedLinkReferences\": {}\n}\n" diff --git a/consensus/polybft/contractsapi/helper.go b/consensus/polybft/contractsapi/helper.go index 070718f15c..cdd89e89ce 100644 --- a/consensus/polybft/contractsapi/helper.go +++ b/consensus/polybft/contractsapi/helper.go @@ -15,9 +15,11 @@ type StateTransactionInput interface { DecodeAbi(b []byte) error } -// specific case where we need to encode state sync event as a tuple of tuple -var stateSyncABIType = abi.MustNewType( - "tuple(tuple(uint256 id, address sender, address receiver, bytes data))") +var ( + // stateSyncABIType is a specific case where we need to encode state sync event as a tuple of tuple + stateSyncABIType = abi.MustNewType( + "tuple(tuple(uint256 id, address sender, address receiver, bytes data))") +) // ToABI converts StateSyncEvent to ABI func (sse *StateSyncedEvent) EncodeAbi() ([]byte, error) { diff --git a/consensus/polybft/contractsapi/init.go b/consensus/polybft/contractsapi/init.go index 33b92fc62b..2c5266778f 100644 --- a/consensus/polybft/contractsapi/init.go +++ b/consensus/polybft/contractsapi/init.go @@ -13,23 +13,27 @@ const ( var ( // core-contracts smart contracts - CheckpointManager *artifact.Artifact - ExitHelper *artifact.Artifact - L2StateSender *artifact.Artifact - StateSender *artifact.Artifact - StateReceiver *artifact.Artifact - BLS *artifact.Artifact - BLS256 *artifact.Artifact - System *artifact.Artifact - Merkle *artifact.Artifact - ChildValidatorSet *artifact.Artifact - MRC20 *artifact.Artifact + CheckpointManager *artifact.Artifact + ExitHelper *artifact.Artifact + StateSender *artifact.Artifact + RootERC20Predicate *artifact.Artifact + BLS *artifact.Artifact + BLS256 *artifact.Artifact + System *artifact.Artifact + Merkle *artifact.Artifact + ChildValidatorSet *artifact.Artifact + NativeERC20 *artifact.Artifact + StateReceiver *artifact.Artifact + ChildERC20 *artifact.Artifact + ChildERC20Predicate *artifact.Artifact + L2StateSender *artifact.Artifact // test smart contracts //go:embed test-contracts/* testContracts embed.FS TestL1StateReceiver *artifact.Artifact TestWriteBlockMetadata *artifact.Artifact + RootERC20 *artifact.Artifact ) func init() { @@ -70,6 +74,11 @@ func init() { panic(err) } + RootERC20Predicate, err = artifact.DecodeArtifact([]byte(RootERC20PredicateArtifact)) + if err != nil { + panic(err) + } + StateReceiver, err = artifact.DecodeArtifact([]byte(StateReceiverArtifact)) if err != nil { panic(err) @@ -80,7 +89,12 @@ func init() { panic(err) } - MRC20, err = artifact.DecodeArtifact([]byte(MRC20Artifact)) + ChildERC20, err = artifact.DecodeArtifact([]byte(ChildERC20Artifact)) + if err != nil { + panic(err) + } + + ChildERC20Predicate, err = artifact.DecodeArtifact([]byte(ChildERC20PredicateArtifact)) if err != nil { panic(err) } @@ -90,23 +104,32 @@ func init() { panic(err) } - testL1StateReceiverRaw, err := testContracts.ReadFile(path.Join(testContractsDir, "TestL1StateReceiver.json")) + NativeERC20, err = artifact.DecodeArtifact([]byte(NativeERC20Artifact)) if err != nil { panic(err) } - TestL1StateReceiver, err = artifact.DecodeArtifact(testL1StateReceiverRaw) + RootERC20, err = artifact.DecodeArtifact([]byte(MockERC20Artifact)) if err != nil { panic(err) } - testWriteBlockMetadataRaw, err := testContracts.ReadFile(path.Join(testContractsDir, "TestWriteBlockMetadata.json")) + TestL1StateReceiver, err = artifact.DecodeArtifact(readTestContractContent("TestL1StateReceiver.json")) if err != nil { panic(err) } - TestWriteBlockMetadata, err = artifact.DecodeArtifact(testWriteBlockMetadataRaw) + TestWriteBlockMetadata, err = artifact.DecodeArtifact(readTestContractContent("TestWriteBlockMetadata.json")) if err != nil { panic(err) } } + +func readTestContractContent(contractFileName string) []byte { + contractRaw, err := testContracts.ReadFile(path.Join(testContractsDir, contractFileName)) + if err != nil { + panic(err) + } + + return contractRaw +} diff --git a/consensus/polybft/polybft.go b/consensus/polybft/polybft.go index 5eaadb59ee..5db434f43d 100644 --- a/consensus/polybft/polybft.go +++ b/consensus/polybft/polybft.go @@ -9,7 +9,6 @@ import ( "github.com/0xPolygon/polygon-edge/chain" "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/wallet" "github.com/0xPolygon/polygon-edge/contracts" @@ -120,7 +119,7 @@ func GenesisPostHookFactory(config *chain.Chain, engineName string) func(txn *st return err } - // Initialize child validator set + // initialize ChildValidatorSet SC input, err := getInitChildValidatorSetInput(polyBFTConfig) if err != nil { return err @@ -130,22 +129,33 @@ func GenesisPostHookFactory(config *chain.Chain, engineName string) func(txn *st return err } + // initialize ChildERC20Predicate SC + input, err = getInitChildERC20PredicateInput(polyBFTConfig.Bridge) if err != nil { - return fmt.Errorf("failed loading rootchain manifest: %w", err) + return err + } + + if err = initContract(contracts.ChildERC20PredicateContract, input, "ChildERC20Predicate", transition); err != nil { + return err } - rootchainAdmin := types.ZeroAddress - if polyBFTConfig.IsBridgeEnabled() { - rootchainAdmin = polyBFTConfig.Bridge.AdminAddress + rootNativeERC20Token := types.ZeroAddress + if polyBFTConfig.Bridge != nil { + rootNativeERC20Token = polyBFTConfig.Bridge.RootNativeERC20Addr } - input, err = contractsapi.MRC20.Abi.Methods["initialize"].Encode( - []interface{}{rootchainAdmin, nativeTokenName, nativeTokenSymbol}) + // initialize NativeERC20 SC + input, err = getInitNativeERC20Input( + nativeTokenName, + nativeTokenSymbol, + nativeTokenDecimals, + rootNativeERC20Token, + contracts.ChildERC20PredicateContract) if err != nil { return err } - return initContract(contracts.NativeTokenContract, input, "MRC20", transition) + return initContract(contracts.NativeERC20TokenContract, input, "NativeERC20", transition) } } diff --git a/consensus/polybft/polybft_config.go b/consensus/polybft/polybft_config.go index cb5f16df0b..29ca6f9722 100644 --- a/consensus/polybft/polybft_config.go +++ b/consensus/polybft/polybft_config.go @@ -64,10 +64,11 @@ func GetPolyBFTConfig(chainConfig *chain.Chain) (PolyBFTConfig, error) { // BridgeConfig is the rootchain bridge configuration type BridgeConfig struct { - BridgeAddr types.Address `json:"stateSenderAddr"` - CheckpointAddr types.Address `json:"checkpointAddr"` - AdminAddress types.Address `json:"adminAddress"` - JSONRPCEndpoint string `json:"jsonRPCEndpoint"` + BridgeAddr types.Address `json:"stateSenderAddr"` + CheckpointAddr types.Address `json:"checkpointAddr"` + RootERC20PredicateAddr types.Address `json:"rootERC20PredicateAddr"` + RootNativeERC20Addr types.Address `json:"rootNativeERC20Addr"` + JSONRPCEndpoint string `json:"jsonRPCEndpoint"` } func (p *PolyBFTConfig) IsBridgeEnabled() bool { @@ -185,20 +186,24 @@ func (v *Validator) ToValidatorMetadata() (*ValidatorMetadata, error) { // RootchainConfig contains information about rootchain contract addresses // as well as rootchain admin account address type RootchainConfig struct { - StateSenderAddress types.Address `json:"stateSenderAddress"` - CheckpointManagerAddress types.Address `json:"checkpointManagerAddress"` - BLSAddress types.Address `json:"blsAddress"` - BN256G2Address types.Address `json:"bn256G2Address"` - ExitHelperAddress types.Address `json:"exitHelperAddress"` - AdminAddress types.Address `json:"adminAddress"` + StateSenderAddress types.Address `json:"stateSenderAddress"` + CheckpointManagerAddress types.Address `json:"checkpointManagerAddress"` + BLSAddress types.Address `json:"blsAddress"` + BN256G2Address types.Address `json:"bn256G2Address"` + ExitHelperAddress types.Address `json:"exitHelperAddress"` + RootERC20PredicateAddress types.Address `json:"rootERC20PredicateAddress"` + RootNativeERC20Address types.Address `json:"rootNativeERC20Address"` + ERC20TemplateAddress types.Address `json:"erc20TemplateAddress"` + AdminAddress types.Address `json:"adminAddress"` } // ToBridgeConfig creates BridgeConfig instance func (r *RootchainConfig) ToBridgeConfig() *BridgeConfig { return &BridgeConfig{ - BridgeAddr: r.StateSenderAddress, - CheckpointAddr: r.CheckpointManagerAddress, - AdminAddress: r.AdminAddress, + BridgeAddr: r.StateSenderAddress, + CheckpointAddr: r.CheckpointManagerAddress, + RootERC20PredicateAddr: r.RootERC20PredicateAddress, + RootNativeERC20Addr: r.RootNativeERC20Address, } } diff --git a/contracts/system_addresses.go b/contracts/system_addresses.go index 4f7848fe5d..0fd206fbc1 100644 --- a/contracts/system_addresses.go +++ b/contracts/system_addresses.go @@ -11,12 +11,16 @@ var ( MerkleContract = types.StringToAddress("0x103") // StateReceiverContract is an address of bridge contract on the child chain StateReceiverContract = types.StringToAddress("0x1001") - // NativeTokenContract is an address of bridge contract (used for transferring native tokens on child chain) - NativeTokenContract = types.StringToAddress("0x1010") + // NativeERC20TokenContract is an address of bridge contract (used for transferring ERC20 native tokens on child chain) + NativeERC20TokenContract = types.StringToAddress("0x1010") + // L2StateSenderContract is an address of bridge contract to the rootchain + L2StateSenderContract = types.StringToAddress("0x1002") + // ChildERC20Contract is an address of bridgable ERC20 token contract on the child chain + ChildERC20Contract = types.StringToAddress("0x1003") + // ChildERC20PredicateContract is an address of child ERC20 predicate contract on the child chain + ChildERC20PredicateContract = types.StringToAddress("0x1004") // SystemCaller is address of account, used for system calls to smart contracts SystemCaller = types.StringToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") - // L2StateSender is an address of bridge contract to the rootchain - L2StateSenderContract = types.StringToAddress("0x1002") // NativeTransferPrecompile is an address of native transfer precompile NativeTransferPrecompile = types.StringToAddress("0x2020") diff --git a/core-contracts b/core-contracts index f7930d914a..5fa213c321 160000 --- a/core-contracts +++ b/core-contracts @@ -1 +1 @@ -Subproject commit f7930d914a4238d0263da4a143b48cf33e8aa863 +Subproject commit 5fa213c321c766414fb6021bc41470889096cd74 diff --git a/e2e-polybft/bridge_test.go b/e2e-polybft/bridge_test.go index 67d28e3826..b7a4d700d1 100644 --- a/e2e-polybft/bridge_test.go +++ b/e2e-polybft/bridge_test.go @@ -25,7 +25,6 @@ import ( "github.com/0xPolygon/polygon-edge/txrelayer" "github.com/0xPolygon/polygon-edge/types" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/umbracle/ethgo" ethgow "github.com/umbracle/ethgo/wallet" @@ -35,9 +34,9 @@ const ( manifestFileName = "manifest.json" ) -// checkLogs is helper function which parses given ResultEvent event's logs, +// checkStateSyncResultLogs is helper function which parses given StateSyncResultEvent event's logs, // extracts status topic value and makes assertions against it. -func checkLogs( +func checkStateSyncResultLogs( t *testing.T, logs []*ethgo.Log, expectedCount int, @@ -47,35 +46,35 @@ func checkLogs( for _, log := range logs { stateSyncResultEvent := &contractsapi.StateSyncResultEvent{} - assert.NoError(t, stateSyncResultEvent.ParseLog(log)) + require.NoError(t, stateSyncResultEvent.ParseLog(log)) - t.Logf("Block Number=%d, Decoded Log=%+v", log.BlockNumber, stateSyncResultEvent) + t.Logf("Block Number=%d, Decoded Log=%+v\n", log.BlockNumber, stateSyncResultEvent) - assert.True(t, stateSyncResultEvent.Status) + require.True(t, stateSyncResultEvent.Status) } } -func TestE2E_Bridge_MainWorkflow(t *testing.T) { +func TestE2E_Bridge_DepositERC20(t *testing.T) { const ( num = 10 + amount = 100 numBlockConfirmations = 4 ) - var ( - accounts = make([]ethgo.Key, num) - wallets, amounts [num]string - premine [num]types.Address - ) + receivers := make([]string, num) + amounts := make([]string, num) for i := 0; i < num; i++ { - accounts[i], _ = ethgow.GenerateKey() - premine[i] = types.Address(accounts[i].Address()) - wallets[i] = premine[i].String() - amounts[i] = fmt.Sprintf("%d", 100) + key, err := ethgow.GenerateKey() + require.NoError(t, err) + + receivers[i] = types.Address(key.Address()).String() + amounts[i] = fmt.Sprintf("%d", amount) + + t.Logf("Receiver#%d=%s\n", i+1, receivers[i]) } - cluster := framework.NewTestCluster(t, 5, - framework.WithBridge(), framework.WithPremine(premine[:]...), + cluster := framework.NewTestCluster(t, 5, framework.WithBridge(), framework.WithNumBlockConfirmations(numBlockConfirmations)) defer cluster.Stop() @@ -85,9 +84,9 @@ func TestE2E_Bridge_MainWorkflow(t *testing.T) { // send a few transactions to the bridge require.NoError( t, - cluster.EmitTransfer( - contracts.NativeTokenContract.String(), - strings.Join(wallets[:], ","), + cluster.Bridge.Deposit( + "ERC20", + strings.Join(receivers[:], ","), strings.Join(amounts[:], ","), ), ) @@ -97,9 +96,9 @@ func TestE2E_Bridge_MainWorkflow(t *testing.T) { // send again to trigger previous transactions require.NoError( t, - cluster.EmitTransfer( - contracts.NativeTokenContract.String(), - strings.Join(wallets[:], ","), + cluster.Bridge.Deposit( + "ERC20", + strings.Join(receivers[:], ","), strings.Join(amounts[:], ","), ), ) @@ -118,30 +117,39 @@ func TestE2E_Bridge_MainWorkflow(t *testing.T) { filter.SetFromUint64(0) filter.SetToUint64(100) - logs, err := cluster.Servers[0].JSONRPC().Eth().GetLogs(filter) + srv := cluster.Servers[0].JSONRPC().Eth() + + logs, err := srv.GetLogs(filter) require.NoError(t, err) - // Assert that all state syncs are executed successfully - checkLogs(t, logs, num) + // assert that all deposits are executed successfully + checkStateSyncResultLogs(t, logs, num) + + // check receivers balances got increased by deposited amount + for _, receiver := range receivers { + balance, err := srv.GetBalance(ethgo.BytesToAddress([]byte(receiver)), ethgo.Latest) + require.NoError(t, err) + require.Equal(t, big.NewInt(amount), balance) + } } func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { - const num = 10 + const depositsCount = 10 - var ( - accounts = make([]ethgo.Key, num) - wallets, amounts [num]string - premine [num]types.Address - ) + receivers := make([]string, depositsCount) + amounts := make([]string, depositsCount) - for i := 0; i < num; i++ { - accounts[i], _ = ethgow.GenerateKey() - premine[i] = types.Address(accounts[i].Address()) - wallets[i] = premine[i].String() + for i := 0; i < depositsCount; i++ { + key, err := ethgow.GenerateKey() + require.NoError(t, err) + + receivers[i] = types.Address(key.Address()).String() amounts[i] = fmt.Sprintf("%d", 100) } - cluster := framework.NewTestCluster(t, 5, framework.WithBridge(), framework.WithPremine(premine[:]...), framework.WithEpochSize(30)) + cluster := framework.NewTestCluster(t, 5, + framework.WithBridge(), + framework.WithEpochSize(30)) defer cluster.Stop() // wait for a couple of blocks @@ -150,9 +158,9 @@ func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { // send two transactions to the bridge so that we have a minimal commitment require.NoError( t, - cluster.EmitTransfer( - contracts.NativeTokenContract.String(), - strings.Join(wallets[:2], ","), + cluster.Bridge.Deposit( + "ERC20", + strings.Join(receivers[:2], ","), strings.Join(amounts[:2], ","), ), ) @@ -160,8 +168,7 @@ func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { // wait for a few more sprints require.NoError(t, cluster.WaitForBlock(10, 2*time.Minute)) - client := cluster.Servers[0].JSONRPC() - txRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithClient(client)) + txRelayer, err := txrelayer.NewTxRelayer(txrelayer.WithClient(cluster.Servers[0].JSONRPC())) require.NoError(t, err) lastCommittedIDMethod := contractsapi.StateReceiver.Abi.GetMethod("lastCommittedId") @@ -169,7 +176,7 @@ func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { require.NoError(t, err) // check that we submitted the minimal commitment to smart contract - result, err := txRelayer.Call(accounts[0].Address(), ethgo.Address(contracts.StateReceiverContract), encode) + result, err := txRelayer.Call(ethgo.ZeroAddress, ethgo.Address(contracts.StateReceiverContract), encode) require.NoError(t, err) lastCommittedID, err := strconv.ParseUint(result, 0, 64) @@ -179,9 +186,9 @@ func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { // send some more transactions to the bridge to build another commitment in epoch require.NoError( t, - cluster.EmitTransfer( - contracts.NativeTokenContract.String(), - strings.Join(wallets[2:], ","), + cluster.Bridge.Deposit( + "ERC20", + strings.Join(receivers[2:], ","), strings.Join(amounts[2:], ","), ), ) @@ -190,13 +197,13 @@ func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { require.NoError(t, cluster.WaitForBlock(40, 3*time.Minute)) // check that we submitted the minimal commitment to smart contract - result, err = txRelayer.Call(accounts[0].Address(), ethgo.Address(contracts.StateReceiverContract), encode) + result, err = txRelayer.Call(ethgo.ZeroAddress, ethgo.Address(contracts.StateReceiverContract), encode) require.NoError(t, err) // check that the second (larger commitment) was also submitted in epoch lastCommittedID, err = strconv.ParseUint(result, 0, 64) require.NoError(t, err) - require.Equal(t, uint64(10), lastCommittedID) + require.Equal(t, uint64(depositsCount), lastCommittedID) // the transactions are mined and state syncs should be executed by the relayer // and there should be a success events @@ -213,8 +220,8 @@ func TestE2E_Bridge_MultipleCommitmentsPerEpoch(t *testing.T) { logs, err := cluster.Servers[0].JSONRPC().Eth().GetLogs(filter) require.NoError(t, err) - // Assert that all state syncs are executed successfully - checkLogs(t, logs, num) + // assert that all state syncs are executed successfully + checkStateSyncResultLogs(t, logs, depositsCount) } func TestE2E_CheckpointSubmission(t *testing.T) { @@ -304,7 +311,7 @@ func TestE2E_Bridge_L2toL1Exit(t *testing.T) { } // initialize rootchain admin key to default one - require.NoError(t, rootchainHelper.InitRootchainAdminKey("")) + require.NoError(t, rootchainHelper.InitRootchainPrivateKey("")) cluster := framework.NewTestCluster(t, 5, framework.WithBridge(), @@ -332,7 +339,7 @@ func TestE2E_Bridge_L2toL1Exit(t *testing.T) { // deploy L1ExitTest contract receipt, err := l1TxRelayer.SendTransaction(ðgo.Transaction{Input: contractsapi.TestL1StateReceiver.Bytecode}, - rootchainHelper.GetRootchainAdminKey()) + rootchainHelper.GetRootchainPrivateKey()) require.NoError(t, err) require.Equal(t, receipt.Status, uint64(types.ReceiptSuccess)) @@ -392,7 +399,6 @@ func TestE2E_Bridge_L2toL1ExitMultiple(t *testing.T) { ) exitEventIds := make([]uint64, userNumber*roundNumber) - sidechainKeys := make([]*ethgow.Key, userNumber) accountAddress := make([]types.Address, userNumber) @@ -405,7 +411,7 @@ func TestE2E_Bridge_L2toL1ExitMultiple(t *testing.T) { } // initialize rootchain admin key to default one - require.NoError(t, rootchainHelper.InitRootchainAdminKey("")) + require.NoError(t, rootchainHelper.InitRootchainPrivateKey("")) cluster := framework.NewTestCluster(t, 5, framework.WithBridge(), @@ -433,7 +439,7 @@ func TestE2E_Bridge_L2toL1ExitMultiple(t *testing.T) { // deploy L1ExitTest contract receipt, err := l1TxRelayer.SendTransaction(ðgo.Transaction{Input: contractsapi.TestL1StateReceiver.Bytecode}, - rootchainHelper.GetRootchainAdminKey()) + rootchainHelper.GetRootchainPrivateKey()) require.NoError(t, err) require.Equal(t, receipt.Status, uint64(types.ReceiptSuccess)) @@ -443,7 +449,6 @@ func TestE2E_Bridge_L2toL1ExitMultiple(t *testing.T) { // Start test // send crosschain transaction on l2 and get exit id stateSenderData := []byte{123} - //g, _ := errgroup.WithContext(context.Background()) addTransaction := func(j, i uint64) { receipt, err := ABITransaction(l2TxRelayer, sidechainKeys[j], contractsapi.L2StateSender, l2StateSenderAddress, "syncState", l1ExitTestAddr, stateSenderData) require.NoError(t, err) @@ -510,7 +515,7 @@ func isExitEventProcessed(sidechainKey *ethgow.Key, proof types.Proof, checkpoin return false, fmt.Errorf("could not get leaf index from exit event proof. Leaf from proof: %v", proof.Metadata["LeafIndex"]) } - receipt, err := ABITransaction(l1TxRelayer, rootchainHelper.GetRootchainAdminKey(), contractsapi.ExitHelper, exitHelperAddr, + receipt, err := ABITransaction(l1TxRelayer, rootchainHelper.GetRootchainPrivateKey(), contractsapi.ExitHelper, exitHelperAddr, "exit", big.NewInt(int64(checkpointBlock)), uint64(leafIndex), diff --git a/e2e-polybft/framework/test-bridge.go b/e2e-polybft/framework/test-bridge.go index ff5bb0d6bb..8afb5a1bee 100644 --- a/e2e-polybft/framework/test-bridge.go +++ b/e2e-polybft/framework/test-bridge.go @@ -1,6 +1,7 @@ package framework import ( + "errors" "fmt" "path" "strconv" @@ -56,37 +57,6 @@ func (t *TestBridge) Start() error { return nil } -func (t *TestBridge) deployRootchainContracts(manifestPath string) error { - args := []string{ - "rootchain", - "init-contracts", - "--manifest", manifestPath, - } - - err := runCommand(t.clusterConfig.Binary, args, t.clusterConfig.GetStdout("bridge")) - if err != nil { - return fmt.Errorf("failed to deploy rootchain contracts: %w", err) - } - - return nil -} - -func (t *TestBridge) fundValidators() error { - args := []string{ - "rootchain", - "fund", - "--data-dir", path.Join(t.clusterConfig.TmpDir, t.clusterConfig.ValidatorPrefix), - "--num", strconv.Itoa(int(t.clusterConfig.ValidatorSetSize) + t.clusterConfig.NonValidatorCount), - } - - err := runCommand(t.clusterConfig.Binary, args, t.clusterConfig.GetStdout("bridge")) - if err != nil { - return fmt.Errorf("failed to deploy fund validators: %w", err) - } - - return nil -} - func (t *TestBridge) Stop() { if err := t.node.Stop(); err != nil { t.t.Error(err) @@ -120,3 +90,63 @@ func (t *TestBridge) WaitUntil(pollFrequency, timeout time.Duration, handler fun } } } + +// Deposit function is used to invoke bridge deposit command +// with appropriately created receivers and amounts for test transactions +func (t *TestBridge) Deposit(tokenType, receivers, amounts string) error { + if tokenType == "" { + return errors.New("provide token type value") + } + + if receivers == "" { + return errors.New("provide at least one receiver address value") + } + + if amounts == "" { + return errors.New("provide at least one amount value") + } + + return t.cmdRun( + "bridge", + "deposit", + "--manifest", path.Join(t.clusterConfig.TmpDir, "manifest.json"), + "--token", tokenType, + "--receivers", receivers, + "--amounts", amounts) +} + +// cmdRun executes arbitrary command from the given binary +func (t *TestBridge) cmdRun(args ...string) error { + return runCommand(t.clusterConfig.Binary, args, t.clusterConfig.GetStdout("bridge")) +} + +// deployRootchainContracts deploys and initializes rootchain contracts +func (t *TestBridge) deployRootchainContracts(manifestPath string) error { + args := []string{ + "rootchain", + "init-contracts", + "--manifest", manifestPath, + } + + if err := t.cmdRun(args...); err != nil { + return fmt.Errorf("failed to deploy rootchain contracts: %w", err) + } + + return nil +} + +// fundRootchainValidators sends predefined amount of tokens to rootchain validators +func (t *TestBridge) fundRootchainValidators() error { + args := []string{ + "rootchain", + "fund", + "--data-dir", path.Join(t.clusterConfig.TmpDir, t.clusterConfig.ValidatorPrefix), + "--num", strconv.Itoa(int(t.clusterConfig.ValidatorSetSize) + t.clusterConfig.NonValidatorCount), + } + + if err := t.cmdRun(args...); err != nil { + return fmt.Errorf("failed to deploy fund validators: %w", err) + } + + return nil +} diff --git a/e2e-polybft/framework/test-cluster.go b/e2e-polybft/framework/test-cluster.go index c989fbb432..4f50cb28c3 100644 --- a/e2e-polybft/framework/test-cluster.go +++ b/e2e-polybft/framework/test-cluster.go @@ -2,7 +2,6 @@ package framework import ( "bytes" - "errors" "fmt" "io" "os" @@ -308,7 +307,7 @@ func NewTestCluster(t *testing.T, validatorsCount int, opts ...ClusterOption) *T err := cluster.Bridge.deployRootchainContracts(manifestPath) require.NoError(t, err) - err = cluster.Bridge.fundValidators() + err = cluster.Bridge.fundRootchainValidators() require.NoError(t, err) } @@ -408,29 +407,6 @@ func (c *TestCluster) cmdRun(args ...string) error { return runCommand(c.Config.Binary, args, c.Config.GetStdout(args[0])) } -// EmitTransfer function is used to invoke e2e rootchain emit command -// with appropriately created wallets and amounts for test transactions -func (c *TestCluster) EmitTransfer(contractAddress, walletAddresses, amounts string) error { - if len(contractAddress) == 0 { - return errors.New("provide contractAddress value") - } - - if len(walletAddresses) == 0 { - return errors.New("provide at least one wallet address value") - } - - if len(amounts) == 0 { - return errors.New("provide at least one amount value") - } - - return c.cmdRun("rootchain", - "emit", - "--manifest", path.Join(c.Config.TmpDir, "manifest.json"), - "--contract", contractAddress, - "--wallets", walletAddresses, - "--amounts", amounts) -} - func (c *TestCluster) Fail(err error) { c.once.Do(func() { c.executionErr = err diff --git a/state/runtime/precompiled/native_transfer.go b/state/runtime/precompiled/native_transfer.go index 1ad195e6d4..1be4a94618 100644 --- a/state/runtime/precompiled/native_transfer.go +++ b/state/runtime/precompiled/native_transfer.go @@ -21,7 +21,7 @@ func (c *nativeTransfer) run(input []byte, caller types.Address, host runtime.Ho } // check if caller is native token contract - if caller != contracts.NativeTokenContract { + if caller != contracts.NativeERC20TokenContract { return abiBoolFalse, runtime.ErrUnauthorizedCaller } diff --git a/state/runtime/precompiled/native_transfer_test.go b/state/runtime/precompiled/native_transfer_test.go index 94a451bfa5..7217810319 100644 --- a/state/runtime/precompiled/native_transfer_test.go +++ b/state/runtime/precompiled/native_transfer_test.go @@ -38,14 +38,14 @@ func Test_NativeTransferPrecompile(t *testing.T) { require.ErrorIs(t, err, runtime.ErrUnauthorizedCaller) }) t.Run("Insufficient balance", func(t *testing.T) { - err := run(contracts.NativeTokenContract, sender, receiver, big.NewInt(10), newDummyHost()) + err := run(contracts.NativeERC20TokenContract, sender, receiver, big.NewInt(10), newDummyHost()) require.ErrorIs(t, err, runtime.ErrInsufficientBalance) }) t.Run("Correct transfer", func(t *testing.T) { host := newDummyHost() host.AddBalance(sender, big.NewInt(1000)) - err := run(contracts.NativeTokenContract, sender, receiver, big.NewInt(100), host) + err := run(contracts.NativeERC20TokenContract, sender, receiver, big.NewInt(100), host) require.NoError(t, err) require.Equal(t, big.NewInt(900), host.GetBalance(sender)) require.Equal(t, big.NewInt(100), host.GetBalance(receiver))