diff --git a/.github/actions/setup-nodejs/action.yml b/.github/actions/setup-nodejs/action.yml index 60064366..83b04882 100644 --- a/.github/actions/setup-nodejs/action.yml +++ b/.github/actions/setup-nodejs/action.yml @@ -9,7 +9,7 @@ inputs: pnpm-version: description: 'The version of pnpm to use' required: true - default: '9.1.1' + default: '9.12.2' pnpm-install-options: description: 'The options to pass to pnpm install' required: true diff --git a/.github/workflows/reuse-run-e2e-tests.yml b/.github/workflows/reuse-run-e2e-tests.yml index b2eb15d9..ade3b050 100644 --- a/.github/workflows/reuse-run-e2e-tests.yml +++ b/.github/workflows/reuse-run-e2e-tests.yml @@ -81,7 +81,7 @@ jobs: - name: Setup nodejs environment uses: ./.github/actions/setup-nodejs with: - pnpm-install-options: '--frozen-lockfile --prefer-offline' + pnpm-install-options: '-F contracts -F e2e --frozen-lockfile --prefer-offline' - name: Login to Docker Hub if: ${{ env.DOCKERHUB_USERNAME != '' && env.DOCKERHUB_TOKEN != '' }} uses: docker/login-action@v3 @@ -151,7 +151,7 @@ jobs: docker container ls -a - name: Run e2e tests id: run_e2e_tests - timeout-minutes: 25 + timeout-minutes: 4 run: | pnpm run -F e2e test:e2e:local - name: Show e2e tests result diff --git a/Makefile b/Makefile index 8f72498f..da10f154 100644 --- a/Makefile +++ b/Makefile @@ -65,12 +65,12 @@ compile-contracts-no-cache: cd contracts/; \ make force-compile -deploy-linea-rollup: +deploy-linea-rollup-v5: # WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE cd contracts/; \ PRIVATE_KEY=$${DEPLOYMENT_PRIVATE_KEY:-0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80} \ - BLOCKCHAIN_NODE=http:\\localhost:8445/ \ - PLONKVERIFIER_NAME=IntegrationTestTrueVerifier \ + RPC_URL=http:\\localhost:8445/ \ + VERIFIER_CONTRACT_NAME=IntegrationTestTrueVerifier \ LINEA_ROLLUP_INITIAL_STATE_ROOT_HASH=0x072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd \ LINEA_ROLLUP_INITIAL_L2_BLOCK_NUMBER=0 \ LINEA_ROLLUP_SECURITY_COUNCIL=0x90F79bf6EB2c4f870365E785982E1f101E93b906 \ @@ -78,14 +78,15 @@ deploy-linea-rollup: LINEA_ROLLUP_RATE_LIMIT_PERIOD=86400 \ LINEA_ROLLUP_RATE_LIMIT_AMOUNT=1000000000000000000000 \ LINEA_ROLLUP_GENESIS_TIMESTAMP=1683325137 \ - npx hardhat deploy --no-compile --network zkevm_dev --tags PlonkVerifier,LineaRollupV5 + npx ts-node local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV5.ts + deploy-linea-rollup-v6: # WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE cd contracts/; \ PRIVATE_KEY=$${DEPLOYMENT_PRIVATE_KEY:-0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80} \ - BLOCKCHAIN_NODE=http:\\localhost:8445/ \ - PLONKVERIFIER_NAME=IntegrationTestTrueVerifier \ + RPC_URL=http:\\localhost:8445/ \ + VERIFIER_CONTRACT_NAME=IntegrationTestTrueVerifier \ LINEA_ROLLUP_INITIAL_STATE_ROOT_HASH=0x072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd \ LINEA_ROLLUP_INITIAL_L2_BLOCK_NUMBER=0 \ LINEA_ROLLUP_SECURITY_COUNCIL=0x90F79bf6EB2c4f870365E785982E1f101E93b906 \ @@ -93,18 +94,19 @@ deploy-linea-rollup-v6: LINEA_ROLLUP_RATE_LIMIT_PERIOD=86400 \ LINEA_ROLLUP_RATE_LIMIT_AMOUNT=1000000000000000000000 \ LINEA_ROLLUP_GENESIS_TIMESTAMP=1683325137 \ - npx hardhat deploy --no-compile --network zkevm_dev --tags PlonkVerifier,LineaRollup + npx ts-node local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV6.ts deploy-l2messageservice: # WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE cd contracts/; \ + MESSAGE_SERVICE_CONTRACT_NAME=L2MessageService \ PRIVATE_KEY=$${DEPLOYMENT_PRIVATE_KEY:-0x1dd171cec7e2995408b5513004e8207fe88d6820aeff0d82463b3e41df251aae} \ - BLOCKCHAIN_NODE=http:\\localhost:8545/ \ + RPC_URL=http:\\localhost:8545/ \ L2MSGSERVICE_SECURITY_COUNCIL=0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 \ L2MSGSERVICE_L1L2_MESSAGE_SETTER=$${L2MSGSERVICE_L1L2_MESSAGE_SETTER:-0xd42e308fc964b71e18126df469c21b0d7bcb86cc} \ L2MSGSERVICE_RATE_LIMIT_PERIOD=86400 \ L2MSGSERVICE_RATE_LIMIT_AMOUNT=1000000000000000000000 \ - npx hardhat deploy --no-compile --network zkevm_dev --tags L2MessageService + npx ts-node local-deployments-artifacts/deployL2MessageService.ts upgrade-linea-rollup-on-uat: cd contracts/; \ @@ -151,8 +153,7 @@ deploy-contracts-v4: $(MAKE) -j2 deploy-linea-rollup-v4 deploy-l2messageservice deploy-contracts: - make compile-contracts - $(MAKE) -j2 deploy-linea-rollup deploy-l2messageservice + $(MAKE) -j2 deploy-linea-rollup-v5 deploy-l2messageservice testnet-start-l2: docker compose -f docker/compose.yml -f docker/compose-testnet-sync.overrides.yml --profile l2 up -d @@ -160,7 +161,7 @@ testnet-start-l2: testnet-start-l2-traces-node-only: docker compose -f docker/compose.yml -f docker/compose-testnet-sync.overries.yml up traces-node -d -testnet-start: start-l1 deploy-linea-rollup testnet-start-l2 +testnet-start: start-l1 deploy-linea-rollup-v5 testnet-start-l2 testnet-restart-l2-keep-state: docker compose -f docker/compose.yml -f docker/compose-testnet-sync.overrides.yml rm -f -s -v sequencer traces-node coordinator make testnet-start-l2 diff --git a/buildSrc/src/main/groovy/net.consensys.zkevm.linea-contracts-helper.gradle b/buildSrc/src/main/groovy/net.consensys.zkevm.linea-contracts-helper.gradle index 7a9f1ca8..4b33d6be 100644 --- a/buildSrc/src/main/groovy/net.consensys.zkevm.linea-contracts-helper.gradle +++ b/buildSrc/src/main/groovy/net.consensys.zkevm.linea-contracts-helper.gradle @@ -1,17 +1,5 @@ import java.util.concurrent.TimeUnit -if (!rootProject.tasks.getNames().contains("compileContracts")) { - rootProject.tasks.register("compileContracts") { - description = "Compiles contracts." - inputs.dir("$rootDir/contracts/contracts") - outputs.cacheIf { true } - - doLast { - runRootMakefileCommand("compile-contracts", Map.of()) - } - } -} - def runRootMakefileCommand(String command, Map env) { def randomSuffix = UUID.randomUUID().toString() File outputFile = file("${command.replace(" ", "-")}-run-output-${randomSuffix}.txt") diff --git a/contracts/common/constants/roles.ts b/contracts/common/constants/roles.ts index 3b9867dc..5581ac07 100644 --- a/contracts/common/constants/roles.ts +++ b/contracts/common/constants/roles.ts @@ -1,5 +1,5 @@ import { HASH_ZERO } from "./general"; -import { generateKeccak256 } from "../helpers"; +import { generateKeccak256 } from "../helpers/hashing"; // Roles hashes export const DEFAULT_ADMIN_ROLE = HASH_ZERO; diff --git a/contracts/common/helpers/deployments.ts b/contracts/common/helpers/deployments.ts index c22ede44..4b2dab75 100644 --- a/contracts/common/helpers/deployments.ts +++ b/contracts/common/helpers/deployments.ts @@ -1,13 +1,7 @@ -import { ContractFactory, Overrides, Wallet, ethers } from "ethers"; -import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; -import { GetContractTypeFromFactory } from "../../typechain-types/common"; -import { ProxyAdmin, ProxyAdmin__factory, TransparentUpgradeableProxy__factory } from "../../typechain-types"; +import { ethers, AbstractSigner, Interface, InterfaceAbi } from "ethers"; -export function getInitializerData( - contractInterface: ethers.Interface, - initializerFunctionName: string, - args: unknown[], -) { +export function getInitializerData(contractAbi: InterfaceAbi, initializerFunctionName: string, args: unknown[]) { + const contractInterface = new Interface(contractAbi); const fragment = contractInterface.getFunction(initializerFunctionName); if (!fragment) { @@ -17,55 +11,14 @@ export function getInitializerData( return contractInterface.encodeFunctionData(fragment, args); } -export const deployContract = async ( - contractFactory: TFactory, - deployer: Wallet | HardhatEthersSigner, +export async function deployContractFromArtifacts( + abi: ethers.InterfaceAbi, + bytecode: ethers.BytesLike, + wallet: AbstractSigner, // eslint-disable-next-line @typescript-eslint/no-explicit-any - args?: any[], - overrides: Overrides = {}, -): Promise> => { - const deploymentArgs = args || []; - const instance = await contractFactory.connect(deployer).deploy(...deploymentArgs, overrides); - return instance.waitForDeployment() as GetContractTypeFromFactory; -}; - -export const deployUpgradableContract = async ( - contractFactory: TFactory, - deployer: Wallet | HardhatEthersSigner, - admin: ProxyAdmin, - initializerData = "0x", - overrides: Overrides = {}, -): Promise> => { - const instance = await deployContract(contractFactory, deployer, [], overrides); - - const proxy = await deployContract(new TransparentUpgradeableProxy__factory(), deployer, [ - await instance.getAddress(), - await admin.getAddress(), - initializerData, - ]); - - return proxy as GetContractTypeFromFactory; -}; - -export async function deployUpgradableContractWithProxyAdmin( - contractFactory: TFactory, - deployer: Wallet | HardhatEthersSigner, - initializer?: { - functionName: string; - args: unknown[]; - }, - overrides: Overrides = {}, -): Promise> { - const proxyFactory = new ProxyAdmin__factory(deployer); - - const proxyAdmin = await deployContract(proxyFactory, deployer, [], overrides); - - let contract: GetContractTypeFromFactory; - if (initializer) { - const initializerData = getInitializerData(contractFactory.interface, initializer.functionName, initializer.args); - contract = await deployUpgradableContract(contractFactory, deployer, proxyAdmin, initializerData, overrides); - } else { - contract = await deployUpgradableContract(contractFactory, deployer, proxyAdmin, "0x", overrides); - } - return contract; + ...args: ethers.ContractMethodArgs +) { + const factory = new ethers.ContractFactory(abi, bytecode, wallet); + const contract = await factory.deploy(...args); + return contract.waitForDeployment(); } diff --git a/contracts/common/helpers/hashing.ts b/contracts/common/helpers/hashing.ts index e69f329b..21561f2b 100644 --- a/contracts/common/helpers/hashing.ts +++ b/contracts/common/helpers/hashing.ts @@ -1,4 +1,4 @@ -import { ethers } from "hardhat"; +import { ethers } from "ethers"; import { encodeData } from "./encoding"; export const generateKeccak256 = (types: string[], values: unknown[], opts: { encodePacked?: boolean }) => diff --git a/contracts/local-deployments-artifacts/deployL2MessageService.ts b/contracts/local-deployments-artifacts/deployL2MessageService.ts new file mode 100644 index 00000000..7e3ca100 --- /dev/null +++ b/contracts/local-deployments-artifacts/deployL2MessageService.ts @@ -0,0 +1,88 @@ +import { ethers } from "ethers"; +import * as dotenv from "dotenv"; +import { + abi as L2MessageServiceAbi, + bytecode as L2MessageServiceBytecode, +} from "./dynamic-artifacts/L2MessageService.json"; +import { abi as ProxyAdminAbi, bytecode as ProxyAdminBytecode } from "./static-artifacts/ProxyAdmin.json"; +import { + abi as TransparentUpgradeableProxyAbi, + bytecode as TransparentUpgradeableProxyBytecode, +} from "./static-artifacts/TransparentUpgradeableProxy.json"; +import { getEnvVarOrDefault } from "../common/helpers/environment"; +import { + L1_L2_MESSAGE_SETTER_ROLE, + L2_MESSAGE_SERVICE_PAUSE_TYPES_ROLES, + L2_MESSAGE_SERVICE_ROLES, + L2_MESSAGE_SERVICE_UNPAUSE_TYPES_ROLES, +} from "../common/constants"; +import { generateRoleAssignments } from "../common/helpers/roles"; +import { deployContractFromArtifacts, getInitializerData } from "../common/helpers/deployments"; + +dotenv.config(); + +async function main() { + const messageServiceName = process.env.MESSAGE_SERVICE_CONTRACT_NAME; + + if (!messageServiceName) { + throw new Error("MESSAGE_SERVICE_CONTRACT_NAME is required"); + } + + const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); + const walletNonce = await wallet.getNonce(); + + const [l2MessageServiceImplementation, proxyAdmin] = await Promise.all([ + deployContractFromArtifacts(L2MessageServiceAbi, L2MessageServiceBytecode, wallet, { nonce: walletNonce }), + deployContractFromArtifacts(ProxyAdminAbi, ProxyAdminBytecode, wallet, { nonce: walletNonce + 1 }), + ]); + + const proxyAdminAddress = await proxyAdmin.getAddress(); + const l2MessageServiceImplementationAddress = await l2MessageServiceImplementation.getAddress(); + + console.log(`L2 ProxyAdmin deployed: address=${proxyAdminAddress}`); + + const pauseTypeRoles = getEnvVarOrDefault("L2MSGSERVICE_PAUSE_TYPE_ROLES", L2_MESSAGE_SERVICE_PAUSE_TYPES_ROLES); + const unpauseTypeRoles = getEnvVarOrDefault( + "L2MSGSERVICE_UNPAUSE_TYPE_ROLES", + L2_MESSAGE_SERVICE_UNPAUSE_TYPES_ROLES, + ); + const defaultRoleAddresses = generateRoleAssignments( + L2_MESSAGE_SERVICE_ROLES, + process.env.L2MSGSERVICE_SECURITY_COUNCIL!, + [{ role: L1_L2_MESSAGE_SETTER_ROLE, addresses: [process.env.L2MSGSERVICE_L1L2_MESSAGE_SETTER!] }], + ); + const roleAddresses = getEnvVarOrDefault("L2MSGSERVICE_ROLE_ADDRESSES", defaultRoleAddresses); + + const initializer = getInitializerData(L2MessageServiceAbi, "initialize", [ + process.env.L2MSGSERVICE_RATE_LIMIT_PERIOD, + process.env.L2MSGSERVICE_RATE_LIMIT_AMOUNT, + process.env.L2MSGSERVICE_SECURITY_COUNCIL, + roleAddresses, + pauseTypeRoles, + unpauseTypeRoles, + ]); + + const proxyContract = await deployContractFromArtifacts( + TransparentUpgradeableProxyAbi, + TransparentUpgradeableProxyBytecode, + wallet, + l2MessageServiceImplementationAddress, + proxyAdminAddress, + initializer, + ); + + const proxyContractAddress = await proxyContract.getAddress(); + const txReceipt = await proxyContract.deploymentTransaction()?.wait(); + + if (!txReceipt) { + throw "Contract deployment transaction receipt not found."; + } + + console.log(`${messageServiceName} deployed: address=${proxyContractAddress} blockNumber=${txReceipt.blockNumber}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/contracts/local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV5.ts b/contracts/local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV5.ts new file mode 100644 index 00000000..04b529bc --- /dev/null +++ b/contracts/local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV5.ts @@ -0,0 +1,113 @@ +import { ethers } from "ethers"; +import fs from "fs"; +import path from "path"; +import * as dotenv from "dotenv"; +import { abi as LineaRollupV5Abi, bytecode as LineaRollupV5Bytecode } from "./dynamic-artifacts/LineaRollupV5.json"; +import { abi as ProxyAdminAbi, bytecode as ProxyAdminBytecode } from "./static-artifacts/ProxyAdmin.json"; +import { + abi as TransparentUpgradeableProxyAbi, + bytecode as TransparentUpgradeableProxyBytecode, +} from "./static-artifacts/TransparentUpgradeableProxy.json"; +import { getRequiredEnvVar } from "../common/helpers/environment"; +import { deployContractFromArtifacts, getInitializerData } from "../common/helpers/deployments"; +import { get1559Fees } from "../scripts/utils"; + +dotenv.config(); + +function findContractArtifacts( + folderPath: string, + contractName: string, +): { abi: ethers.InterfaceAbi; bytecode: ethers.BytesLike } { + const files = fs.readdirSync(folderPath); + + const foundFile = files.find((file) => file === `${contractName}.json`); + + if (!foundFile) { + // Throw an error if the file is not found + throw new Error(`Contract "${contractName}" not found in folder "${folderPath}"`); + } + + // Construct the full file path + const filePath = path.join(folderPath, foundFile); + + // Read the file content + const fileContent = fs.readFileSync(filePath, "utf-8").trim(); + const parsedContent = JSON.parse(fileContent); + return parsedContent; +} + +async function main() { + const verifierName = getRequiredEnvVar("VERIFIER_CONTRACT_NAME"); + const lineaRollupInitialStateRootHash = getRequiredEnvVar("LINEA_ROLLUP_INITIAL_STATE_ROOT_HASH"); + const lineaRollupInitialL2BlockNumber = getRequiredEnvVar("LINEA_ROLLUP_INITIAL_L2_BLOCK_NUMBER"); + const lineaRollupSecurityCouncil = getRequiredEnvVar("LINEA_ROLLUP_SECURITY_COUNCIL"); + const lineaRollupOperators = getRequiredEnvVar("LINEA_ROLLUP_OPERATORS").split(","); + const lineaRollupRateLimitPeriodInSeconds = getRequiredEnvVar("LINEA_ROLLUP_RATE_LIMIT_PERIOD"); + const lineaRollupTateLimitAmountInWei = getRequiredEnvVar("LINEA_ROLLUP_RATE_LIMIT_AMOUNT"); + const lineaRollupGenesisTimestamp = getRequiredEnvVar("LINEA_ROLLUP_GENESIS_TIMESTAMP"); + const lineaRollupName = "LineaRollupV5"; + + const verifierArtifacts = findContractArtifacts(path.join(__dirname, "./dynamic-artifacts"), verifierName); + + const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); + + const [walletNonce, { gasPrice }] = await Promise.all([wallet.getNonce(), get1559Fees(provider)]); + + const [verifier, lineaRollupImplementation, proxyAdmin] = await Promise.all([ + deployContractFromArtifacts(verifierArtifacts.abi, verifierArtifacts.bytecode, wallet, { + nonce: walletNonce, + gasPrice, + }), + deployContractFromArtifacts(LineaRollupV5Abi, LineaRollupV5Bytecode, wallet, { + nonce: walletNonce + 1, + gasPrice, + }), + deployContractFromArtifacts(ProxyAdminAbi, ProxyAdminBytecode, wallet, { + nonce: walletNonce + 2, + gasPrice, + }), + ]); + + const proxyAdminAddress = await proxyAdmin.getAddress(); + const verifierAddress = await verifier.getAddress(); + const lineaRollupImplementationAddress = await lineaRollupImplementation.getAddress(); + + console.log(`${verifierName} deployed: address=${verifierAddress}`); + console.log(`L1 ProxyAdmin deployed: address=${proxyAdminAddress}`); + + const initializer = getInitializerData(LineaRollupV5Abi, "initialize", [ + lineaRollupInitialStateRootHash, + lineaRollupInitialL2BlockNumber, + verifierAddress, + lineaRollupSecurityCouncil, + lineaRollupOperators, + lineaRollupRateLimitPeriodInSeconds, + lineaRollupTateLimitAmountInWei, + lineaRollupGenesisTimestamp, + ]); + + const proxyContract = await deployContractFromArtifacts( + TransparentUpgradeableProxyAbi, + TransparentUpgradeableProxyBytecode, + wallet, + lineaRollupImplementationAddress, + proxyAdminAddress, + initializer, + { gasPrice }, + ); + + const proxyContractAddress = await proxyContract.getAddress(); + const txReceipt = await proxyContract.deploymentTransaction()?.wait(); + + if (!txReceipt) { + throw "Contract deployment transaction receipt not found."; + } + + console.log(`${lineaRollupName} deployed: address=${proxyContractAddress} blockNumber=${txReceipt.blockNumber}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/contracts/local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV6.ts b/contracts/local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV6.ts new file mode 100644 index 00000000..7b44bca7 --- /dev/null +++ b/contracts/local-deployments-artifacts/deployPlonkVerifierAndLineaRollupV6.ts @@ -0,0 +1,130 @@ +import { ethers } from "ethers"; +import fs from "fs"; +import path from "path"; +import * as dotenv from "dotenv"; +import { abi as LineaRollupV6Abi, bytecode as LineaRollupV6Bytecode } from "./dynamic-artifacts/LineaRollupV6.json"; +import { abi as ProxyAdminAbi, bytecode as ProxyAdminBytecode } from "./static-artifacts/ProxyAdmin.json"; +import { + abi as TransparentUpgradeableProxyAbi, + bytecode as TransparentUpgradeableProxyBytecode, +} from "./static-artifacts/TransparentUpgradeableProxy.json"; +import { getEnvVarOrDefault, getRequiredEnvVar } from "../common/helpers/environment"; +import { deployContractFromArtifacts, getInitializerData } from "../common/helpers/deployments"; +import { generateRoleAssignments } from "../common/helpers/roles"; +import { + LINEA_ROLLUP_PAUSE_TYPES_ROLES, + LINEA_ROLLUP_ROLES, + LINEA_ROLLUP_UNPAUSE_TYPES_ROLES, + OPERATOR_ROLE, +} from "../common/constants"; +import { get1559Fees } from "../scripts/utils"; + +dotenv.config(); + +function findContractArtifacts( + folderPath: string, + contractName: string, +): { abi: ethers.InterfaceAbi; bytecode: ethers.BytesLike } { + const files = fs.readdirSync(folderPath); + + const foundFile = files.find((file) => file === `${contractName}.json`); + + if (!foundFile) { + // Throw an error if the file is not found + throw new Error(`Contract "${contractName}" not found in folder "${folderPath}"`); + } + + // Construct the full file path + const filePath = path.join(folderPath, foundFile); + + // Read the file content + const fileContent = fs.readFileSync(filePath, "utf-8").trim(); + const parsedContent = JSON.parse(fileContent); + return parsedContent; +} + +async function main() { + const verifierName = getRequiredEnvVar("VERIFIER_CONTRACT_NAME"); + const lineaRollupInitialStateRootHash = getRequiredEnvVar("LINEA_ROLLUP_INITIAL_STATE_ROOT_HASH"); + const lineaRollupInitialL2BlockNumber = getRequiredEnvVar("LINEA_ROLLUP_INITIAL_L2_BLOCK_NUMBER"); + const lineaRollupSecurityCouncil = getRequiredEnvVar("LINEA_ROLLUP_SECURITY_COUNCIL"); + const lineaRollupOperators = getRequiredEnvVar("LINEA_ROLLUP_OPERATORS").split(","); + const lineaRollupRateLimitPeriodInSeconds = getRequiredEnvVar("LINEA_ROLLUP_RATE_LIMIT_PERIOD"); + const lineaRollupRateLimitAmountInWei = getRequiredEnvVar("LINEA_ROLLUP_RATE_LIMIT_AMOUNT"); + const lineaRollupGenesisTimestamp = getRequiredEnvVar("LINEA_ROLLUP_GENESIS_TIMESTAMP"); + const multiCallAddress = "0xcA11bde05977b3631167028862bE2a173976CA11"; + const lineaRollupName = "LineaRollupV6"; + + const pauseTypeRoles = getEnvVarOrDefault("LINEA_ROLLUP_PAUSE_TYPE_ROLES", LINEA_ROLLUP_PAUSE_TYPES_ROLES); + const unpauseTypeRoles = getEnvVarOrDefault("LINEA_ROLLUP_UNPAUSE_TYPE_ROLES", LINEA_ROLLUP_UNPAUSE_TYPES_ROLES); + const defaultRoleAddresses = generateRoleAssignments(LINEA_ROLLUP_ROLES, lineaRollupSecurityCouncil, [ + { role: OPERATOR_ROLE, addresses: lineaRollupOperators }, + ]); + const roleAddresses = getEnvVarOrDefault("LINEA_ROLLUP_ROLE_ADDRESSES", defaultRoleAddresses); + + const verifierArtifacts = findContractArtifacts(path.join(__dirname, "./dynamic-artifacts"), verifierName); + + const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); + + const [walletNonce, { gasPrice }] = await Promise.all([wallet.getNonce(), get1559Fees(provider)]); + + const [verifier, lineaRollupImplementation, proxyAdmin] = await Promise.all([ + deployContractFromArtifacts(verifierArtifacts.abi, verifierArtifacts.bytecode, wallet, { + nonce: walletNonce, + gasPrice, + }), + deployContractFromArtifacts(LineaRollupV6Abi, LineaRollupV6Bytecode, wallet, { + nonce: walletNonce + 1, + gasPrice, + }), + deployContractFromArtifacts(ProxyAdminAbi, ProxyAdminBytecode, wallet, { nonce: walletNonce + 2, gasPrice }), + ]); + + const proxyAdminAddress = await proxyAdmin.getAddress(); + const verifierAddress = await verifier.getAddress(); + const lineaRollupImplementationAddress = await lineaRollupImplementation.getAddress(); + + console.log(`${verifierName} deployed: address=${verifierAddress}`); + console.log(`L1 ProxyAdmin deployed: address=${proxyAdminAddress}`); + + const initializer = getInitializerData(LineaRollupV6Abi, "initialize", [ + { + initialStateRootHash: lineaRollupInitialStateRootHash, + initialL2BlockNumber: lineaRollupInitialL2BlockNumber, + genesisTimestamp: lineaRollupGenesisTimestamp, + defaultVerifier: verifierAddress, + rateLimitPeriodInSeconds: lineaRollupRateLimitPeriodInSeconds, + rateLimitAmountInWei: lineaRollupRateLimitAmountInWei, + roleAddresses, + pauseTypeRoles, + unpauseTypeRoles, + fallbackOperator: multiCallAddress, + defaultAdmin: lineaRollupSecurityCouncil, + }, + ]); + + const proxyContract = await deployContractFromArtifacts( + TransparentUpgradeableProxyAbi, + TransparentUpgradeableProxyBytecode, + wallet, + lineaRollupImplementationAddress, + proxyAdminAddress, + initializer, + { gasPrice }, + ); + + const proxyContractAddress = await proxyContract.getAddress(); + const txReceipt = await proxyContract.deploymentTransaction()?.wait(); + + if (!txReceipt) { + throw "Contract deployment transaction receipt not found."; + } + + console.log(`${lineaRollupName} deployed: address=${proxyContractAddress} blockNumber=${txReceipt.blockNumber}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/contracts/local-deployments-artifacts/dynamic-artifacts/IntegrationTestTrueVerifier.json b/contracts/local-deployments-artifacts/dynamic-artifacts/IntegrationTestTrueVerifier.json new file mode 100644 index 00000000..640a40c4 --- /dev/null +++ b/contracts/local-deployments-artifacts/dynamic-artifacts/IntegrationTestTrueVerifier.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IntegrationTestTrueVerifier", + "sourceName": "contracts/test-contracts/IntegrationTestTrueVerifier.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "name": "Verify", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600e575f80fd5b506101578061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80637e4f7a8a1461002d575b5f80fd5b61004561003b366004610059565b6001949350505050565b604051901515815260200160405180910390f35b5f805f806040858703121561006c575f80fd5b843567ffffffffffffffff811115610082575f80fd5b8501601f81018713610092575f80fd5b803567ffffffffffffffff8111156100a8575f80fd5b8760208284010111156100b9575f80fd5b60209182019550935085013567ffffffffffffffff8111156100d9575f80fd5b8501601f810187136100e9575f80fd5b803567ffffffffffffffff8111156100ff575f80fd5b8760208260051b8401011115610113575f80fd5b94979396506020019450505056fea264697066735822122062dedc2ecf95b82b9cf0393cdd25c25e18520480bdbca1a12c73aed453b272d064736f6c634300081a0033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80637e4f7a8a1461002d575b5f80fd5b61004561003b366004610059565b6001949350505050565b604051901515815260200160405180910390f35b5f805f806040858703121561006c575f80fd5b843567ffffffffffffffff811115610082575f80fd5b8501601f81018713610092575f80fd5b803567ffffffffffffffff8111156100a8575f80fd5b8760208284010111156100b9575f80fd5b60209182019550935085013567ffffffffffffffff8111156100d9575f80fd5b8501601f810187136100e9575f80fd5b803567ffffffffffffffff8111156100ff575f80fd5b8760208260051b8401011115610113575f80fd5b94979396506020019450505056fea264697066735822122062dedc2ecf95b82b9cf0393cdd25c25e18520480bdbca1a12c73aed453b272d064736f6c634300081a0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/local-deployments-artifacts/dynamic-artifacts/L2MessageService.json b/contracts/local-deployments-artifacts/dynamic-artifacts/L2MessageService.json new file mode 100644 index 00000000..5df84c51 --- /dev/null +++ b/contracts/local-deployments-artifacts/dynamic-artifacts/L2MessageService.json @@ -0,0 +1,1306 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2MessageService", + "sourceName": "contracts/messageService/l2/L2MessageService.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ArrayLengthsDoNotMatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "FeePaymentFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FeeTooLow", + "type": "error" + }, + { + "inputs": [], + "name": "FinalRollingHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "IsNotPaused", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "IsPaused", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "found", + "type": "uint256" + } + ], + "name": "L1MessageNumberSynchronizationWrong", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "expected", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "found", + "type": "bytes32" + } + ], + "name": "L1RollingHashSynchronizationWrong", + "type": "error" + }, + { + "inputs": [], + "name": "LimitIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDoesNotExistOrHasAlreadyBeenClaimed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "MessageHashesListLengthHigherThanOneHundred", + "type": "error" + }, + { + "inputs": [], + "name": "MessageHashesListLengthIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "name": "MessageSendingFailed", + "type": "error" + }, + { + "inputs": [], + "name": "PeriodIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "RateLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ValueSentTooLow", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroHashNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "resettingAddress", + "type": "address" + } + ], + "name": "AmountUsedInPeriodReset", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32[]", + "name": "messageHashes", + "type": "bytes32[]" + } + ], + "name": "L1L2MessageHashesAddedToInbox", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "amountChangeBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "amountUsedLoweredToLimit", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "usedAmountResetToZero", + "type": "bool" + } + ], + "name": "LimitAmountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_messageHash", + "type": "bytes32" + } + ], + "name": "MessageClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "_messageHash", + "type": "bytes32" + } + ], + "name": "MessageSent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "previousMinimumFee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newMinimumFee", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "calledBy", + "type": "address" + } + ], + "name": "MinimumFeeChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "PauseTypeRoleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "messageSender", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "periodInSeconds", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "limitInWei", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentPeriodEnd", + "type": "uint256" + } + ], + "name": "RateLimitInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rollingHash", + "type": "bytes32" + } + ], + "name": "RollingHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ServiceVersionMigrated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IPauseManager.PauseType", + "name": "unPauseType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "UnPauseTypeRoleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "messageSender", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "UnPaused", + "type": "event" + }, + { + "inputs": [], + "name": "CONTRACT_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INBOX_STATUS_CLAIMED", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INBOX_STATUS_RECEIVED", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INBOX_STATUS_UNKNOWN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "L1_L2_MESSAGE_SETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINIMUM_FEE_SETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ALL_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_L1_L2_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_L2_L1_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_LIMIT_SETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_ALL_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_L1_L2_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_L2_L1_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "USED_RATE_LIMIT_RESETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_messageHashes", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "_startingMessageNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_finalMessageNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_finalRollingHash", + "type": "bytes32" + } + ], + "name": "anchorL1L2MessageHashes", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_feeRecipient", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "name": "claimMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currentPeriodAmountInWei", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentPeriodEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "inboxL1L2MessageStatus", + "outputs": [ + { + "internalType": "uint256", + "name": "messageStatus", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_rateLimitPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_rateLimitAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_defaultAdmin", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "addressWithRole", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPermissionsManager.RoleAddress[]", + "name": "_roleAddresses", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_pauseTypeRoles", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_unpauseTypeRoles", + "type": "tuple[]" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + } + ], + "name": "l1RollingHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "rollingHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastAnchoredL1MessageNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "limitInWei", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minimumFeeInWei", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextMessageNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "pauseByType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "pauseType", + "type": "bytes32" + } + ], + "name": "pauseTypeStatuses", + "outputs": [ + { + "internalType": "bool", + "name": "pauseStatus", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodInSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addressWithRole", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPermissionsManager.RoleAddress[]", + "name": "_roleAddresses", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_pauseTypeRoles", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_unpauseTypeRoles", + "type": "tuple[]" + } + ], + "name": "reinitializePauseTypesAndPermissions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resetAmountUsedInPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "resetRateLimitAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "sendMessage", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "sender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_feeInWei", + "type": "uint256" + } + ], + "name": "setMinimumFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "unPauseByType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b506200001c6200002c565b620000266200002c565b620000ed565b600054610100900460ff1615620000995760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000eb576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61319180620000fd6000396000f3fe6080604052600436106102dc5760003560e01c80638994588311610184578063b9174ba3116100d6578063c1dc0f071161008a578063d547741f11610064578063d547741f14610913578063e196fb5d14610933578063f866aa131461095357600080fd5b8063c1dc0f0714610899578063cc5782f6146108af578063cc6f7251146108df57600080fd5b8063bcbd6fcd116100bb578063bcbd6fcd1461081b578063bf3e75051461084f578063c0729ab11461088357600080fd5b8063b9174ba3146107c7578063bc61e733146107fb57600080fd5b80639ac25d0811610138578063ad422ff011610112578063ad422ff014610785578063aea4f7451461079b578063b837dbe9146107b057600080fd5b80639ac25d08146107295780639f3ce55a1461075d578063a217fddf1461077057600080fd5b806391d148541161016957806391d14854146106aa57806391f7b901146106fd5780639340a1d11461071257600080fd5b8063899458831461065f5780638de494871461067657600080fd5b806348922ab71161023d57806367e404ce116101f157806374377a34116101cb57806374377a34146105e85780637d1e8c551461061c5780637fe335d31461063157600080fd5b806367e404ce1461055e578063687a6fe0146105945780636a906b80146105b457600080fd5b80635230eef2116102225780635230eef2146104f4578063557eac7314610528578063587944561461054857600080fd5b806348922ab7146104ad578063491e0936146104d457600080fd5b80632f2ff15d1161029457806338b903331161027957806338b90333146104035780633b12eccb146104595780633c3621461461048d57600080fd5b80632f2ff15d146103c357806336568abe146103e357600080fd5b80631065a399116102c55780631065a39914610351578063182a750614610373578063248a9ca31461039357600080fd5b806301ffc9a7146102e15780630f6893ca14610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612985565b610973565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b506103436103313660046129c7565b60b06020526000908152604090205481565b60405190815260200161030d565b34801561035d57600080fd5b5061037161036c3660046129e0565b610a0c565b005b34801561037f57600080fd5b5061037161038e3660046129c7565b610b17565b34801561039f57600080fd5b506103436103ae3660046129c7565b60009081526065602052604090206001015490565b3480156103cf57600080fd5b506103716103de366004612a23565b610b8a565b3480156103ef57600080fd5b506103716103fe366004612a23565b610bb4565b34801561040f57600080fd5b5061044c6040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b60405161030d9190612a77565b34801561046557600080fd5b506103437fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b34801561049957600080fd5b506103716104a8366004612ac8565b610c67565b3480156104b957600080fd5b506104c2600181565b60405160ff909116815260200161030d565b3480156104e057600080fd5b506103716104ef366004612b9c565b610f64565b34801561050057600080fd5b506103437f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b34801561053457600080fd5b506103716105433660046129c7565b61126d565b34801561055457600080fd5b5061034360995481565b34801561056a57600080fd5b506101155460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b3480156105a057600080fd5b506103716105af366004612c77565b611335565b3480156105c057600080fd5b506103437fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b3480156105f457600080fd5b506103437f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd6741581565b34801561062857600080fd5b506104c2600081565b34801561063d57600080fd5b5061034361064c3660046129c7565b6101196020526000908152604090205481565b34801561066b57600080fd5b506103436101175481565b34801561068257600080fd5b506103437fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b3480156106b657600080fd5b506103016106c5366004612a23565b600091825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561070957600080fd5b506104c2600281565b34801561071e57600080fd5b506103436101185481565b34801561073557600080fd5b506103437f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b61037161076b366004612d39565b611553565b34801561077c57600080fd5b50610343600081565b34801561079157600080fd5b5061034360985481565b3480156107a757600080fd5b5061037161176e565b3480156107bc57600080fd5b506103436101165481565b3480156107d357600080fd5b506103437f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b34801561080757600080fd5b506103016108163660046129e0565b6117ca565b34801561082757600080fd5b506103437fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba281565b34801561085b57600080fd5b506103437f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b34801561088f57600080fd5b50610343609a5481565b3480156108a557600080fd5b5061034360975481565b3480156108bb57600080fd5b506103016108ca3660046129c7565b60a56020526000908152604090205460ff1681565b3480156108eb57600080fd5b506103437fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b34801561091f57600080fd5b5061037161092e366004612a23565b6117ef565b34801561093f57600080fd5b5061037161094e3660046129e0565b611814565b34801561095f57600080fd5b5061037161096e366004612d95565b6118ee565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a0657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60a86000826008811115610a2257610a22612e2f565b6008811115610a3357610a33612e2f565b815260200190815260200160002054610a4b81611a4a565b610a54826117ca565b610a9557816040517f18659654000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b60405180910390fd5b816008811115610aa757610aa7612e2f565b60a68054600190921b199091169055816008811115610ac857610ac8612e2f565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba2610b4181611a4a565b610117805490839055604080518281526020810185905233917f6d8040017e56a6d91bb242def14af5d7eae1eaff7475e45c678dac5d49d35498910160405180910390a2505050565b600082815260656020526040902060010154610ba581611a4a565b610baf8383611a57565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a8c565b610c638282611b4b565b5050565b6001610c7281611c06565b7f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd67415610c9c81611a4a565b856000819003610cd8576040517f6446cc9c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6064811115610d16576040517f3b17443400000000000000000000000000000000000000000000000000000000815260048101829052602401610a8c565b6000849003610d51576040517f36a4bb9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101185480610d61600189612ed6565b14610dae57610d71600188612ed6565b6040517fd39e75f9000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610a8c565b6000818152610119602052604081205490805b84811015610e46578b8b82818110610ddb57610ddb612ee9565b905060200201359150600060ff1660b060008481526020019081526020016000205403610e3657600082815260b06020526040902060019055610e28838360009182526020526040902090565b9250610e3384612f18565b93505b610e3f81612f18565b9050610dc1565b50878314610e8a576040517fd39e75f90000000000000000000000000000000000000000000000000000000081526004810189905260248101849052604401610a8c565b818714610ecd576040517f7557a60a0000000000000000000000000000000000000000000000000000000081526004810188905260248101839052604401610a8c565b610118548314610f57576101188390556000838152610119602052604090819020839055517f9995fb3da0c2de4012f2b814b6fc29ce7507571dcb20b8d0bd38621a842df1eb90610f21908d908d90612f50565b60405180910390a1604051829084907f99b65a4301b38c09fb6a5f27052d73e8372bbe8f6779d678bfe8a41b66cce7ac90600090a35b5050505050505050505050565b610f6c611c48565b858784848760005a9050610f806002611cbb565b6000610f918f8f8f8f8c8f8f611d4d565b9050610f9c81611da8565b8e61011560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d604051611009929190612fa2565b60006040518083038185875af1925050503d8060008114611046576040519150601f19603f3d011682016040523d82523d6000602084013e61104b565b606091505b5091509150816110b5578051156110655780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610a8c919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b61011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd1517905560405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e90600090a25050861590506112535785600084900361119f57853b15801561119d573a5a61113a61ae3486612fb2565b6111449190612ed6565b61114e9190612fc5565b9150818811156111995773ffffffffffffffffffffffffffffffffffffffff87166108fc61117c848b612ed6565b6040518115909202916000818181858888f193505050505061119d565b8791505b505b600073ffffffffffffffffffffffffffffffffffffffff8416156111c357836111c5565b335b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505090508061124f576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610a8c565b5050505b505050505050611263600160b155565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261129781611a4a565b60008060004260995410156112be576097546112b39042612fb2565b6099555060016112d0565b609a548510156112d057849250600191505b609885905580806112de5750815b156112e957609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b600054610100900460ff16158080156113555750600054600160ff909116105b8061136f5750303b15801561136f575060005460ff166001145b6113fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a8c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561145957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611461611e0e565b611469611e0e565b611471611e0e565b61147b8a8a611ea7565b611483612017565b61148f858585856120b6565b61149a600089611a57565b6114a48787612380565b60016101165561011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd15179055655af3107a400061011755801561154757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61155d6003611cbb565b73ffffffffffffffffffffffffffffffffffffffff84166115aa576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b348311156115e4576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101175480841015611622576040517f732f941300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061162f8387612ed6565b915061163b8634612ed6565b6101168054919250600091908261165183612f18565b9091555090506116696116648484612fb2565b612555565b600061167a338a8686868c8c611d4d565b9050808973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8787878d8d6040516116e2959493929190612fdc565b60405180910390a4604051600090419087908381818185875af1925050503d806000811461172c576040519150601f19603f3d011682016040523d82523d6000602084013e611731565b606091505b5050905080611547576040517fa57c4df4000000000000000000000000000000000000000000000000000000008152416004820152602401610a8c565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf961179881611a4a565b6000609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b60008160088111156117de576117de612e2f565b60a654600190911b16151592915050565b60008281526065602052604090206001015461180a81611a4a565b610baf8383611b4b565b60a7600082600881111561182a5761182a612e2f565b600881111561183b5761183b612e2f565b81526020019081526020016000205461185381611a4a565b61185c826117ca565b1561189557816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b8160088111156118a7576118a7612e2f565b60a68054600190921b90911790558160088111156118c7576118c7612e2f565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d455933610aeb565b600054600690610100900460ff16158015611910575060005460ff8083169116105b61199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a8c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556119d78787612380565b6119e3858585856120b6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b611a5481336125cb565b50565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610c6357600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611aed3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610c6357600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b611c0f816117ca565b15611a5457806040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b600260b15403611cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a8c565b600260b155565b60a654816008811115611cd057611cd0612e2f565b6001901b811615611d0f57816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b6002811615610c635760016040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b600060405188815287602082015286604082015285606082015284608082015260c060a08201528260c08201526020830660008115611d8d578160200390505b848660e085013790930160e001902098975050505050505050565b600081815260b06020526040902054600114611df3576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610a8c565b600090815260b06020526040902060029055565b600160b155565b600054610100900460ff16611ea5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b565b600054610100900460ff16611f3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b81600003611f78576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611fb2576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055611fc68242612fb2565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b600054610100900460ff166120ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b611ea5612685565b600054610100900460ff1661214d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b8260005b818110156122615785858281811061216b5761216b612ee9565b9050604002016020013560a7600088888581811061218b5761218b612ee9565b6121a192602060409092020190810191506129e0565b60088111156121b2576121b2612e2f565b60088111156121c3576121c3612e2f565b81526020810191909152604001600020557f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec609186868381811061220757612207612ee9565b61221d92602060409092020190810191506129e0565b87878481811061222f5761222f612ee9565b9050604002016020013560405161224792919061303e565b60405180910390a18061225981612f18565b915050612151565b5081905060005b818110156123785783838281811061228257612282612ee9565b9050604002016020013560a860008686858181106122a2576122a2612ee9565b6122b892602060409092020190810191506129e0565b60088111156122c9576122c9612e2f565b60088111156122da576122da612e2f565b81526020810191909152604001600020557fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c284848381811061231e5761231e612ee9565b61233492602060409092020190810191506129e0565b85858481811061234657612346612ee9565b9050604002016020013560405161235e92919061303e565b60405180910390a18061237081612f18565b915050612268565b505050505050565b600054610100900460ff16612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b8060005b8181101561254f57600084848381811061243757612437612ee9565b61244d9260206040909202019081019150613059565b73ffffffffffffffffffffffffffffffffffffffff160361249a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106124ac576124ac612ee9565b905060400201602001356000801b036124f1576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61253d84848381811061250657612506612ee9565b9050604002016020013585858481811061252257612522612ee9565b6125389260206040909202019081019150613059565b611a57565b8061254781612f18565b91505061241b565b50505050565b8015611a545742609954101561257a576097546125729042612fb2565b60995561258a565b609a546125879082612fb2565b90505b6098548111156125c6576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610c635761260b8161271c565b61261683602061273b565b604051602001612627929190613076565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610a8c91600401612a77565b600054610100900460ff16611e07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b6060610a0673ffffffffffffffffffffffffffffffffffffffff831660145b6060600061274a836002612fc5565b612755906002612fb2565b67ffffffffffffffff81111561276d5761276d6130f7565b6040519080825280601f01601f191660200182016040528015612797576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127ce576127ce612ee9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061283157612831612ee9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061286d846002612fc5565b612878906001612fb2565b90505b6001811115612915577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106128b9576128b9612ee9565b1a60f81b8282815181106128cf576128cf612ee9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361290e81613126565b905061287b565b50831561297e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a8c565b9392505050565b60006020828403121561299757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461297e57600080fd5b6000602082840312156129d957600080fd5b5035919050565b6000602082840312156129f257600080fd5b81356009811061297e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611a5457600080fd5b60008060408385031215612a3657600080fd5b823591506020830135612a4881612a01565b809150509250929050565b60005b83811015612a6e578181015183820152602001612a56565b50506000910152565b6020815260008251806020840152612a96816040850160208701612a53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080600080600060808688031215612ae057600080fd5b853567ffffffffffffffff80821115612af857600080fd5b818801915088601f830112612b0c57600080fd5b813581811115612b1b57600080fd5b8960208260051b8501011115612b3057600080fd5b60209283019a909950918801359760408101359750606001359550909350505050565b60008083601f840112612b6557600080fd5b50813567ffffffffffffffff811115612b7d57600080fd5b602083019150836020828501011115612b9557600080fd5b9250929050565b60008060008060008060008060e0898b031215612bb857600080fd5b8835612bc381612a01565b97506020890135612bd381612a01565b965060408901359550606089013594506080890135612bf181612a01565b935060a089013567ffffffffffffffff811115612c0d57600080fd5b612c198b828c01612b53565b999c989b50969995989497949560c00135949350505050565b60008083601f840112612c4457600080fd5b50813567ffffffffffffffff811115612c5c57600080fd5b6020830191508360208260061b8501011115612b9557600080fd5b600080600080600080600080600060c08a8c031215612c9557600080fd5b8935985060208a0135975060408a0135612cae81612a01565b965060608a013567ffffffffffffffff80821115612ccb57600080fd5b612cd78d838e01612c32565b909850965060808c0135915080821115612cf057600080fd5b612cfc8d838e01612c32565b909650945060a08c0135915080821115612d1557600080fd5b50612d228c828d01612c32565b915080935050809150509295985092959850929598565b60008060008060608587031215612d4f57600080fd5b8435612d5a81612a01565b935060208501359250604085013567ffffffffffffffff811115612d7d57600080fd5b612d8987828801612b53565b95989497509550505050565b60008060008060008060608789031215612dae57600080fd5b863567ffffffffffffffff80821115612dc657600080fd5b612dd28a838b01612c32565b90985096506020890135915080821115612deb57600080fd5b612df78a838b01612c32565b90965094506040890135915080821115612e1057600080fd5b50612e1d89828a01612c32565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60098110612e95577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610a068284612e5e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610a0657610a06612ea7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f4957612f49612ea7565b5060010190565b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612f8957600080fd5b8260051b80856040850137919091016040019392505050565b8183823760009101908152919050565b80820180821115610a0657610a06612ea7565b8082028115828204841417610a0657610a06612ea7565b85815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b6040810161304c8285612e5e565b8260208301529392505050565b60006020828403121561306b57600080fd5b813561297e81612a01565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516130ae816017850160208801612a53565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516130eb816028840160208801612a53565b01602801949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008161313557613135612ea7565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220470c39572685968d6ec85d8e7d7ed38ca849845528f9e12455980a8581d1854164736f6c63430008130033", + "deployedBytecode": "0x6080604052600436106102dc5760003560e01c80638994588311610184578063b9174ba3116100d6578063c1dc0f071161008a578063d547741f11610064578063d547741f14610913578063e196fb5d14610933578063f866aa131461095357600080fd5b8063c1dc0f0714610899578063cc5782f6146108af578063cc6f7251146108df57600080fd5b8063bcbd6fcd116100bb578063bcbd6fcd1461081b578063bf3e75051461084f578063c0729ab11461088357600080fd5b8063b9174ba3146107c7578063bc61e733146107fb57600080fd5b80639ac25d0811610138578063ad422ff011610112578063ad422ff014610785578063aea4f7451461079b578063b837dbe9146107b057600080fd5b80639ac25d08146107295780639f3ce55a1461075d578063a217fddf1461077057600080fd5b806391d148541161016957806391d14854146106aa57806391f7b901146106fd5780639340a1d11461071257600080fd5b8063899458831461065f5780638de494871461067657600080fd5b806348922ab71161023d57806367e404ce116101f157806374377a34116101cb57806374377a34146105e85780637d1e8c551461061c5780637fe335d31461063157600080fd5b806367e404ce1461055e578063687a6fe0146105945780636a906b80146105b457600080fd5b80635230eef2116102225780635230eef2146104f4578063557eac7314610528578063587944561461054857600080fd5b806348922ab7146104ad578063491e0936146104d457600080fd5b80632f2ff15d1161029457806338b903331161027957806338b90333146104035780633b12eccb146104595780633c3621461461048d57600080fd5b80632f2ff15d146103c357806336568abe146103e357600080fd5b80631065a399116102c55780631065a39914610351578063182a750614610373578063248a9ca31461039357600080fd5b806301ffc9a7146102e15780630f6893ca14610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612985565b610973565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b506103436103313660046129c7565b60b06020526000908152604090205481565b60405190815260200161030d565b34801561035d57600080fd5b5061037161036c3660046129e0565b610a0c565b005b34801561037f57600080fd5b5061037161038e3660046129c7565b610b17565b34801561039f57600080fd5b506103436103ae3660046129c7565b60009081526065602052604090206001015490565b3480156103cf57600080fd5b506103716103de366004612a23565b610b8a565b3480156103ef57600080fd5b506103716103fe366004612a23565b610bb4565b34801561040f57600080fd5b5061044c6040518060400160405280600381526020017f312e30000000000000000000000000000000000000000000000000000000000081525081565b60405161030d9190612a77565b34801561046557600080fd5b506103437fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b34801561049957600080fd5b506103716104a8366004612ac8565b610c67565b3480156104b957600080fd5b506104c2600181565b60405160ff909116815260200161030d565b3480156104e057600080fd5b506103716104ef366004612b9c565b610f64565b34801561050057600080fd5b506103437f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b34801561053457600080fd5b506103716105433660046129c7565b61126d565b34801561055457600080fd5b5061034360995481565b34801561056a57600080fd5b506101155460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b3480156105a057600080fd5b506103716105af366004612c77565b611335565b3480156105c057600080fd5b506103437fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b3480156105f457600080fd5b506103437f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd6741581565b34801561062857600080fd5b506104c2600081565b34801561063d57600080fd5b5061034361064c3660046129c7565b6101196020526000908152604090205481565b34801561066b57600080fd5b506103436101175481565b34801561068257600080fd5b506103437fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b3480156106b657600080fd5b506103016106c5366004612a23565b600091825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561070957600080fd5b506104c2600281565b34801561071e57600080fd5b506103436101185481565b34801561073557600080fd5b506103437f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b61037161076b366004612d39565b611553565b34801561077c57600080fd5b50610343600081565b34801561079157600080fd5b5061034360985481565b3480156107a757600080fd5b5061037161176e565b3480156107bc57600080fd5b506103436101165481565b3480156107d357600080fd5b506103437f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b34801561080757600080fd5b506103016108163660046129e0565b6117ca565b34801561082757600080fd5b506103437fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba281565b34801561085b57600080fd5b506103437f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b34801561088f57600080fd5b50610343609a5481565b3480156108a557600080fd5b5061034360975481565b3480156108bb57600080fd5b506103016108ca3660046129c7565b60a56020526000908152604090205460ff1681565b3480156108eb57600080fd5b506103437fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b34801561091f57600080fd5b5061037161092e366004612a23565b6117ef565b34801561093f57600080fd5b5061037161094e3660046129e0565b611814565b34801561095f57600080fd5b5061037161096e366004612d95565b6118ee565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a0657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60a86000826008811115610a2257610a22612e2f565b6008811115610a3357610a33612e2f565b815260200190815260200160002054610a4b81611a4a565b610a54826117ca565b610a9557816040517f18659654000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b60405180910390fd5b816008811115610aa757610aa7612e2f565b60a68054600190921b199091169055816008811115610ac857610ac8612e2f565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba2610b4181611a4a565b610117805490839055604080518281526020810185905233917f6d8040017e56a6d91bb242def14af5d7eae1eaff7475e45c678dac5d49d35498910160405180910390a2505050565b600082815260656020526040902060010154610ba581611a4a565b610baf8383611a57565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a8c565b610c638282611b4b565b5050565b6001610c7281611c06565b7f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd67415610c9c81611a4a565b856000819003610cd8576040517f6446cc9c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6064811115610d16576040517f3b17443400000000000000000000000000000000000000000000000000000000815260048101829052602401610a8c565b6000849003610d51576040517f36a4bb9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101185480610d61600189612ed6565b14610dae57610d71600188612ed6565b6040517fd39e75f9000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610a8c565b6000818152610119602052604081205490805b84811015610e46578b8b82818110610ddb57610ddb612ee9565b905060200201359150600060ff1660b060008481526020019081526020016000205403610e3657600082815260b06020526040902060019055610e28838360009182526020526040902090565b9250610e3384612f18565b93505b610e3f81612f18565b9050610dc1565b50878314610e8a576040517fd39e75f90000000000000000000000000000000000000000000000000000000081526004810189905260248101849052604401610a8c565b818714610ecd576040517f7557a60a0000000000000000000000000000000000000000000000000000000081526004810188905260248101839052604401610a8c565b610118548314610f57576101188390556000838152610119602052604090819020839055517f9995fb3da0c2de4012f2b814b6fc29ce7507571dcb20b8d0bd38621a842df1eb90610f21908d908d90612f50565b60405180910390a1604051829084907f99b65a4301b38c09fb6a5f27052d73e8372bbe8f6779d678bfe8a41b66cce7ac90600090a35b5050505050505050505050565b610f6c611c48565b858784848760005a9050610f806002611cbb565b6000610f918f8f8f8f8c8f8f611d4d565b9050610f9c81611da8565b8e61011560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d604051611009929190612fa2565b60006040518083038185875af1925050503d8060008114611046576040519150601f19603f3d011682016040523d82523d6000602084013e61104b565b606091505b5091509150816110b5578051156110655780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610a8c919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b61011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd1517905560405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e90600090a25050861590506112535785600084900361119f57853b15801561119d573a5a61113a61ae3486612fb2565b6111449190612ed6565b61114e9190612fc5565b9150818811156111995773ffffffffffffffffffffffffffffffffffffffff87166108fc61117c848b612ed6565b6040518115909202916000818181858888f193505050505061119d565b8791505b505b600073ffffffffffffffffffffffffffffffffffffffff8416156111c357836111c5565b335b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505090508061124f576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610a8c565b5050505b505050505050611263600160b155565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261129781611a4a565b60008060004260995410156112be576097546112b39042612fb2565b6099555060016112d0565b609a548510156112d057849250600191505b609885905580806112de5750815b156112e957609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b600054610100900460ff16158080156113555750600054600160ff909116105b8061136f5750303b15801561136f575060005460ff166001145b6113fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a8c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561145957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611461611e0e565b611469611e0e565b611471611e0e565b61147b8a8a611ea7565b611483612017565b61148f858585856120b6565b61149a600089611a57565b6114a48787612380565b60016101165561011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd15179055655af3107a400061011755801561154757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61155d6003611cbb565b73ffffffffffffffffffffffffffffffffffffffff84166115aa576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b348311156115e4576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101175480841015611622576040517f732f941300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061162f8387612ed6565b915061163b8634612ed6565b6101168054919250600091908261165183612f18565b9091555090506116696116648484612fb2565b612555565b600061167a338a8686868c8c611d4d565b9050808973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8787878d8d6040516116e2959493929190612fdc565b60405180910390a4604051600090419087908381818185875af1925050503d806000811461172c576040519150601f19603f3d011682016040523d82523d6000602084013e611731565b606091505b5050905080611547576040517fa57c4df4000000000000000000000000000000000000000000000000000000008152416004820152602401610a8c565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf961179881611a4a565b6000609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b60008160088111156117de576117de612e2f565b60a654600190911b16151592915050565b60008281526065602052604090206001015461180a81611a4a565b610baf8383611b4b565b60a7600082600881111561182a5761182a612e2f565b600881111561183b5761183b612e2f565b81526020019081526020016000205461185381611a4a565b61185c826117ca565b1561189557816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b8160088111156118a7576118a7612e2f565b60a68054600190921b90911790558160088111156118c7576118c7612e2f565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d455933610aeb565b600054600690610100900460ff16158015611910575060005460ff8083169116105b61199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a8c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556119d78787612380565b6119e3858585856120b6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b611a5481336125cb565b50565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610c6357600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611aed3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610c6357600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b611c0f816117ca565b15611a5457806040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b600260b15403611cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a8c565b600260b155565b60a654816008811115611cd057611cd0612e2f565b6001901b811615611d0f57816040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b6002811615610c635760016040517fc0a71b58000000000000000000000000000000000000000000000000000000008152600401610a8c9190612e99565b600060405188815287602082015286604082015285606082015284608082015260c060a08201528260c08201526020830660008115611d8d578160200390505b848660e085013790930160e001902098975050505050505050565b600081815260b06020526040902054600114611df3576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610a8c565b600090815260b06020526040902060029055565b600160b155565b600054610100900460ff16611ea5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b565b600054610100900460ff16611f3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b81600003611f78576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611fb2576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055611fc68242612fb2565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b600054610100900460ff166120ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b611ea5612685565b600054610100900460ff1661214d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b8260005b818110156122615785858281811061216b5761216b612ee9565b9050604002016020013560a7600088888581811061218b5761218b612ee9565b6121a192602060409092020190810191506129e0565b60088111156121b2576121b2612e2f565b60088111156121c3576121c3612e2f565b81526020810191909152604001600020557f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec609186868381811061220757612207612ee9565b61221d92602060409092020190810191506129e0565b87878481811061222f5761222f612ee9565b9050604002016020013560405161224792919061303e565b60405180910390a18061225981612f18565b915050612151565b5081905060005b818110156123785783838281811061228257612282612ee9565b9050604002016020013560a860008686858181106122a2576122a2612ee9565b6122b892602060409092020190810191506129e0565b60088111156122c9576122c9612e2f565b60088111156122da576122da612e2f565b81526020810191909152604001600020557fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c284848381811061231e5761231e612ee9565b61233492602060409092020190810191506129e0565b85858481811061234657612346612ee9565b9050604002016020013560405161235e92919061303e565b60405180910390a18061237081612f18565b915050612268565b505050505050565b600054610100900460ff16612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b8060005b8181101561254f57600084848381811061243757612437612ee9565b61244d9260206040909202019081019150613059565b73ffffffffffffffffffffffffffffffffffffffff160361249a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106124ac576124ac612ee9565b905060400201602001356000801b036124f1576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61253d84848381811061250657612506612ee9565b9050604002016020013585858481811061252257612522612ee9565b6125389260206040909202019081019150613059565b611a57565b8061254781612f18565b91505061241b565b50505050565b8015611a545742609954101561257a576097546125729042612fb2565b60995561258a565b609a546125879082612fb2565b90505b6098548111156125c6576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610c635761260b8161271c565b61261683602061273b565b604051602001612627929190613076565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610a8c91600401612a77565b600054610100900460ff16611e07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a8c565b6060610a0673ffffffffffffffffffffffffffffffffffffffff831660145b6060600061274a836002612fc5565b612755906002612fb2565b67ffffffffffffffff81111561276d5761276d6130f7565b6040519080825280601f01601f191660200182016040528015612797576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106127ce576127ce612ee9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061283157612831612ee9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061286d846002612fc5565b612878906001612fb2565b90505b6001811115612915577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106128b9576128b9612ee9565b1a60f81b8282815181106128cf576128cf612ee9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361290e81613126565b905061287b565b50831561297e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a8c565b9392505050565b60006020828403121561299757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461297e57600080fd5b6000602082840312156129d957600080fd5b5035919050565b6000602082840312156129f257600080fd5b81356009811061297e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611a5457600080fd5b60008060408385031215612a3657600080fd5b823591506020830135612a4881612a01565b809150509250929050565b60005b83811015612a6e578181015183820152602001612a56565b50506000910152565b6020815260008251806020840152612a96816040850160208701612a53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080600080600060808688031215612ae057600080fd5b853567ffffffffffffffff80821115612af857600080fd5b818801915088601f830112612b0c57600080fd5b813581811115612b1b57600080fd5b8960208260051b8501011115612b3057600080fd5b60209283019a909950918801359760408101359750606001359550909350505050565b60008083601f840112612b6557600080fd5b50813567ffffffffffffffff811115612b7d57600080fd5b602083019150836020828501011115612b9557600080fd5b9250929050565b60008060008060008060008060e0898b031215612bb857600080fd5b8835612bc381612a01565b97506020890135612bd381612a01565b965060408901359550606089013594506080890135612bf181612a01565b935060a089013567ffffffffffffffff811115612c0d57600080fd5b612c198b828c01612b53565b999c989b50969995989497949560c00135949350505050565b60008083601f840112612c4457600080fd5b50813567ffffffffffffffff811115612c5c57600080fd5b6020830191508360208260061b8501011115612b9557600080fd5b600080600080600080600080600060c08a8c031215612c9557600080fd5b8935985060208a0135975060408a0135612cae81612a01565b965060608a013567ffffffffffffffff80821115612ccb57600080fd5b612cd78d838e01612c32565b909850965060808c0135915080821115612cf057600080fd5b612cfc8d838e01612c32565b909650945060a08c0135915080821115612d1557600080fd5b50612d228c828d01612c32565b915080935050809150509295985092959850929598565b60008060008060608587031215612d4f57600080fd5b8435612d5a81612a01565b935060208501359250604085013567ffffffffffffffff811115612d7d57600080fd5b612d8987828801612b53565b95989497509550505050565b60008060008060008060608789031215612dae57600080fd5b863567ffffffffffffffff80821115612dc657600080fd5b612dd28a838b01612c32565b90985096506020890135915080821115612deb57600080fd5b612df78a838b01612c32565b90965094506040890135915080821115612e1057600080fd5b50612e1d89828a01612c32565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60098110612e95577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610a068284612e5e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610a0657610a06612ea7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f4957612f49612ea7565b5060010190565b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612f8957600080fd5b8260051b80856040850137919091016040019392505050565b8183823760009101908152919050565b80820180821115610a0657610a06612ea7565b8082028115828204841417610a0657610a06612ea7565b85815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b6040810161304c8285612e5e565b8260208301529392505050565b60006020828403121561306b57600080fd5b813561297e81612a01565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516130ae816017850160208801612a53565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516130eb816028840160208801612a53565b01602801949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008161313557613135612ea7565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220470c39572685968d6ec85d8e7d7ed38ca849845528f9e12455980a8581d1854164736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/e2e/src/abi/LineaRollupAlphaV4.json b/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV5.json similarity index 99% rename from e2e/src/abi/LineaRollupAlphaV4.json rename to contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV5.json index 4358fbf7..538dfdbe 100644 --- a/e2e/src/abi/LineaRollupAlphaV4.json +++ b/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV5.json @@ -1,6 +1,7 @@ { - "contractName": "LineaRollup", - "sourceName": "contracts/LineaRollup.sol", + "_format": "hh-sol-artifact-1", + "contractName": "LineaRollupV5", + "sourceName": "contracts/test-contracts/LineaRollupV5.sol", "abi": [ { "inputs": [], @@ -1533,7 +1534,7 @@ "type": "bytes32" } ], - "internalType": "struct ILineaRollup.ShnarfData", + "internalType": "struct ILineaRollupV5.ShnarfData", "name": "shnarfData", "type": "tuple" }, @@ -1583,7 +1584,7 @@ "type": "bytes" } ], - "internalType": "struct ILineaRollup.FinalizationDataV2", + "internalType": "struct ILineaRollupV5.FinalizationDataV2", "name": "_finalizationData", "type": "tuple" } @@ -1640,7 +1641,7 @@ "type": "bytes32" } ], - "internalType": "struct ILineaRollup.ShnarfData", + "internalType": "struct ILineaRollupV5.ShnarfData", "name": "shnarfData", "type": "tuple" }, @@ -1690,7 +1691,7 @@ "type": "bytes" } ], - "internalType": "struct ILineaRollup.FinalizationDataV2", + "internalType": "struct ILineaRollupV5.FinalizationDataV2", "name": "_finalizationData", "type": "tuple" } @@ -2187,7 +2188,7 @@ "type": "bytes32" } ], - "internalType": "struct ILineaRollup.SupportingSubmissionDataV2", + "internalType": "struct ILineaRollupV5.SupportingSubmissionDataV2", "name": "submissionData", "type": "tuple" }, @@ -2207,7 +2208,7 @@ "type": "bytes" } ], - "internalType": "struct ILineaRollup.BlobSubmissionData[]", + "internalType": "struct ILineaRollupV5.BlobSubmissionData[]", "name": "_blobSubmissionData", "type": "tuple[]" }, @@ -2257,7 +2258,7 @@ "type": "bytes" } ], - "internalType": "struct ILineaRollup.SubmissionDataV2", + "internalType": "struct ILineaRollupV5.SubmissionDataV2", "name": "_submissionData", "type": "tuple" }, @@ -2355,8 +2356,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b614d0980620000ed5f395ff3fe6080604052600436106103b3575f3560e01c80637d1e8c55116101e9578063b837dbe911610108578063d05d9c3d1161009d578063e196fb5d1161006d578063e196fb5d14610b42578063e97a1e9e14610b61578063f5b541a614610bd3578063f93e985714610c06575f80fd5b8063d05d9c3d14610abb578063d547741f14610ada578063d5d4b83514610af9578063d84f91e814610b0f575f80fd5b8063c1dc0f07116100d8578063c1dc0f0714610a43578063c211697414610a58578063cc5782f614610a77578063cd9b9e9a14610aa5575f80fd5b8063b837dbe9146109b8578063bc61e733146109cd578063bf3e7505146109fb578063c0729ab114610a2e575f80fd5b80639f3ce55a1161017e578063ac1eff681161014e578063ac1eff6814610939578063ad422ff01461097b578063aea4f74514610990578063b4a5a4b7146109a4575f80fd5b80639f3ce55a146108e0578063a217fddf146108f3578063abd6230d14610906578063abffac321461091a575f80fd5b806391d14854116101b957806391d148541461085a578063921b278e146108ab578063986fcddd146107d05780639ee8b211146108c1575f80fd5b80637d1e8c55146107d05780638116d995146107e35780638be745d114610802578063914e57eb1461082e575f80fd5b80635355420e116102d557806363a283931161026a578063695378f51161023a578063695378f5146107875780636a637967146105835780636e6738431461079d57806373bd07b714610430575f80fd5b806363a28393146106e45780636463fb2a1461070357806366f96e981461072257806367e404ce1461074e575f80fd5b80635c721a0c116102a55780635c721a0c146106355780635ed73ceb146106605780636078bfd81461068c57806360e83cf3146106b8575f80fd5b80635355420e146105e2578063557eac731461060157806358794456146106205780635b7eb4bd14610583575f80fd5b80632c70645c1161034b57806342fbe8421161031b57806342fbe8421461056457806348922ab714610583578063491e0936146105975780634cdd389b146105b6575f80fd5b80632c70645c146104e55780632f2ff15d146104fb57806336568abe1461051a5780633fc08b6514610539575f80fd5b80631e2ff94f116103865780631e2ff94f146104565780631f443da01461046c578063248a9ca31461049857806328958174146104c6575f80fd5b806301ffc9a7146103b757806305861180146103eb5780631065a3991461040f57806311314d0f14610430575b5f80fd5b3480156103c2575f80fd5b506103d66103d136600461412d565b610c32565b60405190151581526020015b60405180910390f35b3480156103f6575f80fd5b506104016101bb5481565b6040519081526020016103e2565b34801561041a575f80fd5b5061042e61042936600461416c565b610cca565b005b34801561043b575f80fd5b50610444600281565b60405160ff90911681526020016103e2565b348015610461575f80fd5b506104016101185481565b348015610477575f80fd5b5061040161048636600461418c565b6101b96020525f908152604090205481565b3480156104a3575f80fd5b506104016104b236600461418c565b5f9081526065602052604090206001015490565b3480156104d1575f80fd5b5061042e6104e036600461418c565b610da2565b3480156104f0575f80fd5b506104016101835481565b348015610506575f80fd5b5061042e6105153660046141c4565b610e62565b348015610525575f80fd5b5061042e6105343660046141c4565b610e8b565b348015610544575f80fd5b5061040161055336600461418c565b60a56020525f908152604090205481565b34801561056f575f80fd5b5061042e61057e36600461423a565b610f3e565b34801561058e575f80fd5b50610444600181565b3480156105a2575f80fd5b5061042e6105b13660046142c5565b611209565b3480156105c1575f80fd5b506104016105d036600461418c565b6101b76020525f908152604090205481565b3480156105ed575f80fd5b5061042e6105fc366004614355565b611531565b34801561060c575f80fd5b5061042e61061b36600461418c565b611968565b34801561062b575f80fd5b5061040160995481565b348015610640575f80fd5b5061040161064f36600461418c565b60a66020525f908152604090205481565b34801561066b575f80fd5b5061040161067a36600461418c565b6101ba6020525f908152604090205481565b348015610697575f80fd5b506104016106a636600461418c565b6101b66020525f908152604090205481565b3480156106c3575f80fd5b506104016106d236600461418c565b6101506020525f908152604090205481565b3480156106ef575f80fd5b5061042e6106fe3660046143fa565b611a2e565b34801561070e575f80fd5b5061042e61071d366004614434565b611a57565b34801561072d575f80fd5b5061040161073c36600461418c565b6101b86020525f908152604090205481565b348015610759575f80fd5b50610762611f3f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e2565b348015610792575f80fd5b506104016101195481565b3480156107a8575f80fd5b506104017f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b3480156107db575f80fd5b506104445f81565b3480156107ee575f80fd5b5061042e6107fd36600461446c565b611f77565b34801561080d575f80fd5b5061040161081c36600461418c565b61011a6020525f908152604090205481565b348015610839575f80fd5b5061040161084836600461418c565b61014e6020525f908152604090205481565b348015610865575f80fd5b506103d66108743660046141c4565b5f91825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156108b6575f80fd5b506104016101bf5481565b3480156108cc575f80fd5b506103d66108db36600461418c565b61217c565b61042e6108ee3660046144d3565b61219f565b3480156108fe575f80fd5b506104015f81565b348015610911575f80fd5b50610444600381565b348015610925575f80fd5b5061042e61093436600461451f565b61230c565b348015610944575f80fd5b5061076261095336600461418c565b61011b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610986575f80fd5b5061040160985481565b34801561099b575f80fd5b5061042e61244b565b3480156109af575f80fd5b50610444600481565b3480156109c3575f80fd5b5061040160e45481565b3480156109d8575f80fd5b506103d66109e736600461416c565b60da54600160ff9092169190911b16151590565b348015610a06575f80fd5b506104017f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610a39575f80fd5b50610401609a5481565b348015610a4e575f80fd5b5061040160975481565b348015610a63575f80fd5b5061042e610a7236600461458d565b6124a6565b348015610a82575f80fd5b506103d6610a9136600461418c565b60d96020525f908152604090205460ff1681565b348015610ab0575f80fd5b506104016101bd5481565b348015610ac6575f80fd5b5061042e610ad53660046145b7565b6125d3565b348015610ae5575f80fd5b5061042e610af43660046141c4565b612808565b348015610b04575f80fd5b506104016101bc5481565b348015610b1a575f80fd5b506104017f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b348015610b4d575f80fd5b5061042e610b5c36600461416c565b61282c565b348015610b6c575f80fd5b50610401604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610bde575f80fd5b506104017f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c11575f80fd5b50610401610c2036600461418c565b6101be6020525f908152604090205481565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610cc457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26610cf4816128d7565b60da54600160ff84161b16610d3f576040517fb015579f00000000000000000000000000000000000000000000000000000000815260ff831660048201526024015b60405180910390fd5b60da8054600160ff851690811b199091169091557fef04ba2036ccaeab3a59717b51d2b9146b0b0904077177f1148a5418bf1eae23335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c610dcc816128d7565b5f82815261011b6020908152604080832054905173ffffffffffffffffffffffffffffffffffffffff90911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f82815260656020526040902060010154610e7c816128d7565b610e8683836128e1565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d36565b610f3a82826129d3565b5050565b6004610f4981612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610f73816128d7565b845f819003610fae576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f908190610ffa60408051610100810182525f6080820181815260a0830182905260c0830182905260e083018290528252602082015260609181018290528181019190915290565b5f8981526101be60205260408120548a915b87811015611106578d8d8281811061102657611026614605565b90506020028101906110389190614632565b6110419061476b565b81499650935085611081576040517fc0e41e1d00000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b835161108e908387612b12565b8351606001515f90815260208790526040902096506110be86885f1c866020015187604001518860600151612c79565b83516060808201519151602080880151604080519889529188019490945286810191909152908501899052608085019190915260a0909320845190930151915060010161100c565b50818a1461114a576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018b905260248101839052604401610d36565b5f8281526101be602052604090205415611193576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f8281526101be6020526040812082905581908e908e90816111b7576111b7614605565b90506020028101906111c99190614632565b6040516020909101359084907f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df9905f90a450505050505050505050505050565b611211612e51565b85878484875f5a90506112246003612a8c565b61125861125260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b8f612eee565b5f8e8e8e8e8b8e8e60405160200161127697969594939291906148aa565b60405160208183030381529060405280519060200120905061129781612ef5565b6112a96112a48d8f614902565b612f4f565b5f808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d6040516112d3929190614915565b5f6040518083038185875af1925050503d805f811461130d576040519150601f19603f3d011682016040523d82523d5f602084013e611312565b606091505b50915091508161137c5780511561132c5780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610d36919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6113b06113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5f612eee565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a250508615905061151957855f84900361146857853b158015611466573a5a61140461bc7c86614902565b61140e9190614850565b6114189190614924565b9150818811156114625773ffffffffffffffffffffffffffffffffffffffff87166108fc611446848b614850565b6040518115909202915f818181858888f1935050505050611466565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff84161561148b578361148d565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611515576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611527612fc4565b5050505050505050565b5f54610100900460ff161580801561154f57505f54600160ff909116105b806115685750303b15801561156857505f5460ff166001145b6115f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611650575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff881661169d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85811015611774575f8787838181106116ba576116ba614605565b90506020020160208101906116cf919061493b565b73ffffffffffffffffffffffffffffffffffffffff160361171c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61176c7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92988888481811061175257611752614605565b9050602002016020810190611767919061493b565b6128e1565b60010161169f565b5061177f5f886128e1565b6117a97f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c886128e1565b6117b587888686612ff2565b7f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a161790556101198990555f89815261011a602090815260408083208d905580518083018490528082018490527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830186905260a08084018790528451808503909101815260c08401855280519086012086526101be85528386208f905560e08301869052610100830186905261012083019190915261014082018590526101608083018690528351808403909101815261018083019384905280519401939093206101bd558382526101a08101939093526101c090920184905290206101bf55801561195c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82611992816128d7565b5f805f4260995410156119b7576097546119ac9042614902565b6099555060016119c9565b609a548510156119c957849250600191505b609885905580806119d75750815b156119e257609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b6001611a39816131a3565b5f611a43816128d7565b611a5183610119545f6131ea565b50505050565b611a5f612e51565b60a08101803590611a73906080840161493b565b611a81610120840184614956565b611a92610100860160e0870161493b565b5f5a9050611aa06003612a8c565b6101008701355f908152610150602052604081205490819003611aef576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af988806149b7565b90508114611b485780611b0c89806149b7565b6040517f5e3fd6ad0000000000000000000000000000000000000000000000000000000081526004810193909352602483015250604401610d36565b611b5588602001356134df565b611b6a6112a460c08a013560a08b0135614902565b5f611b7b60808a0160608b0161493b565b611b8b60a08b0160808c0161493b565b60a08b013560c08c013560208d0135611ba86101208f018f614956565b604051602001611bbe97969594939291906148aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050611c1f81611c048b806149b7565b611c1460608e0160408f01614a1b565b8d6101000135613557565b611c55576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c98611c8360017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b611c9360808c0160608d0161493b565b612eee565b5f80611caa60a08c0160808d0161493b565b73ffffffffffffffffffffffffffffffffffffffff1660c08c0135611cd36101208e018e614956565b604051611ce1929190614915565b5f6040518083038185875af1925050503d805f8114611d1b576040519150601f19603f3d011682016040523d82523d5f602084013e611d20565b606091505b509150915081611d9557805115611d3a5780518082602001fd5b611d4a60a08c0160808d0161493b565b6040517f5461344300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d36565b611dc36113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611f2e57855f849003611e7d57853b158015611e7b573a5a611e1961bc7c86614902565b611e239190614850565b611e2d9190614924565b915081881115611e775773ffffffffffffffffffffffffffffffffffffffff87166108fc611e5b848b614850565b6040518115909202915f818181858888f1935050505050611e7b565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff841615611ea05783611ea2565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611f2a576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611f3c612fc4565b50565b5f611f72611f6e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5c90565b905090565b5f54600590610100900460ff16158015611f9757505f5460ff8083169116105b612023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055838214612096576040517f2526f1080000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604401610d36565b5f5b848110156120f0578383828181106120b2576120b2614605565b905060200201356101be5f8888858181106120cf576120cf614605565b602090810292909201358352508101919091526040015f2055600101612098565b506101bb546101bc546101185460408051938452602084019290925290820152606090206101bf555f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610cc4565b60026121aa81612a8c565b73ffffffffffffffffffffffffffffffffffffffff85166121f7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612231576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261224183614a3e565b9091555090505f6122528634614850565b90505f33888884868a8a60405160200161227297969594939291906148aa565b60405160208183030381529060405280519060200120905061229483826135eb565b808873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516122fa959493929190614a75565b60405180910390a45050505050505050565b600461231781612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612341816128d7565b5f85900361237b576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a60205260409020548435146123c7576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd5460208501358114612415576040517f2f22b98a0000000000000000000000000000000000000000000000000000000081526004810182905260208601356024820152604401610d36565b5f612422868460016131ea565b90505f61243187848487613667565b905061195c81898c8c8b3560408d013560a08e01356136ef565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82612475816128d7565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c6124d0816128d7565b73ffffffffffffffffffffffffffffffffffffffff831661251d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b602090815260409182902054915173ffffffffffffffffffffffffffffffffffffffff928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60046125de81612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612608816128d7565b6126156080860186614956565b90505f0361264f576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051608080820183528735825260208089013590830152878301359282019290925260608088013590820152905f9061268c90880188614956565b60405161269a929190614915565b604051809103902090506126c4826101be5f8981526020019081526020015f205461011954612b12565b60608701355f90815260208290526040812090505f612727888a606001358b5f0135856127008e80608001906126fa9190614956565b896138a6565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b905080871461276c576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810188905260248101829052604401610d36565b5f8181526101be6020526040902054156127b5576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f8181526101be60209081526040808320818d01359081905590519092918c01359184917f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df99190a4505050505050505050565b5f82815260656020526040902060010154612822816128d7565b610e8683836129d3565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26612856816128d7565b60da54600160ff84161b161561289d576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b60da8054600160ff851690811b9091179091557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d33610d76565b611f3c81336139a7565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556129753390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60da54600160ff83161b811615612ad4576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b6002811615610f3a576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260016004820152602401610d36565b8251612b4a576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060830151612b85576040517f7dc2487d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001518260010114612bd75760208301516040517fabefa5e80000000000000000000000000000000000000000000000000000000081526001840160048201526024810191909152604401610d36565b80836020015111612c245760208301516040517fa386ed70000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610d36565b826040015183602001511115610e8657602083015160408085015190517fcbbd795300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a73ffffffffffffffffffffffffffffffffffffffff168787878787604051602001612cd1959493929190614ac7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612d0991614b10565b5f60405180830381855afa9150503d805f8114612d41576040519150601f19603f3d011682016040523d82523d5f602084013e612d46565b606091505b509150915081612d82576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040815114612dca578051604080517ff75db381000000000000000000000000000000000000000000000000000000008152610d369290600401918252602082015260400190565b6020810151604082015161100082141580612e0557507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b15612e46576040517f68dcad5f0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b505050505050505050565b5f612e80611f6e60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b14612eb7576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eec612ee560017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b6001612eee565b565b80825d5050565b5f81815260a66020526040902054600114612f3f576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f90815260a66020526040812055565b5f426099541015612f7157609754612f679042614902565b6099555080612f82565b81609a54612f7f9190614902565b90505b609854811115612fbe576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a5550565b612eec6113aa60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b5f54610100900460ff16613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b73ffffffffffffffffffffffffffffffffffffffff84166130d5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316613122576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312a613a60565b613132613a60565b61313a613a60565b6131448282613af6565b61316e7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82856128e1565b6131987f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26846128e1565b5050600160e4555050565b60da54600160ff83161b1615611f3c576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610d36565b5f8284604001351161323557604080517f7061440500000000000000000000000000000000000000000000000000000000815290850135600482015260248101849052604401610d36565b613249846101a00135856101600135613c63565b6101bf5460408051610180870135815261014087013560208201526101008701359181019190915260609020146132e157604080516101808601358152610140860135602082015261010086013591810191909152606090206101bf546040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b428461012001351061332c576040517fbf81c6e00000000000000000000000000000000000000000000000000000000081526101208501356004820152426024820152604401610d36565b60a0840135613367576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060868101358252608080880135602084015260a0808901359484019490945260c08801359183019190915260e087013590820152205f8181526101be6020526040908190205491925085013514613409575f8181526101be6020526040908190205481517ffb4cd6ef0000000000000000000000000000000000000000000000000000000081529186013560048301526024820152604401610d36565b61342561341a6101e08601866149b7565b866101c00135613d30565b61343c613436610200860186614956565b85613e36565b6040808501355f81815261011a6020529190912060a08601359055610119556101bd8190556134906101a0850135610160860135610120870135604080519384526020840192909252908201526060902090565b6101bf5560408051831515815260a08601359186359190870135907f1335f1a2b3ff25f07f5fef07dd35d8fb4312c3c73b138e2fad9347b3319ab53c9060200160405180910390a49392505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613535576040517f335a4a9000000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f85815b858110156135de57600163ffffffff8616821c811690036135a8576135a187878381811061358b5761358b614605565b90506020020135835f9182526020526040902090565b91506135d6565b6135d3828888848181106135be576135be614605565b905060200201355f9182526020526040902090565b91505b60010161355b565b5090911495945050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f60405184815283602082015260406101008701604083013782608082015260206040870160a083013760a0610140870160c083013761018081016102208701356020810261024089018337602002902061016082015261018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001900695945050505050565b6040805160018082528183019092525f916020808301908036833701905050905087815f8151811061372357613723614605565b6020908102919091018101919091525f88815261011b909152604090205473ffffffffffffffffffffffffffffffffffffffff168061378e576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7e4f7a8a0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff831690637e4f7a8a906137e6908b908b908890600401614b21565b6020604051808303815f875af1158015613802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138269190614b78565b90508061385f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518781526020810186905286917f5c885a794662ebe3b08ae0874fc2c88b5343b0223ba9cd2cad92b69c0d0c901f910160405180910390a250505050505050505050565b5f6138b2602084614b97565b156138e9576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561399e57602081039050808601357fff0000000000000000000000000000000000000000000000000000000000000081161561394f57604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061390c565b50509392505050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a576139e681613eca565b6139f1836020613ee9565b604051602001613a02929190614bcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610d3691600401614c4f565b5f54610100900460ff16612eec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b5f54610100900460ff16613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b815f03613bc5576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03613bfe576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055613c128242614902565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b815f03613ca5578015610f3a576040517f0c25659200000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b80613cdf576040517f5228f4c800000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f82815261014e60205260409020548114610f3a576040517f36459fa00000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b5f5b82811015611a51576101505f858584818110613d5057613d50614605565b9050602002013581526020019081526020015f20545f14613db957838382818110613d7d57613d7d614605565b905060200201356040517fe5d14425000000000000000000000000000000000000000000000000000000008152600401610d3691815260200190565b816101505f868685818110613dd057613dd0614605565b9050602002013581526020019081526020015f208190555081848483818110613dfb57613dfb614605565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a3600101613d32565b613e41600283614b97565b15613e7b576040517f0c91d77600000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f805b83811015613ec3576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a2600201613e7e565b5050505050565b6060610cc473ffffffffffffffffffffffffffffffffffffffff831660145b60605f613ef7836002614924565b613f02906002614902565b67ffffffffffffffff811115613f1a57613f1a61466e565b6040519080825280601f01601f191660200182016040528015613f44576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110613f7a57613f7a614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613fdc57613fdc614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f614016846002614924565b614021906001614902565b90505b60018111156140bd577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061406257614062614605565b1a60f81b82828151811061407857614078614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c936140b681614c9f565b9050614024565b508315614126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d36565b9392505050565b5f6020828403121561413d575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114614126575f80fd5b5f6020828403121561417c575f80fd5b813560ff81168114614126575f80fd5b5f6020828403121561419c575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611f3c575f80fd5b5f80604083850312156141d5575f80fd5b8235915060208301356141e7816141a3565b809150509250929050565b5f8083601f840112614202575f80fd5b50813567ffffffffffffffff811115614219575f80fd5b6020830191508360208260051b8501011115614233575f80fd5b9250929050565b5f805f806060858703121561424d575f80fd5b843567ffffffffffffffff811115614263575f80fd5b61426f878288016141f2565b90989097506020870135966040013595509350505050565b5f8083601f840112614297575f80fd5b50813567ffffffffffffffff8111156142ae575f80fd5b602083019150836020828501011115614233575f80fd5b5f805f805f805f8060e0898b0312156142dc575f80fd5b88356142e7816141a3565b975060208901356142f7816141a3565b965060408901359550606089013594506080890135614315816141a3565b935060a089013567ffffffffffffffff811115614330575f80fd5b61433c8b828c01614287565b999c989b50969995989497949560c00135949350505050565b5f805f805f805f805f6101008a8c03121561436e575f80fd5b8935985060208a0135975060408a0135614387816141a3565b965060608a0135614397816141a3565b955060808a013567ffffffffffffffff8111156143b2575f80fd5b6143be8c828d016141f2565b9a9d999c50979a9699979860a08801359760c0810135975060e0013595509350505050565b5f61022082840312156143f4575f80fd5b50919050565b5f6020828403121561440a575f80fd5b813567ffffffffffffffff811115614420575f80fd5b61442c848285016143e3565b949350505050565b5f60208284031215614444575f80fd5b813567ffffffffffffffff81111561445a575f80fd5b82016101408185031215614126575f80fd5b5f805f806040858703121561447f575f80fd5b843567ffffffffffffffff80821115614496575f80fd5b6144a2888389016141f2565b909650945060208701359150808211156144ba575f80fd5b506144c7878288016141f2565b95989497509550505050565b5f805f80606085870312156144e6575f80fd5b84356144f1816141a3565b935060208501359250604085013567ffffffffffffffff811115614513575f80fd5b6144c787828801614287565b5f805f8060608587031215614532575f80fd5b843567ffffffffffffffff80821115614549575f80fd5b61455588838901614287565b9096509450602087013593506040870135915080821115614574575f80fd5b50614581878288016143e3565b91505092959194509250565b5f806040838503121561459e575f80fd5b82356145a9816141a3565b946020939093013593505050565b5f805f606084860312156145c9575f80fd5b833567ffffffffffffffff8111156145df575f80fd5b840160a081870312156145f0575f80fd5b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21833603018112614664575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156146be576146be61466e565b60405290565b5f82601f8301126146d3575f80fd5b813567ffffffffffffffff808211156146ee576146ee61466e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156147345761473461466e565b8160405283815286602085880101111561474c575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f81360360e081121561477c575f80fd5b61478461469b565b6080821215614791575f80fd5b61479961469b565b9150833582526020840135602083015260408401356040830152606084013560608301528181526080840135602082015260a0840135915067ffffffffffffffff808311156147e6575f80fd5b6147f2368487016146c4565b604083015260c085013592508083111561480a575f80fd5b50614817368386016146c4565b60608201529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610cc457610cc4614823565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525086604083015285606083015284608083015260c060a08301526148f560c083018486614863565b9998505050505050505050565b80820180821115610cc457610cc4614823565b818382375f9101908152919050565b8082028115828204841417610cc457610cc4614823565b5f6020828403121561494b575f80fd5b8135614126816141a3565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614989575f80fd5b83018035915067ffffffffffffffff8211156149a3575f80fd5b602001915036819003821315614233575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126149ea575f80fd5b83018035915067ffffffffffffffff821115614a04575f80fd5b6020019150600581901b3603821315614233575f80fd5b5f60208284031215614a2b575f80fd5b813563ffffffff81168114614126575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6e57614a6e614823565b5060010190565b858152846020820152836040820152608060608201525f614a9a608083018486614863565b979650505050505050565b5f5b83811015614abf578181015183820152602001614aa7565b50505f910152565b8581528460208201528360408201525f8351614aea816060850160208801614aa5565b835190830190614b01816060840160208801614aa5565b01606001979650505050505050565b5f8251614664818460208701614aa5565b604081525f614b34604083018587614863565b8281036020848101919091528451808352858201928201905f5b81811015614b6a57845183529383019391830191600101614b4e565b509098975050505050505050565b5f60208284031215614b88575f80fd5b81518015158114614126575f80fd5b5f82614bca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351614c06816017850160208801614aa5565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614c43816028840160208801614aa5565b01602801949350505050565b602081525f8251806020840152614c6d816040850160208701614aa5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f81614cad57614cad614823565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e76e56676b2ceca04f884882f6f2cc812cb4d93334bb0fd187d9d040cd25b8fd64736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106103b3575f3560e01c80637d1e8c55116101e9578063b837dbe911610108578063d05d9c3d1161009d578063e196fb5d1161006d578063e196fb5d14610b42578063e97a1e9e14610b61578063f5b541a614610bd3578063f93e985714610c06575f80fd5b8063d05d9c3d14610abb578063d547741f14610ada578063d5d4b83514610af9578063d84f91e814610b0f575f80fd5b8063c1dc0f07116100d8578063c1dc0f0714610a43578063c211697414610a58578063cc5782f614610a77578063cd9b9e9a14610aa5575f80fd5b8063b837dbe9146109b8578063bc61e733146109cd578063bf3e7505146109fb578063c0729ab114610a2e575f80fd5b80639f3ce55a1161017e578063ac1eff681161014e578063ac1eff6814610939578063ad422ff01461097b578063aea4f74514610990578063b4a5a4b7146109a4575f80fd5b80639f3ce55a146108e0578063a217fddf146108f3578063abd6230d14610906578063abffac321461091a575f80fd5b806391d14854116101b957806391d148541461085a578063921b278e146108ab578063986fcddd146107d05780639ee8b211146108c1575f80fd5b80637d1e8c55146107d05780638116d995146107e35780638be745d114610802578063914e57eb1461082e575f80fd5b80635355420e116102d557806363a283931161026a578063695378f51161023a578063695378f5146107875780636a637967146105835780636e6738431461079d57806373bd07b714610430575f80fd5b806363a28393146106e45780636463fb2a1461070357806366f96e981461072257806367e404ce1461074e575f80fd5b80635c721a0c116102a55780635c721a0c146106355780635ed73ceb146106605780636078bfd81461068c57806360e83cf3146106b8575f80fd5b80635355420e146105e2578063557eac731461060157806358794456146106205780635b7eb4bd14610583575f80fd5b80632c70645c1161034b57806342fbe8421161031b57806342fbe8421461056457806348922ab714610583578063491e0936146105975780634cdd389b146105b6575f80fd5b80632c70645c146104e55780632f2ff15d146104fb57806336568abe1461051a5780633fc08b6514610539575f80fd5b80631e2ff94f116103865780631e2ff94f146104565780631f443da01461046c578063248a9ca31461049857806328958174146104c6575f80fd5b806301ffc9a7146103b757806305861180146103eb5780631065a3991461040f57806311314d0f14610430575b5f80fd5b3480156103c2575f80fd5b506103d66103d136600461412d565b610c32565b60405190151581526020015b60405180910390f35b3480156103f6575f80fd5b506104016101bb5481565b6040519081526020016103e2565b34801561041a575f80fd5b5061042e61042936600461416c565b610cca565b005b34801561043b575f80fd5b50610444600281565b60405160ff90911681526020016103e2565b348015610461575f80fd5b506104016101185481565b348015610477575f80fd5b5061040161048636600461418c565b6101b96020525f908152604090205481565b3480156104a3575f80fd5b506104016104b236600461418c565b5f9081526065602052604090206001015490565b3480156104d1575f80fd5b5061042e6104e036600461418c565b610da2565b3480156104f0575f80fd5b506104016101835481565b348015610506575f80fd5b5061042e6105153660046141c4565b610e62565b348015610525575f80fd5b5061042e6105343660046141c4565b610e8b565b348015610544575f80fd5b5061040161055336600461418c565b60a56020525f908152604090205481565b34801561056f575f80fd5b5061042e61057e36600461423a565b610f3e565b34801561058e575f80fd5b50610444600181565b3480156105a2575f80fd5b5061042e6105b13660046142c5565b611209565b3480156105c1575f80fd5b506104016105d036600461418c565b6101b76020525f908152604090205481565b3480156105ed575f80fd5b5061042e6105fc366004614355565b611531565b34801561060c575f80fd5b5061042e61061b36600461418c565b611968565b34801561062b575f80fd5b5061040160995481565b348015610640575f80fd5b5061040161064f36600461418c565b60a66020525f908152604090205481565b34801561066b575f80fd5b5061040161067a36600461418c565b6101ba6020525f908152604090205481565b348015610697575f80fd5b506104016106a636600461418c565b6101b66020525f908152604090205481565b3480156106c3575f80fd5b506104016106d236600461418c565b6101506020525f908152604090205481565b3480156106ef575f80fd5b5061042e6106fe3660046143fa565b611a2e565b34801561070e575f80fd5b5061042e61071d366004614434565b611a57565b34801561072d575f80fd5b5061040161073c36600461418c565b6101b86020525f908152604090205481565b348015610759575f80fd5b50610762611f3f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e2565b348015610792575f80fd5b506104016101195481565b3480156107a8575f80fd5b506104017f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b3480156107db575f80fd5b506104445f81565b3480156107ee575f80fd5b5061042e6107fd36600461446c565b611f77565b34801561080d575f80fd5b5061040161081c36600461418c565b61011a6020525f908152604090205481565b348015610839575f80fd5b5061040161084836600461418c565b61014e6020525f908152604090205481565b348015610865575f80fd5b506103d66108743660046141c4565b5f91825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156108b6575f80fd5b506104016101bf5481565b3480156108cc575f80fd5b506103d66108db36600461418c565b61217c565b61042e6108ee3660046144d3565b61219f565b3480156108fe575f80fd5b506104015f81565b348015610911575f80fd5b50610444600381565b348015610925575f80fd5b5061042e61093436600461451f565b61230c565b348015610944575f80fd5b5061076261095336600461418c565b61011b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610986575f80fd5b5061040160985481565b34801561099b575f80fd5b5061042e61244b565b3480156109af575f80fd5b50610444600481565b3480156109c3575f80fd5b5061040160e45481565b3480156109d8575f80fd5b506103d66109e736600461416c565b60da54600160ff9092169190911b16151590565b348015610a06575f80fd5b506104017f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610a39575f80fd5b50610401609a5481565b348015610a4e575f80fd5b5061040160975481565b348015610a63575f80fd5b5061042e610a7236600461458d565b6124a6565b348015610a82575f80fd5b506103d6610a9136600461418c565b60d96020525f908152604090205460ff1681565b348015610ab0575f80fd5b506104016101bd5481565b348015610ac6575f80fd5b5061042e610ad53660046145b7565b6125d3565b348015610ae5575f80fd5b5061042e610af43660046141c4565b612808565b348015610b04575f80fd5b506104016101bc5481565b348015610b1a575f80fd5b506104017f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b348015610b4d575f80fd5b5061042e610b5c36600461416c565b61282c565b348015610b6c575f80fd5b50610401604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610bde575f80fd5b506104017f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c11575f80fd5b50610401610c2036600461418c565b6101be6020525f908152604090205481565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610cc457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26610cf4816128d7565b60da54600160ff84161b16610d3f576040517fb015579f00000000000000000000000000000000000000000000000000000000815260ff831660048201526024015b60405180910390fd5b60da8054600160ff851690811b199091169091557fef04ba2036ccaeab3a59717b51d2b9146b0b0904077177f1148a5418bf1eae23335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c610dcc816128d7565b5f82815261011b6020908152604080832054905173ffffffffffffffffffffffffffffffffffffffff90911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f82815260656020526040902060010154610e7c816128d7565b610e8683836128e1565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d36565b610f3a82826129d3565b5050565b6004610f4981612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610f73816128d7565b845f819003610fae576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f908190610ffa60408051610100810182525f6080820181815260a0830182905260c0830182905260e083018290528252602082015260609181018290528181019190915290565b5f8981526101be60205260408120548a915b87811015611106578d8d8281811061102657611026614605565b90506020028101906110389190614632565b6110419061476b565b81499650935085611081576040517fc0e41e1d00000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b835161108e908387612b12565b8351606001515f90815260208790526040902096506110be86885f1c866020015187604001518860600151612c79565b83516060808201519151602080880151604080519889529188019490945286810191909152908501899052608085019190915260a0909320845190930151915060010161100c565b50818a1461114a576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018b905260248101839052604401610d36565b5f8281526101be602052604090205415611193576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f8281526101be6020526040812082905581908e908e90816111b7576111b7614605565b90506020028101906111c99190614632565b6040516020909101359084907f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df9905f90a450505050505050505050505050565b611211612e51565b85878484875f5a90506112246003612a8c565b61125861125260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b8f612eee565b5f8e8e8e8e8b8e8e60405160200161127697969594939291906148aa565b60405160208183030381529060405280519060200120905061129781612ef5565b6112a96112a48d8f614902565b612f4f565b5f808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d6040516112d3929190614915565b5f6040518083038185875af1925050503d805f811461130d576040519150601f19603f3d011682016040523d82523d5f602084013e611312565b606091505b50915091508161137c5780511561132c5780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610d36919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6113b06113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5f612eee565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a250508615905061151957855f84900361146857853b158015611466573a5a61140461bc7c86614902565b61140e9190614850565b6114189190614924565b9150818811156114625773ffffffffffffffffffffffffffffffffffffffff87166108fc611446848b614850565b6040518115909202915f818181858888f1935050505050611466565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff84161561148b578361148d565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611515576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611527612fc4565b5050505050505050565b5f54610100900460ff161580801561154f57505f54600160ff909116105b806115685750303b15801561156857505f5460ff166001145b6115f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611650575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff881661169d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85811015611774575f8787838181106116ba576116ba614605565b90506020020160208101906116cf919061493b565b73ffffffffffffffffffffffffffffffffffffffff160361171c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61176c7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92988888481811061175257611752614605565b9050602002016020810190611767919061493b565b6128e1565b60010161169f565b5061177f5f886128e1565b6117a97f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c886128e1565b6117b587888686612ff2565b7f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a161790556101198990555f89815261011a602090815260408083208d905580518083018490528082018490527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830186905260a08084018790528451808503909101815260c08401855280519086012086526101be85528386208f905560e08301869052610100830186905261012083019190915261014082018590526101608083018690528351808403909101815261018083019384905280519401939093206101bd558382526101a08101939093526101c090920184905290206101bf55801561195c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82611992816128d7565b5f805f4260995410156119b7576097546119ac9042614902565b6099555060016119c9565b609a548510156119c957849250600191505b609885905580806119d75750815b156119e257609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b6001611a39816131a3565b5f611a43816128d7565b611a5183610119545f6131ea565b50505050565b611a5f612e51565b60a08101803590611a73906080840161493b565b611a81610120840184614956565b611a92610100860160e0870161493b565b5f5a9050611aa06003612a8c565b6101008701355f908152610150602052604081205490819003611aef576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af988806149b7565b90508114611b485780611b0c89806149b7565b6040517f5e3fd6ad0000000000000000000000000000000000000000000000000000000081526004810193909352602483015250604401610d36565b611b5588602001356134df565b611b6a6112a460c08a013560a08b0135614902565b5f611b7b60808a0160608b0161493b565b611b8b60a08b0160808c0161493b565b60a08b013560c08c013560208d0135611ba86101208f018f614956565b604051602001611bbe97969594939291906148aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050611c1f81611c048b806149b7565b611c1460608e0160408f01614a1b565b8d6101000135613557565b611c55576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c98611c8360017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b611c9360808c0160608d0161493b565b612eee565b5f80611caa60a08c0160808d0161493b565b73ffffffffffffffffffffffffffffffffffffffff1660c08c0135611cd36101208e018e614956565b604051611ce1929190614915565b5f6040518083038185875af1925050503d805f8114611d1b576040519150601f19603f3d011682016040523d82523d5f602084013e611d20565b606091505b509150915081611d9557805115611d3a5780518082602001fd5b611d4a60a08c0160808d0161493b565b6040517f5461344300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d36565b611dc36113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611f2e57855f849003611e7d57853b158015611e7b573a5a611e1961bc7c86614902565b611e239190614850565b611e2d9190614924565b915081881115611e775773ffffffffffffffffffffffffffffffffffffffff87166108fc611e5b848b614850565b6040518115909202915f818181858888f1935050505050611e7b565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff841615611ea05783611ea2565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611f2a576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611f3c612fc4565b50565b5f611f72611f6e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5c90565b905090565b5f54600590610100900460ff16158015611f9757505f5460ff8083169116105b612023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055838214612096576040517f2526f1080000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604401610d36565b5f5b848110156120f0578383828181106120b2576120b2614605565b905060200201356101be5f8888858181106120cf576120cf614605565b602090810292909201358352508101919091526040015f2055600101612098565b506101bb546101bc546101185460408051938452602084019290925290820152606090206101bf555f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610cc4565b60026121aa81612a8c565b73ffffffffffffffffffffffffffffffffffffffff85166121f7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612231576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261224183614a3e565b9091555090505f6122528634614850565b90505f33888884868a8a60405160200161227297969594939291906148aa565b60405160208183030381529060405280519060200120905061229483826135eb565b808873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516122fa959493929190614a75565b60405180910390a45050505050505050565b600461231781612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612341816128d7565b5f85900361237b576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a60205260409020548435146123c7576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd5460208501358114612415576040517f2f22b98a0000000000000000000000000000000000000000000000000000000081526004810182905260208601356024820152604401610d36565b5f612422868460016131ea565b90505f61243187848487613667565b905061195c81898c8c8b3560408d013560a08e01356136ef565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82612475816128d7565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c6124d0816128d7565b73ffffffffffffffffffffffffffffffffffffffff831661251d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b602090815260409182902054915173ffffffffffffffffffffffffffffffffffffffff928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60046125de81612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612608816128d7565b6126156080860186614956565b90505f0361264f576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051608080820183528735825260208089013590830152878301359282019290925260608088013590820152905f9061268c90880188614956565b60405161269a929190614915565b604051809103902090506126c4826101be5f8981526020019081526020015f205461011954612b12565b60608701355f90815260208290526040812090505f612727888a606001358b5f0135856127008e80608001906126fa9190614956565b896138a6565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b905080871461276c576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810188905260248101829052604401610d36565b5f8181526101be6020526040902054156127b5576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f8181526101be60209081526040808320818d01359081905590519092918c01359184917f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df99190a4505050505050505050565b5f82815260656020526040902060010154612822816128d7565b610e8683836129d3565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26612856816128d7565b60da54600160ff84161b161561289d576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b60da8054600160ff851690811b9091179091557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d33610d76565b611f3c81336139a7565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556129753390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60da54600160ff83161b811615612ad4576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b6002811615610f3a576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260016004820152602401610d36565b8251612b4a576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060830151612b85576040517f7dc2487d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001518260010114612bd75760208301516040517fabefa5e80000000000000000000000000000000000000000000000000000000081526001840160048201526024810191909152604401610d36565b80836020015111612c245760208301516040517fa386ed70000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610d36565b826040015183602001511115610e8657602083015160408085015190517fcbbd795300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a73ffffffffffffffffffffffffffffffffffffffff168787878787604051602001612cd1959493929190614ac7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612d0991614b10565b5f60405180830381855afa9150503d805f8114612d41576040519150601f19603f3d011682016040523d82523d5f602084013e612d46565b606091505b509150915081612d82576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040815114612dca578051604080517ff75db381000000000000000000000000000000000000000000000000000000008152610d369290600401918252602082015260400190565b6020810151604082015161100082141580612e0557507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b15612e46576040517f68dcad5f0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b505050505050505050565b5f612e80611f6e60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b14612eb7576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eec612ee560017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b6001612eee565b565b80825d5050565b5f81815260a66020526040902054600114612f3f576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f90815260a66020526040812055565b5f426099541015612f7157609754612f679042614902565b6099555080612f82565b81609a54612f7f9190614902565b90505b609854811115612fbe576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a5550565b612eec6113aa60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b5f54610100900460ff16613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b73ffffffffffffffffffffffffffffffffffffffff84166130d5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316613122576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312a613a60565b613132613a60565b61313a613a60565b6131448282613af6565b61316e7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82856128e1565b6131987f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26846128e1565b5050600160e4555050565b60da54600160ff83161b1615611f3c576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610d36565b5f8284604001351161323557604080517f7061440500000000000000000000000000000000000000000000000000000000815290850135600482015260248101849052604401610d36565b613249846101a00135856101600135613c63565b6101bf5460408051610180870135815261014087013560208201526101008701359181019190915260609020146132e157604080516101808601358152610140860135602082015261010086013591810191909152606090206101bf546040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b428461012001351061332c576040517fbf81c6e00000000000000000000000000000000000000000000000000000000081526101208501356004820152426024820152604401610d36565b60a0840135613367576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060868101358252608080880135602084015260a0808901359484019490945260c08801359183019190915260e087013590820152205f8181526101be6020526040908190205491925085013514613409575f8181526101be6020526040908190205481517ffb4cd6ef0000000000000000000000000000000000000000000000000000000081529186013560048301526024820152604401610d36565b61342561341a6101e08601866149b7565b866101c00135613d30565b61343c613436610200860186614956565b85613e36565b6040808501355f81815261011a6020529190912060a08601359055610119556101bd8190556134906101a0850135610160860135610120870135604080519384526020840192909252908201526060902090565b6101bf5560408051831515815260a08601359186359190870135907f1335f1a2b3ff25f07f5fef07dd35d8fb4312c3c73b138e2fad9347b3319ab53c9060200160405180910390a49392505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613535576040517f335a4a9000000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f85815b858110156135de57600163ffffffff8616821c811690036135a8576135a187878381811061358b5761358b614605565b90506020020135835f9182526020526040902090565b91506135d6565b6135d3828888848181106135be576135be614605565b905060200201355f9182526020526040902090565b91505b60010161355b565b5090911495945050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f60405184815283602082015260406101008701604083013782608082015260206040870160a083013760a0610140870160c083013761018081016102208701356020810261024089018337602002902061016082015261018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001900695945050505050565b6040805160018082528183019092525f916020808301908036833701905050905087815f8151811061372357613723614605565b6020908102919091018101919091525f88815261011b909152604090205473ffffffffffffffffffffffffffffffffffffffff168061378e576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7e4f7a8a0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff831690637e4f7a8a906137e6908b908b908890600401614b21565b6020604051808303815f875af1158015613802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138269190614b78565b90508061385f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518781526020810186905286917f5c885a794662ebe3b08ae0874fc2c88b5343b0223ba9cd2cad92b69c0d0c901f910160405180910390a250505050505050505050565b5f6138b2602084614b97565b156138e9576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561399e57602081039050808601357fff0000000000000000000000000000000000000000000000000000000000000081161561394f57604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061390c565b50509392505050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a576139e681613eca565b6139f1836020613ee9565b604051602001613a02929190614bcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610d3691600401614c4f565b5f54610100900460ff16612eec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b5f54610100900460ff16613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b815f03613bc5576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03613bfe576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055613c128242614902565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b815f03613ca5578015610f3a576040517f0c25659200000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b80613cdf576040517f5228f4c800000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f82815261014e60205260409020548114610f3a576040517f36459fa00000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b5f5b82811015611a51576101505f858584818110613d5057613d50614605565b9050602002013581526020019081526020015f20545f14613db957838382818110613d7d57613d7d614605565b905060200201356040517fe5d14425000000000000000000000000000000000000000000000000000000008152600401610d3691815260200190565b816101505f868685818110613dd057613dd0614605565b9050602002013581526020019081526020015f208190555081848483818110613dfb57613dfb614605565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a3600101613d32565b613e41600283614b97565b15613e7b576040517f0c91d77600000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f805b83811015613ec3576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a2600201613e7e565b5050505050565b6060610cc473ffffffffffffffffffffffffffffffffffffffff831660145b60605f613ef7836002614924565b613f02906002614902565b67ffffffffffffffff811115613f1a57613f1a61466e565b6040519080825280601f01601f191660200182016040528015613f44576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110613f7a57613f7a614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613fdc57613fdc614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f614016846002614924565b614021906001614902565b90505b60018111156140bd577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061406257614062614605565b1a60f81b82828151811061407857614078614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c936140b681614c9f565b9050614024565b508315614126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d36565b9392505050565b5f6020828403121561413d575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114614126575f80fd5b5f6020828403121561417c575f80fd5b813560ff81168114614126575f80fd5b5f6020828403121561419c575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611f3c575f80fd5b5f80604083850312156141d5575f80fd5b8235915060208301356141e7816141a3565b809150509250929050565b5f8083601f840112614202575f80fd5b50813567ffffffffffffffff811115614219575f80fd5b6020830191508360208260051b8501011115614233575f80fd5b9250929050565b5f805f806060858703121561424d575f80fd5b843567ffffffffffffffff811115614263575f80fd5b61426f878288016141f2565b90989097506020870135966040013595509350505050565b5f8083601f840112614297575f80fd5b50813567ffffffffffffffff8111156142ae575f80fd5b602083019150836020828501011115614233575f80fd5b5f805f805f805f8060e0898b0312156142dc575f80fd5b88356142e7816141a3565b975060208901356142f7816141a3565b965060408901359550606089013594506080890135614315816141a3565b935060a089013567ffffffffffffffff811115614330575f80fd5b61433c8b828c01614287565b999c989b50969995989497949560c00135949350505050565b5f805f805f805f805f6101008a8c03121561436e575f80fd5b8935985060208a0135975060408a0135614387816141a3565b965060608a0135614397816141a3565b955060808a013567ffffffffffffffff8111156143b2575f80fd5b6143be8c828d016141f2565b9a9d999c50979a9699979860a08801359760c0810135975060e0013595509350505050565b5f61022082840312156143f4575f80fd5b50919050565b5f6020828403121561440a575f80fd5b813567ffffffffffffffff811115614420575f80fd5b61442c848285016143e3565b949350505050565b5f60208284031215614444575f80fd5b813567ffffffffffffffff81111561445a575f80fd5b82016101408185031215614126575f80fd5b5f805f806040858703121561447f575f80fd5b843567ffffffffffffffff80821115614496575f80fd5b6144a2888389016141f2565b909650945060208701359150808211156144ba575f80fd5b506144c7878288016141f2565b95989497509550505050565b5f805f80606085870312156144e6575f80fd5b84356144f1816141a3565b935060208501359250604085013567ffffffffffffffff811115614513575f80fd5b6144c787828801614287565b5f805f8060608587031215614532575f80fd5b843567ffffffffffffffff80821115614549575f80fd5b61455588838901614287565b9096509450602087013593506040870135915080821115614574575f80fd5b50614581878288016143e3565b91505092959194509250565b5f806040838503121561459e575f80fd5b82356145a9816141a3565b946020939093013593505050565b5f805f606084860312156145c9575f80fd5b833567ffffffffffffffff8111156145df575f80fd5b840160a081870312156145f0575f80fd5b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21833603018112614664575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156146be576146be61466e565b60405290565b5f82601f8301126146d3575f80fd5b813567ffffffffffffffff808211156146ee576146ee61466e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156147345761473461466e565b8160405283815286602085880101111561474c575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f81360360e081121561477c575f80fd5b61478461469b565b6080821215614791575f80fd5b61479961469b565b9150833582526020840135602083015260408401356040830152606084013560608301528181526080840135602082015260a0840135915067ffffffffffffffff808311156147e6575f80fd5b6147f2368487016146c4565b604083015260c085013592508083111561480a575f80fd5b50614817368386016146c4565b60608201529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610cc457610cc4614823565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525086604083015285606083015284608083015260c060a08301526148f560c083018486614863565b9998505050505050505050565b80820180821115610cc457610cc4614823565b818382375f9101908152919050565b8082028115828204841417610cc457610cc4614823565b5f6020828403121561494b575f80fd5b8135614126816141a3565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614989575f80fd5b83018035915067ffffffffffffffff8211156149a3575f80fd5b602001915036819003821315614233575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126149ea575f80fd5b83018035915067ffffffffffffffff821115614a04575f80fd5b6020019150600581901b3603821315614233575f80fd5b5f60208284031215614a2b575f80fd5b813563ffffffff81168114614126575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6e57614a6e614823565b5060010190565b858152846020820152836040820152608060608201525f614a9a608083018486614863565b979650505050505050565b5f5b83811015614abf578181015183820152602001614aa7565b50505f910152565b8581528460208201528360408201525f8351614aea816060850160208801614aa5565b835190830190614b01816060840160208801614aa5565b01606001979650505050505050565b5f8251614664818460208701614aa5565b604081525f614b34604083018587614863565b8281036020848101919091528451808352858201928201905f5b81811015614b6a57845183529383019391830191600101614b4e565b509098975050505050505050565b5f60208284031215614b88575f80fd5b81518015158114614126575f80fd5b5f82614bca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351614c06816017850160208801614aa5565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614c43816028840160208801614aa5565b01602801949350505050565b602081525f8251806020840152614c6d816040850160208701614aa5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f81614cad57614cad614823565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e76e56676b2ceca04f884882f6f2cc812cb4d93334bb0fd187d9d040cd25b8fd64736f6c63430008180033", + "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b614d0980620000ed5f395ff3fe6080604052600436106103b3575f3560e01c80637d1e8c55116101e9578063b837dbe911610108578063d05d9c3d1161009d578063e196fb5d1161006d578063e196fb5d14610b42578063e97a1e9e14610b61578063f5b541a614610bd3578063f93e985714610c06575f80fd5b8063d05d9c3d14610abb578063d547741f14610ada578063d5d4b83514610af9578063d84f91e814610b0f575f80fd5b8063c1dc0f07116100d8578063c1dc0f0714610a43578063c211697414610a58578063cc5782f614610a77578063cd9b9e9a14610aa5575f80fd5b8063b837dbe9146109b8578063bc61e733146109cd578063bf3e7505146109fb578063c0729ab114610a2e575f80fd5b80639f3ce55a1161017e578063ac1eff681161014e578063ac1eff6814610939578063ad422ff01461097b578063aea4f74514610990578063b4a5a4b7146109a4575f80fd5b80639f3ce55a146108e0578063a217fddf146108f3578063abd6230d14610906578063abffac321461091a575f80fd5b806391d14854116101b957806391d148541461085a578063921b278e146108ab578063986fcddd146107d05780639ee8b211146108c1575f80fd5b80637d1e8c55146107d05780638116d995146107e35780638be745d114610802578063914e57eb1461082e575f80fd5b80635355420e116102d557806363a283931161026a578063695378f51161023a578063695378f5146107875780636a637967146105835780636e6738431461079d57806373bd07b714610430575f80fd5b806363a28393146106e45780636463fb2a1461070357806366f96e981461072257806367e404ce1461074e575f80fd5b80635c721a0c116102a55780635c721a0c146106355780635ed73ceb146106605780636078bfd81461068c57806360e83cf3146106b8575f80fd5b80635355420e146105e2578063557eac731461060157806358794456146106205780635b7eb4bd14610583575f80fd5b80632c70645c1161034b57806342fbe8421161031b57806342fbe8421461056457806348922ab714610583578063491e0936146105975780634cdd389b146105b6575f80fd5b80632c70645c146104e55780632f2ff15d146104fb57806336568abe1461051a5780633fc08b6514610539575f80fd5b80631e2ff94f116103865780631e2ff94f146104565780631f443da01461046c578063248a9ca31461049857806328958174146104c6575f80fd5b806301ffc9a7146103b757806305861180146103eb5780631065a3991461040f57806311314d0f14610430575b5f80fd5b3480156103c2575f80fd5b506103d66103d136600461412d565b610c32565b60405190151581526020015b60405180910390f35b3480156103f6575f80fd5b506104016101bb5481565b6040519081526020016103e2565b34801561041a575f80fd5b5061042e61042936600461416c565b610cca565b005b34801561043b575f80fd5b50610444600281565b60405160ff90911681526020016103e2565b348015610461575f80fd5b506104016101185481565b348015610477575f80fd5b5061040161048636600461418c565b6101b96020525f908152604090205481565b3480156104a3575f80fd5b506104016104b236600461418c565b5f9081526065602052604090206001015490565b3480156104d1575f80fd5b5061042e6104e036600461418c565b610da2565b3480156104f0575f80fd5b506104016101835481565b348015610506575f80fd5b5061042e6105153660046141c4565b610e62565b348015610525575f80fd5b5061042e6105343660046141c4565b610e8b565b348015610544575f80fd5b5061040161055336600461418c565b60a56020525f908152604090205481565b34801561056f575f80fd5b5061042e61057e36600461423a565b610f3e565b34801561058e575f80fd5b50610444600181565b3480156105a2575f80fd5b5061042e6105b13660046142c5565b611209565b3480156105c1575f80fd5b506104016105d036600461418c565b6101b76020525f908152604090205481565b3480156105ed575f80fd5b5061042e6105fc366004614355565b611531565b34801561060c575f80fd5b5061042e61061b36600461418c565b611968565b34801561062b575f80fd5b5061040160995481565b348015610640575f80fd5b5061040161064f36600461418c565b60a66020525f908152604090205481565b34801561066b575f80fd5b5061040161067a36600461418c565b6101ba6020525f908152604090205481565b348015610697575f80fd5b506104016106a636600461418c565b6101b66020525f908152604090205481565b3480156106c3575f80fd5b506104016106d236600461418c565b6101506020525f908152604090205481565b3480156106ef575f80fd5b5061042e6106fe3660046143fa565b611a2e565b34801561070e575f80fd5b5061042e61071d366004614434565b611a57565b34801561072d575f80fd5b5061040161073c36600461418c565b6101b86020525f908152604090205481565b348015610759575f80fd5b50610762611f3f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e2565b348015610792575f80fd5b506104016101195481565b3480156107a8575f80fd5b506104017f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b3480156107db575f80fd5b506104445f81565b3480156107ee575f80fd5b5061042e6107fd36600461446c565b611f77565b34801561080d575f80fd5b5061040161081c36600461418c565b61011a6020525f908152604090205481565b348015610839575f80fd5b5061040161084836600461418c565b61014e6020525f908152604090205481565b348015610865575f80fd5b506103d66108743660046141c4565b5f91825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156108b6575f80fd5b506104016101bf5481565b3480156108cc575f80fd5b506103d66108db36600461418c565b61217c565b61042e6108ee3660046144d3565b61219f565b3480156108fe575f80fd5b506104015f81565b348015610911575f80fd5b50610444600381565b348015610925575f80fd5b5061042e61093436600461451f565b61230c565b348015610944575f80fd5b5061076261095336600461418c565b61011b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610986575f80fd5b5061040160985481565b34801561099b575f80fd5b5061042e61244b565b3480156109af575f80fd5b50610444600481565b3480156109c3575f80fd5b5061040160e45481565b3480156109d8575f80fd5b506103d66109e736600461416c565b60da54600160ff9092169190911b16151590565b348015610a06575f80fd5b506104017f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610a39575f80fd5b50610401609a5481565b348015610a4e575f80fd5b5061040160975481565b348015610a63575f80fd5b5061042e610a7236600461458d565b6124a6565b348015610a82575f80fd5b506103d6610a9136600461418c565b60d96020525f908152604090205460ff1681565b348015610ab0575f80fd5b506104016101bd5481565b348015610ac6575f80fd5b5061042e610ad53660046145b7565b6125d3565b348015610ae5575f80fd5b5061042e610af43660046141c4565b612808565b348015610b04575f80fd5b506104016101bc5481565b348015610b1a575f80fd5b506104017f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b348015610b4d575f80fd5b5061042e610b5c36600461416c565b61282c565b348015610b6c575f80fd5b50610401604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610bde575f80fd5b506104017f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c11575f80fd5b50610401610c2036600461418c565b6101be6020525f908152604090205481565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610cc457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26610cf4816128d7565b60da54600160ff84161b16610d3f576040517fb015579f00000000000000000000000000000000000000000000000000000000815260ff831660048201526024015b60405180910390fd5b60da8054600160ff851690811b199091169091557fef04ba2036ccaeab3a59717b51d2b9146b0b0904077177f1148a5418bf1eae23335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c610dcc816128d7565b5f82815261011b6020908152604080832054905173ffffffffffffffffffffffffffffffffffffffff90911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f82815260656020526040902060010154610e7c816128d7565b610e8683836128e1565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d36565b610f3a82826129d3565b5050565b6004610f4981612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610f73816128d7565b845f819003610fae576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f908190610ffa60408051610100810182525f6080820181815260a0830182905260c0830182905260e083018290528252602082015260609181018290528181019190915290565b5f8981526101be60205260408120548a915b87811015611106578d8d8281811061102657611026614605565b90506020028101906110389190614632565b6110419061476b565b81499650935085611081576040517fc0e41e1d00000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b835161108e908387612b12565b8351606001515f90815260208790526040902096506110be86885f1c866020015187604001518860600151612c79565b83516060808201519151602080880151604080519889529188019490945286810191909152908501899052608085019190915260a0909320845190930151915060010161100c565b50818a1461114a576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018b905260248101839052604401610d36565b5f8281526101be602052604090205415611193576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f8281526101be6020526040812082905581908e908e90816111b7576111b7614605565b90506020028101906111c99190614632565b6040516020909101359084907f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df9905f90a450505050505050505050505050565b611211612e51565b85878484875f5a90506112246003612a8c565b61125861125260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b8f612eee565b5f8e8e8e8e8b8e8e60405160200161127697969594939291906148aa565b60405160208183030381529060405280519060200120905061129781612ef5565b6112a96112a48d8f614902565b612f4f565b5f808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d6040516112d3929190614915565b5f6040518083038185875af1925050503d805f811461130d576040519150601f19603f3d011682016040523d82523d5f602084013e611312565b606091505b50915091508161137c5780511561132c5780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610d36919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6113b06113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5f612eee565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a250508615905061151957855f84900361146857853b158015611466573a5a61140461bc7c86614902565b61140e9190614850565b6114189190614924565b9150818811156114625773ffffffffffffffffffffffffffffffffffffffff87166108fc611446848b614850565b6040518115909202915f818181858888f1935050505050611466565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff84161561148b578361148d565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611515576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611527612fc4565b5050505050505050565b5f54610100900460ff161580801561154f57505f54600160ff909116105b806115685750303b15801561156857505f5460ff166001145b6115f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611650575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff881661169d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85811015611774575f8787838181106116ba576116ba614605565b90506020020160208101906116cf919061493b565b73ffffffffffffffffffffffffffffffffffffffff160361171c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61176c7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92988888481811061175257611752614605565b9050602002016020810190611767919061493b565b6128e1565b60010161169f565b5061177f5f886128e1565b6117a97f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c886128e1565b6117b587888686612ff2565b7f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a161790556101198990555f89815261011a602090815260408083208d905580518083018490528082018490527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830186905260a08084018790528451808503909101815260c08401855280519086012086526101be85528386208f905560e08301869052610100830186905261012083019190915261014082018590526101608083018690528351808403909101815261018083019384905280519401939093206101bd558382526101a08101939093526101c090920184905290206101bf55801561195c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82611992816128d7565b5f805f4260995410156119b7576097546119ac9042614902565b6099555060016119c9565b609a548510156119c957849250600191505b609885905580806119d75750815b156119e257609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b6001611a39816131a3565b5f611a43816128d7565b611a5183610119545f6131ea565b50505050565b611a5f612e51565b60a08101803590611a73906080840161493b565b611a81610120840184614956565b611a92610100860160e0870161493b565b5f5a9050611aa06003612a8c565b6101008701355f908152610150602052604081205490819003611aef576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af988806149b7565b90508114611b485780611b0c89806149b7565b6040517f5e3fd6ad0000000000000000000000000000000000000000000000000000000081526004810193909352602483015250604401610d36565b611b5588602001356134df565b611b6a6112a460c08a013560a08b0135614902565b5f611b7b60808a0160608b0161493b565b611b8b60a08b0160808c0161493b565b60a08b013560c08c013560208d0135611ba86101208f018f614956565b604051602001611bbe97969594939291906148aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050611c1f81611c048b806149b7565b611c1460608e0160408f01614a1b565b8d6101000135613557565b611c55576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c98611c8360017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b611c9360808c0160608d0161493b565b612eee565b5f80611caa60a08c0160808d0161493b565b73ffffffffffffffffffffffffffffffffffffffff1660c08c0135611cd36101208e018e614956565b604051611ce1929190614915565b5f6040518083038185875af1925050503d805f8114611d1b576040519150601f19603f3d011682016040523d82523d5f602084013e611d20565b606091505b509150915081611d9557805115611d3a5780518082602001fd5b611d4a60a08c0160808d0161493b565b6040517f5461344300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d36565b611dc36113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611f2e57855f849003611e7d57853b158015611e7b573a5a611e1961bc7c86614902565b611e239190614850565b611e2d9190614924565b915081881115611e775773ffffffffffffffffffffffffffffffffffffffff87166108fc611e5b848b614850565b6040518115909202915f818181858888f1935050505050611e7b565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff841615611ea05783611ea2565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611f2a576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611f3c612fc4565b50565b5f611f72611f6e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5c90565b905090565b5f54600590610100900460ff16158015611f9757505f5460ff8083169116105b612023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055838214612096576040517f2526f1080000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604401610d36565b5f5b848110156120f0578383828181106120b2576120b2614605565b905060200201356101be5f8888858181106120cf576120cf614605565b602090810292909201358352508101919091526040015f2055600101612098565b506101bb546101bc546101185460408051938452602084019290925290820152606090206101bf555f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610cc4565b60026121aa81612a8c565b73ffffffffffffffffffffffffffffffffffffffff85166121f7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612231576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261224183614a3e565b9091555090505f6122528634614850565b90505f33888884868a8a60405160200161227297969594939291906148aa565b60405160208183030381529060405280519060200120905061229483826135eb565b808873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516122fa959493929190614a75565b60405180910390a45050505050505050565b600461231781612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612341816128d7565b5f85900361237b576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a60205260409020548435146123c7576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd5460208501358114612415576040517f2f22b98a0000000000000000000000000000000000000000000000000000000081526004810182905260208601356024820152604401610d36565b5f612422868460016131ea565b90505f61243187848487613667565b905061195c81898c8c8b3560408d013560a08e01356136ef565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82612475816128d7565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c6124d0816128d7565b73ffffffffffffffffffffffffffffffffffffffff831661251d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b602090815260409182902054915173ffffffffffffffffffffffffffffffffffffffff928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60046125de81612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612608816128d7565b6126156080860186614956565b90505f0361264f576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051608080820183528735825260208089013590830152878301359282019290925260608088013590820152905f9061268c90880188614956565b60405161269a929190614915565b604051809103902090506126c4826101be5f8981526020019081526020015f205461011954612b12565b60608701355f90815260208290526040812090505f612727888a606001358b5f0135856127008e80608001906126fa9190614956565b896138a6565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b905080871461276c576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810188905260248101829052604401610d36565b5f8181526101be6020526040902054156127b5576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f8181526101be60209081526040808320818d01359081905590519092918c01359184917f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df99190a4505050505050505050565b5f82815260656020526040902060010154612822816128d7565b610e8683836129d3565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26612856816128d7565b60da54600160ff84161b161561289d576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b60da8054600160ff851690811b9091179091557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d33610d76565b611f3c81336139a7565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556129753390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60da54600160ff83161b811615612ad4576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b6002811615610f3a576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260016004820152602401610d36565b8251612b4a576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060830151612b85576040517f7dc2487d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001518260010114612bd75760208301516040517fabefa5e80000000000000000000000000000000000000000000000000000000081526001840160048201526024810191909152604401610d36565b80836020015111612c245760208301516040517fa386ed70000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610d36565b826040015183602001511115610e8657602083015160408085015190517fcbbd795300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a73ffffffffffffffffffffffffffffffffffffffff168787878787604051602001612cd1959493929190614ac7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612d0991614b10565b5f60405180830381855afa9150503d805f8114612d41576040519150601f19603f3d011682016040523d82523d5f602084013e612d46565b606091505b509150915081612d82576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040815114612dca578051604080517ff75db381000000000000000000000000000000000000000000000000000000008152610d369290600401918252602082015260400190565b6020810151604082015161100082141580612e0557507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b15612e46576040517f68dcad5f0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b505050505050505050565b5f612e80611f6e60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b14612eb7576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eec612ee560017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b6001612eee565b565b80825d5050565b5f81815260a66020526040902054600114612f3f576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f90815260a66020526040812055565b5f426099541015612f7157609754612f679042614902565b6099555080612f82565b81609a54612f7f9190614902565b90505b609854811115612fbe576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a5550565b612eec6113aa60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b5f54610100900460ff16613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b73ffffffffffffffffffffffffffffffffffffffff84166130d5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316613122576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312a613a60565b613132613a60565b61313a613a60565b6131448282613af6565b61316e7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82856128e1565b6131987f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26846128e1565b5050600160e4555050565b60da54600160ff83161b1615611f3c576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610d36565b5f8284604001351161323557604080517f7061440500000000000000000000000000000000000000000000000000000000815290850135600482015260248101849052604401610d36565b613249846101a00135856101600135613c63565b6101bf5460408051610180870135815261014087013560208201526101008701359181019190915260609020146132e157604080516101808601358152610140860135602082015261010086013591810191909152606090206101bf546040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b428461012001351061332c576040517fbf81c6e00000000000000000000000000000000000000000000000000000000081526101208501356004820152426024820152604401610d36565b60a0840135613367576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060868101358252608080880135602084015260a0808901359484019490945260c08801359183019190915260e087013590820152205f8181526101be6020526040908190205491925085013514613409575f8181526101be6020526040908190205481517ffb4cd6ef0000000000000000000000000000000000000000000000000000000081529186013560048301526024820152604401610d36565b61342561341a6101e08601866149b7565b866101c00135613d30565b61343c613436610200860186614956565b85613e36565b6040808501355f81815261011a6020529190912060a08601359055610119556101bd8190556134906101a0850135610160860135610120870135604080519384526020840192909252908201526060902090565b6101bf5560408051831515815260a08601359186359190870135907f1335f1a2b3ff25f07f5fef07dd35d8fb4312c3c73b138e2fad9347b3319ab53c9060200160405180910390a49392505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613535576040517f335a4a9000000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f85815b858110156135de57600163ffffffff8616821c811690036135a8576135a187878381811061358b5761358b614605565b90506020020135835f9182526020526040902090565b91506135d6565b6135d3828888848181106135be576135be614605565b905060200201355f9182526020526040902090565b91505b60010161355b565b5090911495945050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f60405184815283602082015260406101008701604083013782608082015260206040870160a083013760a0610140870160c083013761018081016102208701356020810261024089018337602002902061016082015261018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001900695945050505050565b6040805160018082528183019092525f916020808301908036833701905050905087815f8151811061372357613723614605565b6020908102919091018101919091525f88815261011b909152604090205473ffffffffffffffffffffffffffffffffffffffff168061378e576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7e4f7a8a0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff831690637e4f7a8a906137e6908b908b908890600401614b21565b6020604051808303815f875af1158015613802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138269190614b78565b90508061385f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518781526020810186905286917f5c885a794662ebe3b08ae0874fc2c88b5343b0223ba9cd2cad92b69c0d0c901f910160405180910390a250505050505050505050565b5f6138b2602084614b97565b156138e9576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561399e57602081039050808601357fff0000000000000000000000000000000000000000000000000000000000000081161561394f57604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061390c565b50509392505050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a576139e681613eca565b6139f1836020613ee9565b604051602001613a02929190614bcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610d3691600401614c4f565b5f54610100900460ff16612eec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b5f54610100900460ff16613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b815f03613bc5576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03613bfe576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055613c128242614902565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b815f03613ca5578015610f3a576040517f0c25659200000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b80613cdf576040517f5228f4c800000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f82815261014e60205260409020548114610f3a576040517f36459fa00000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b5f5b82811015611a51576101505f858584818110613d5057613d50614605565b9050602002013581526020019081526020015f20545f14613db957838382818110613d7d57613d7d614605565b905060200201356040517fe5d14425000000000000000000000000000000000000000000000000000000008152600401610d3691815260200190565b816101505f868685818110613dd057613dd0614605565b9050602002013581526020019081526020015f208190555081848483818110613dfb57613dfb614605565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a3600101613d32565b613e41600283614b97565b15613e7b576040517f0c91d77600000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f805b83811015613ec3576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a2600201613e7e565b5050505050565b6060610cc473ffffffffffffffffffffffffffffffffffffffff831660145b60605f613ef7836002614924565b613f02906002614902565b67ffffffffffffffff811115613f1a57613f1a61466e565b6040519080825280601f01601f191660200182016040528015613f44576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110613f7a57613f7a614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613fdc57613fdc614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f614016846002614924565b614021906001614902565b90505b60018111156140bd577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061406257614062614605565b1a60f81b82828151811061407857614078614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c936140b681614c9f565b9050614024565b508315614126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d36565b9392505050565b5f6020828403121561413d575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114614126575f80fd5b5f6020828403121561417c575f80fd5b813560ff81168114614126575f80fd5b5f6020828403121561419c575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611f3c575f80fd5b5f80604083850312156141d5575f80fd5b8235915060208301356141e7816141a3565b809150509250929050565b5f8083601f840112614202575f80fd5b50813567ffffffffffffffff811115614219575f80fd5b6020830191508360208260051b8501011115614233575f80fd5b9250929050565b5f805f806060858703121561424d575f80fd5b843567ffffffffffffffff811115614263575f80fd5b61426f878288016141f2565b90989097506020870135966040013595509350505050565b5f8083601f840112614297575f80fd5b50813567ffffffffffffffff8111156142ae575f80fd5b602083019150836020828501011115614233575f80fd5b5f805f805f805f8060e0898b0312156142dc575f80fd5b88356142e7816141a3565b975060208901356142f7816141a3565b965060408901359550606089013594506080890135614315816141a3565b935060a089013567ffffffffffffffff811115614330575f80fd5b61433c8b828c01614287565b999c989b50969995989497949560c00135949350505050565b5f805f805f805f805f6101008a8c03121561436e575f80fd5b8935985060208a0135975060408a0135614387816141a3565b965060608a0135614397816141a3565b955060808a013567ffffffffffffffff8111156143b2575f80fd5b6143be8c828d016141f2565b9a9d999c50979a9699979860a08801359760c0810135975060e0013595509350505050565b5f61022082840312156143f4575f80fd5b50919050565b5f6020828403121561440a575f80fd5b813567ffffffffffffffff811115614420575f80fd5b61442c848285016143e3565b949350505050565b5f60208284031215614444575f80fd5b813567ffffffffffffffff81111561445a575f80fd5b82016101408185031215614126575f80fd5b5f805f806040858703121561447f575f80fd5b843567ffffffffffffffff80821115614496575f80fd5b6144a2888389016141f2565b909650945060208701359150808211156144ba575f80fd5b506144c7878288016141f2565b95989497509550505050565b5f805f80606085870312156144e6575f80fd5b84356144f1816141a3565b935060208501359250604085013567ffffffffffffffff811115614513575f80fd5b6144c787828801614287565b5f805f8060608587031215614532575f80fd5b843567ffffffffffffffff80821115614549575f80fd5b61455588838901614287565b9096509450602087013593506040870135915080821115614574575f80fd5b50614581878288016143e3565b91505092959194509250565b5f806040838503121561459e575f80fd5b82356145a9816141a3565b946020939093013593505050565b5f805f606084860312156145c9575f80fd5b833567ffffffffffffffff8111156145df575f80fd5b840160a081870312156145f0575f80fd5b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21833603018112614664575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156146be576146be61466e565b60405290565b5f82601f8301126146d3575f80fd5b813567ffffffffffffffff808211156146ee576146ee61466e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156147345761473461466e565b8160405283815286602085880101111561474c575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f81360360e081121561477c575f80fd5b61478461469b565b6080821215614791575f80fd5b61479961469b565b9150833582526020840135602083015260408401356040830152606084013560608301528181526080840135602082015260a0840135915067ffffffffffffffff808311156147e6575f80fd5b6147f2368487016146c4565b604083015260c085013592508083111561480a575f80fd5b50614817368386016146c4565b60608201529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610cc457610cc4614823565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525086604083015285606083015284608083015260c060a08301526148f560c083018486614863565b9998505050505050505050565b80820180821115610cc457610cc4614823565b818382375f9101908152919050565b8082028115828204841417610cc457610cc4614823565b5f6020828403121561494b575f80fd5b8135614126816141a3565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614989575f80fd5b83018035915067ffffffffffffffff8211156149a3575f80fd5b602001915036819003821315614233575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126149ea575f80fd5b83018035915067ffffffffffffffff821115614a04575f80fd5b6020019150600581901b3603821315614233575f80fd5b5f60208284031215614a2b575f80fd5b813563ffffffff81168114614126575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6e57614a6e614823565b5060010190565b858152846020820152836040820152608060608201525f614a9a608083018486614863565b979650505050505050565b5f5b83811015614abf578181015183820152602001614aa7565b50505f910152565b8581528460208201528360408201525f8351614aea816060850160208801614aa5565b835190830190614b01816060840160208801614aa5565b01606001979650505050505050565b5f8251614664818460208701614aa5565b604081525f614b34604083018587614863565b8281036020848101919091528451808352858201928201905f5b81811015614b6a57845183529383019391830191600101614b4e565b509098975050505050505050565b5f60208284031215614b88575f80fd5b81518015158114614126575f80fd5b5f82614bca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351614c06816017850160208801614aa5565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614c43816028840160208801614aa5565b01602801949350505050565b602081525f8251806020840152614c6d816040850160208701614aa5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f81614cad57614cad614823565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e76faa7ccb401aa8ec924d7d6bf63bcf46c2847cf7bb3f1ec1063972b83db33564736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106103b3575f3560e01c80637d1e8c55116101e9578063b837dbe911610108578063d05d9c3d1161009d578063e196fb5d1161006d578063e196fb5d14610b42578063e97a1e9e14610b61578063f5b541a614610bd3578063f93e985714610c06575f80fd5b8063d05d9c3d14610abb578063d547741f14610ada578063d5d4b83514610af9578063d84f91e814610b0f575f80fd5b8063c1dc0f07116100d8578063c1dc0f0714610a43578063c211697414610a58578063cc5782f614610a77578063cd9b9e9a14610aa5575f80fd5b8063b837dbe9146109b8578063bc61e733146109cd578063bf3e7505146109fb578063c0729ab114610a2e575f80fd5b80639f3ce55a1161017e578063ac1eff681161014e578063ac1eff6814610939578063ad422ff01461097b578063aea4f74514610990578063b4a5a4b7146109a4575f80fd5b80639f3ce55a146108e0578063a217fddf146108f3578063abd6230d14610906578063abffac321461091a575f80fd5b806391d14854116101b957806391d148541461085a578063921b278e146108ab578063986fcddd146107d05780639ee8b211146108c1575f80fd5b80637d1e8c55146107d05780638116d995146107e35780638be745d114610802578063914e57eb1461082e575f80fd5b80635355420e116102d557806363a283931161026a578063695378f51161023a578063695378f5146107875780636a637967146105835780636e6738431461079d57806373bd07b714610430575f80fd5b806363a28393146106e45780636463fb2a1461070357806366f96e981461072257806367e404ce1461074e575f80fd5b80635c721a0c116102a55780635c721a0c146106355780635ed73ceb146106605780636078bfd81461068c57806360e83cf3146106b8575f80fd5b80635355420e146105e2578063557eac731461060157806358794456146106205780635b7eb4bd14610583575f80fd5b80632c70645c1161034b57806342fbe8421161031b57806342fbe8421461056457806348922ab714610583578063491e0936146105975780634cdd389b146105b6575f80fd5b80632c70645c146104e55780632f2ff15d146104fb57806336568abe1461051a5780633fc08b6514610539575f80fd5b80631e2ff94f116103865780631e2ff94f146104565780631f443da01461046c578063248a9ca31461049857806328958174146104c6575f80fd5b806301ffc9a7146103b757806305861180146103eb5780631065a3991461040f57806311314d0f14610430575b5f80fd5b3480156103c2575f80fd5b506103d66103d136600461412d565b610c32565b60405190151581526020015b60405180910390f35b3480156103f6575f80fd5b506104016101bb5481565b6040519081526020016103e2565b34801561041a575f80fd5b5061042e61042936600461416c565b610cca565b005b34801561043b575f80fd5b50610444600281565b60405160ff90911681526020016103e2565b348015610461575f80fd5b506104016101185481565b348015610477575f80fd5b5061040161048636600461418c565b6101b96020525f908152604090205481565b3480156104a3575f80fd5b506104016104b236600461418c565b5f9081526065602052604090206001015490565b3480156104d1575f80fd5b5061042e6104e036600461418c565b610da2565b3480156104f0575f80fd5b506104016101835481565b348015610506575f80fd5b5061042e6105153660046141c4565b610e62565b348015610525575f80fd5b5061042e6105343660046141c4565b610e8b565b348015610544575f80fd5b5061040161055336600461418c565b60a56020525f908152604090205481565b34801561056f575f80fd5b5061042e61057e36600461423a565b610f3e565b34801561058e575f80fd5b50610444600181565b3480156105a2575f80fd5b5061042e6105b13660046142c5565b611209565b3480156105c1575f80fd5b506104016105d036600461418c565b6101b76020525f908152604090205481565b3480156105ed575f80fd5b5061042e6105fc366004614355565b611531565b34801561060c575f80fd5b5061042e61061b36600461418c565b611968565b34801561062b575f80fd5b5061040160995481565b348015610640575f80fd5b5061040161064f36600461418c565b60a66020525f908152604090205481565b34801561066b575f80fd5b5061040161067a36600461418c565b6101ba6020525f908152604090205481565b348015610697575f80fd5b506104016106a636600461418c565b6101b66020525f908152604090205481565b3480156106c3575f80fd5b506104016106d236600461418c565b6101506020525f908152604090205481565b3480156106ef575f80fd5b5061042e6106fe3660046143fa565b611a2e565b34801561070e575f80fd5b5061042e61071d366004614434565b611a57565b34801561072d575f80fd5b5061040161073c36600461418c565b6101b86020525f908152604090205481565b348015610759575f80fd5b50610762611f3f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e2565b348015610792575f80fd5b506104016101195481565b3480156107a8575f80fd5b506104017f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b3480156107db575f80fd5b506104445f81565b3480156107ee575f80fd5b5061042e6107fd36600461446c565b611f77565b34801561080d575f80fd5b5061040161081c36600461418c565b61011a6020525f908152604090205481565b348015610839575f80fd5b5061040161084836600461418c565b61014e6020525f908152604090205481565b348015610865575f80fd5b506103d66108743660046141c4565b5f91825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156108b6575f80fd5b506104016101bf5481565b3480156108cc575f80fd5b506103d66108db36600461418c565b61217c565b61042e6108ee3660046144d3565b61219f565b3480156108fe575f80fd5b506104015f81565b348015610911575f80fd5b50610444600381565b348015610925575f80fd5b5061042e61093436600461451f565b61230c565b348015610944575f80fd5b5061076261095336600461418c565b61011b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610986575f80fd5b5061040160985481565b34801561099b575f80fd5b5061042e61244b565b3480156109af575f80fd5b50610444600481565b3480156109c3575f80fd5b5061040160e45481565b3480156109d8575f80fd5b506103d66109e736600461416c565b60da54600160ff9092169190911b16151590565b348015610a06575f80fd5b506104017f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610a39575f80fd5b50610401609a5481565b348015610a4e575f80fd5b5061040160975481565b348015610a63575f80fd5b5061042e610a7236600461458d565b6124a6565b348015610a82575f80fd5b506103d6610a9136600461418c565b60d96020525f908152604090205460ff1681565b348015610ab0575f80fd5b506104016101bd5481565b348015610ac6575f80fd5b5061042e610ad53660046145b7565b6125d3565b348015610ae5575f80fd5b5061042e610af43660046141c4565b612808565b348015610b04575f80fd5b506104016101bc5481565b348015610b1a575f80fd5b506104017f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b348015610b4d575f80fd5b5061042e610b5c36600461416c565b61282c565b348015610b6c575f80fd5b50610401604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610bde575f80fd5b506104017f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b348015610c11575f80fd5b50610401610c2036600461418c565b6101be6020525f908152604090205481565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610cc457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26610cf4816128d7565b60da54600160ff84161b16610d3f576040517fb015579f00000000000000000000000000000000000000000000000000000000815260ff831660048201526024015b60405180910390fd5b60da8054600160ff851690811b199091169091557fef04ba2036ccaeab3a59717b51d2b9146b0b0904077177f1148a5418bf1eae23335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c610dcc816128d7565b5f82815261011b6020908152604080832054905173ffffffffffffffffffffffffffffffffffffffff90911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f82815260656020526040902060010154610e7c816128d7565b610e8683836128e1565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d36565b610f3a82826129d3565b5050565b6004610f4981612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610f73816128d7565b845f819003610fae576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f908190610ffa60408051610100810182525f6080820181815260a0830182905260c0830182905260e083018290528252602082015260609181018290528181019190915290565b5f8981526101be60205260408120548a915b87811015611106578d8d8281811061102657611026614605565b90506020028101906110389190614632565b6110419061476b565b81499650935085611081576040517fc0e41e1d00000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b835161108e908387612b12565b8351606001515f90815260208790526040902096506110be86885f1c866020015187604001518860600151612c79565b83516060808201519151602080880151604080519889529188019490945286810191909152908501899052608085019190915260a0909320845190930151915060010161100c565b50818a1461114a576040517fd3664fb3000000000000000000000000000000000000000000000000000000008152600481018b905260248101839052604401610d36565b5f8281526101be602052604090205415611193576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f8281526101be6020526040812082905581908e908e90816111b7576111b7614605565b90506020028101906111c99190614632565b6040516020909101359084907f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df9905f90a450505050505050505050505050565b611211612e51565b85878484875f5a90506112246003612a8c565b61125861125260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b8f612eee565b5f8e8e8e8e8b8e8e60405160200161127697969594939291906148aa565b60405160208183030381529060405280519060200120905061129781612ef5565b6112a96112a48d8f614902565b612f4f565b5f808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d6040516112d3929190614915565b5f6040518083038185875af1925050503d805f811461130d576040519150601f19603f3d011682016040523d82523d5f602084013e611312565b606091505b50915091508161137c5780511561132c5780518082602001fd5b8f6040517f54613443000000000000000000000000000000000000000000000000000000008152600401610d36919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6113b06113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5f612eee565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a250508615905061151957855f84900361146857853b158015611466573a5a61140461bc7c86614902565b61140e9190614850565b6114189190614924565b9150818811156114625773ffffffffffffffffffffffffffffffffffffffff87166108fc611446848b614850565b6040518115909202915f818181858888f1935050505050611466565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff84161561148b578361148d565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611515576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611527612fc4565b5050505050505050565b5f54610100900460ff161580801561154f57505f54600160ff909116105b806115685750303b15801561156857505f5460ff166001145b6115f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611650575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff881661169d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85811015611774575f8787838181106116ba576116ba614605565b90506020020160208101906116cf919061493b565b73ffffffffffffffffffffffffffffffffffffffff160361171c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61176c7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92988888481811061175257611752614605565b9050602002016020810190611767919061493b565b6128e1565b60010161169f565b5061177f5f886128e1565b6117a97f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c886128e1565b6117b587888686612ff2565b7f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a161790556101198990555f89815261011a602090815260408083208d905580518083018490528082018490527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830186905260a08084018790528451808503909101815260c08401855280519086012086526101be85528386208f905560e08301869052610100830186905261012083019190915261014082018590526101608083018690528351808403909101815261018083019384905280519401939093206101bd558382526101a08101939093526101c090920184905290206101bf55801561195c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82611992816128d7565b5f805f4260995410156119b7576097546119ac9042614902565b6099555060016119c9565b609a548510156119c957849250600191505b609885905580806119d75750815b156119e257609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b6001611a39816131a3565b5f611a43816128d7565b611a5183610119545f6131ea565b50505050565b611a5f612e51565b60a08101803590611a73906080840161493b565b611a81610120840184614956565b611a92610100860160e0870161493b565b5f5a9050611aa06003612a8c565b6101008701355f908152610150602052604081205490819003611aef576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611af988806149b7565b90508114611b485780611b0c89806149b7565b6040517f5e3fd6ad0000000000000000000000000000000000000000000000000000000081526004810193909352602483015250604401610d36565b611b5588602001356134df565b611b6a6112a460c08a013560a08b0135614902565b5f611b7b60808a0160608b0161493b565b611b8b60a08b0160808c0161493b565b60a08b013560c08c013560208d0135611ba86101208f018f614956565b604051602001611bbe97969594939291906148aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209050611c1f81611c048b806149b7565b611c1460608e0160408f01614a1b565b8d6101000135613557565b611c55576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c98611c8360017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b611c9360808c0160608d0161493b565b612eee565b5f80611caa60a08c0160808d0161493b565b73ffffffffffffffffffffffffffffffffffffffff1660c08c0135611cd36101208e018e614956565b604051611ce1929190614915565b5f6040518083038185875af1925050503d805f8114611d1b576040519150601f19603f3d011682016040523d82523d5f602084013e611d20565b606091505b509150915081611d9557805115611d3a5780518082602001fd5b611d4a60a08c0160808d0161493b565b6040517f5461344300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610d36565b611dc36113aa60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611f2e57855f849003611e7d57853b158015611e7b573a5a611e1961bc7c86614902565b611e239190614850565b611e2d9190614924565b915081881115611e775773ffffffffffffffffffffffffffffffffffffffff87166108fc611e5b848b614850565b6040518115909202915f818181858888f1935050505050611e7b565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff841615611ea05783611ea2565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611f2a576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610d36565b5050505b505050505050611f3c612fc4565b50565b5f611f72611f6e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614850565b5c90565b905090565b5f54600590610100900460ff16158015611f9757505f5460ff8083169116105b612023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d36565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055838214612096576040517f2526f1080000000000000000000000000000000000000000000000000000000081526004810185905260248101839052604401610d36565b5f5b848110156120f0578383828181106120b2576120b2614605565b905060200201356101be5f8888858181106120cf576120cf614605565b602090810292909201358352508101919091526040015f2055600101612098565b506101bb546101bc546101185460408051938452602084019290925290820152606090206101bf555f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600881901c5f90815261014f6020526040812054600160ff84161b161515610cc4565b60026121aa81612a8c565b73ffffffffffffffffffffffffffffffffffffffff85166121f7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612231576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f918261224183614a3e565b9091555090505f6122528634614850565b90505f33888884868a8a60405160200161227297969594939291906148aa565b60405160208183030381529060405280519060200120905061229483826135eb565b808873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516122fa959493929190614a75565b60405180910390a45050505050505050565b600461231781612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612341816128d7565b5f85900361237b576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a60205260409020548435146123c7576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd5460208501358114612415576040517f2f22b98a0000000000000000000000000000000000000000000000000000000081526004810182905260208601356024820152604401610d36565b5f612422868460016131ea565b90505f61243187848487613667565b905061195c81898c8c8b3560408d013560a08e01356136ef565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82612475816128d7565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c6124d0816128d7565b73ffffffffffffffffffffffffffffffffffffffff831661251d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b602090815260409182902054915173ffffffffffffffffffffffffffffffffffffffff928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60046125de81612a8c565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612608816128d7565b6126156080860186614956565b90505f0361264f576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051608080820183528735825260208089013590830152878301359282019290925260608088013590820152905f9061268c90880188614956565b60405161269a929190614915565b604051809103902090506126c4826101be5f8981526020019081526020015f205461011954612b12565b60608701355f90815260208290526040812090505f612727888a606001358b5f0135856127008e80608001906126fa9190614956565b896138a6565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b905080871461276c576040517fd3664fb30000000000000000000000000000000000000000000000000000000081526004810188905260248101829052604401610d36565b5f8181526101be6020526040902054156127b5576040517f0f06cd1500000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f8181526101be60209081526040808320818d01359081905590519092918c01359184917f52bd912b0041a6ec8554b0ffae3cc1cb7b137bade0dc9e3f8f0b6758466d5df99190a4505050505050505050565b5f82815260656020526040902060010154612822816128d7565b610e8683836129d3565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26612856816128d7565b60da54600160ff84161b161561289d576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b60da8054600160ff851690811b9091179091557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d33610d76565b611f3c81336139a7565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556129753390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610f3a575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60da54600160ff83161b811615612ad4576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff83166004820152602401610d36565b6002811615610f3a576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260016004820152602401610d36565b8251612b4a576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060830151612b85576040517f7dc2487d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001518260010114612bd75760208301516040517fabefa5e80000000000000000000000000000000000000000000000000000000081526001840160048201526024810191909152604401610d36565b80836020015111612c245760208301516040517fa386ed70000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610d36565b826040015183602001511115610e8657602083015160408085015190517fcbbd795300000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a73ffffffffffffffffffffffffffffffffffffffff168787878787604051602001612cd1959493929190614ac7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612d0991614b10565b5f60405180830381855afa9150503d805f8114612d41576040519150601f19603f3d011682016040523d82523d5f602084013e612d46565b606091505b509150915081612d82576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040815114612dca578051604080517ff75db381000000000000000000000000000000000000000000000000000000008152610d369290600401918252602082015260400190565b6020810151604082015161100082141580612e0557507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b15612e46576040517f68dcad5f0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b505050505050505050565b5f612e80611f6e60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b14612eb7576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eec612ee560017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b6001612eee565b565b80825d5050565b5f81815260a66020526040902054600114612f3f576040517f992d87c300000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b5f90815260a66020526040812055565b5f426099541015612f7157609754612f679042614902565b6099555080612f82565b81609a54612f7f9190614902565b90505b609854811115612fbe576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a5550565b612eec6113aa60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614850565b5f54610100900460ff16613088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b73ffffffffffffffffffffffffffffffffffffffff84166130d5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316613122576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312a613a60565b613132613a60565b61313a613a60565b6131448282613af6565b61316e7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82856128e1565b6131987f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26846128e1565b5050600160e4555050565b60da54600160ff83161b1615611f3c576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610d36565b5f8284604001351161323557604080517f7061440500000000000000000000000000000000000000000000000000000000815290850135600482015260248101849052604401610d36565b613249846101a00135856101600135613c63565b6101bf5460408051610180870135815261014087013560208201526101008701359181019190915260609020146132e157604080516101808601358152610140860135602082015261010086013591810191909152606090206101bf546040517fbc5aad1100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d36565b428461012001351061332c576040517fbf81c6e00000000000000000000000000000000000000000000000000000000081526101208501356004820152426024820152604401610d36565b60a0840135613367576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060868101358252608080880135602084015260a0808901359484019490945260c08801359183019190915260e087013590820152205f8181526101be6020526040908190205491925085013514613409575f8181526101be6020526040908190205481517ffb4cd6ef0000000000000000000000000000000000000000000000000000000081529186013560048301526024820152604401610d36565b61342561341a6101e08601866149b7565b866101c00135613d30565b61343c613436610200860186614956565b85613e36565b6040808501355f81815261011a6020529190912060a08601359055610119556101bd8190556134906101a0850135610160860135610120870135604080519384526020840192909252908201526060902090565b6101bf5560408051831515815260a08601359186359190870135907f1335f1a2b3ff25f07f5fef07dd35d8fb4312c3c73b138e2fad9347b3319ab53c9060200160405180910390a49392505050565b600881901c5f90815261014f6020526040902054600160ff83161b1615613535576040517f335a4a9000000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f85815b858110156135de57600163ffffffff8616821c811690036135a8576135a187878381811061358b5761358b614605565b90506020020135835f9182526020526040902090565b91506135d6565b6135d3828888848181106135be576135be614605565b905060200201355f9182526020526040902090565b91505b60010161355b565b5090911495945050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f60405184815283602082015260406101008701604083013782608082015260206040870160a083013760a0610140870160c083013761018081016102208701356020810261024089018337602002902061016082015261018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001900695945050505050565b6040805160018082528183019092525f916020808301908036833701905050905087815f8151811061372357613723614605565b6020908102919091018101919091525f88815261011b909152604090205473ffffffffffffffffffffffffffffffffffffffff168061378e576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7e4f7a8a0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff831690637e4f7a8a906137e6908b908b908890600401614b21565b6020604051808303815f875af1158015613802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138269190614b78565b90508061385f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518781526020810186905286917f5c885a794662ebe3b08ae0874fc2c88b5343b0223ba9cd2cad92b69c0d0c901f910160405180910390a250505050505050505050565b5f6138b2602084614b97565b156138e9576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b801561399e57602081039050808601357fff0000000000000000000000000000000000000000000000000000000000000081161561394f57604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061390c565b50509392505050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610f3a576139e681613eca565b6139f1836020613ee9565b604051602001613a02929190614bcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610d3691600401614c4f565b5f54610100900460ff16612eec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b5f54610100900460ff16613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d36565b815f03613bc5576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03613bfe576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055613c128242614902565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b815f03613ca5578015610f3a576040517f0c25659200000000000000000000000000000000000000000000000000000000815260048101829052602401610d36565b80613cdf576040517f5228f4c800000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f82815261014e60205260409020548114610f3a576040517f36459fa00000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d36565b5f5b82811015611a51576101505f858584818110613d5057613d50614605565b9050602002013581526020019081526020015f20545f14613db957838382818110613d7d57613d7d614605565b905060200201356040517fe5d14425000000000000000000000000000000000000000000000000000000008152600401610d3691815260200190565b816101505f868685818110613dd057613dd0614605565b9050602002013581526020019081526020015f208190555081848483818110613dfb57613dfb614605565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a3600101613d32565b613e41600283614b97565b15613e7b576040517f0c91d77600000000000000000000000000000000000000000000000000000000815260048101839052602401610d36565b5f805b83811015613ec3576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a2600201613e7e565b5050505050565b6060610cc473ffffffffffffffffffffffffffffffffffffffff831660145b60605f613ef7836002614924565b613f02906002614902565b67ffffffffffffffff811115613f1a57613f1a61466e565b6040519080825280601f01601f191660200182016040528015613f44576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110613f7a57613f7a614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613fdc57613fdc614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f614016846002614924565b614021906001614902565b90505b60018111156140bd577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061406257614062614605565b1a60f81b82828151811061407857614078614605565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c936140b681614c9f565b9050614024565b508315614126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d36565b9392505050565b5f6020828403121561413d575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114614126575f80fd5b5f6020828403121561417c575f80fd5b813560ff81168114614126575f80fd5b5f6020828403121561419c575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611f3c575f80fd5b5f80604083850312156141d5575f80fd5b8235915060208301356141e7816141a3565b809150509250929050565b5f8083601f840112614202575f80fd5b50813567ffffffffffffffff811115614219575f80fd5b6020830191508360208260051b8501011115614233575f80fd5b9250929050565b5f805f806060858703121561424d575f80fd5b843567ffffffffffffffff811115614263575f80fd5b61426f878288016141f2565b90989097506020870135966040013595509350505050565b5f8083601f840112614297575f80fd5b50813567ffffffffffffffff8111156142ae575f80fd5b602083019150836020828501011115614233575f80fd5b5f805f805f805f8060e0898b0312156142dc575f80fd5b88356142e7816141a3565b975060208901356142f7816141a3565b965060408901359550606089013594506080890135614315816141a3565b935060a089013567ffffffffffffffff811115614330575f80fd5b61433c8b828c01614287565b999c989b50969995989497949560c00135949350505050565b5f805f805f805f805f6101008a8c03121561436e575f80fd5b8935985060208a0135975060408a0135614387816141a3565b965060608a0135614397816141a3565b955060808a013567ffffffffffffffff8111156143b2575f80fd5b6143be8c828d016141f2565b9a9d999c50979a9699979860a08801359760c0810135975060e0013595509350505050565b5f61022082840312156143f4575f80fd5b50919050565b5f6020828403121561440a575f80fd5b813567ffffffffffffffff811115614420575f80fd5b61442c848285016143e3565b949350505050565b5f60208284031215614444575f80fd5b813567ffffffffffffffff81111561445a575f80fd5b82016101408185031215614126575f80fd5b5f805f806040858703121561447f575f80fd5b843567ffffffffffffffff80821115614496575f80fd5b6144a2888389016141f2565b909650945060208701359150808211156144ba575f80fd5b506144c7878288016141f2565b95989497509550505050565b5f805f80606085870312156144e6575f80fd5b84356144f1816141a3565b935060208501359250604085013567ffffffffffffffff811115614513575f80fd5b6144c787828801614287565b5f805f8060608587031215614532575f80fd5b843567ffffffffffffffff80821115614549575f80fd5b61455588838901614287565b9096509450602087013593506040870135915080821115614574575f80fd5b50614581878288016143e3565b91505092959194509250565b5f806040838503121561459e575f80fd5b82356145a9816141a3565b946020939093013593505050565b5f805f606084860312156145c9575f80fd5b833567ffffffffffffffff8111156145df575f80fd5b840160a081870312156145f0575f80fd5b95602085013595506040909401359392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21833603018112614664575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156146be576146be61466e565b60405290565b5f82601f8301126146d3575f80fd5b813567ffffffffffffffff808211156146ee576146ee61466e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156147345761473461466e565b8160405283815286602085880101111561474c575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f81360360e081121561477c575f80fd5b61478461469b565b6080821215614791575f80fd5b61479961469b565b9150833582526020840135602083015260408401356040830152606084013560608301528181526080840135602082015260a0840135915067ffffffffffffffff808311156147e6575f80fd5b6147f2368487016146c4565b604083015260c085013592508083111561480a575f80fd5b50614817368386016146c4565b60608201529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610cc457610cc4614823565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525086604083015285606083015284608083015260c060a08301526148f560c083018486614863565b9998505050505050505050565b80820180821115610cc457610cc4614823565b818382375f9101908152919050565b8082028115828204841417610cc457610cc4614823565b5f6020828403121561494b575f80fd5b8135614126816141a3565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614989575f80fd5b83018035915067ffffffffffffffff8211156149a3575f80fd5b602001915036819003821315614233575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126149ea575f80fd5b83018035915067ffffffffffffffff821115614a04575f80fd5b6020019150600581901b3603821315614233575f80fd5b5f60208284031215614a2b575f80fd5b813563ffffffff81168114614126575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6e57614a6e614823565b5060010190565b858152846020820152836040820152608060608201525f614a9a608083018486614863565b979650505050505050565b5f5b83811015614abf578181015183820152602001614aa7565b50505f910152565b8581528460208201528360408201525f8351614aea816060850160208801614aa5565b835190830190614b01816060840160208801614aa5565b01606001979650505050505050565b5f8251614664818460208701614aa5565b604081525f614b34604083018587614863565b8281036020848101919091528451808352858201928201905f5b81811015614b6a57845183529383019391830191600101614b4e565b509098975050505050505050565b5f60208284031215614b88575f80fd5b81518015158114614126575f80fd5b5f82614bca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351614c06816017850160208801614aa5565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614c43816028840160208801614aa5565b01602801949350505050565b602081525f8251806020840152614c6d816040850160208701614aa5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f81614cad57614cad614823565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e76faa7ccb401aa8ec924d7d6bf63bcf46c2847cf7bb3f1ec1063972b83db33564736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json b/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json new file mode 100644 index 00000000..67aa6542 --- /dev/null +++ b/contracts/local-deployments-artifacts/dynamic-artifacts/LineaRollupV6.json @@ -0,0 +1,2422 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LineaRollup", + "sourceName": "contracts/LineaRollup.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ArrayLengthsDoNotMatch", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "emptyBlobIndex", + "type": "uint256" + } + ], + "name": "BlobSubmissionDataEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "BlobSubmissionDataIsMissing", + "type": "error" + }, + { + "inputs": [], + "name": "BytesLengthNotMultipleOf32", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bytesLength", + "type": "uint256" + } + ], + "name": "BytesLengthNotMultipleOfTwo", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "currentDataHash", + "type": "bytes32" + } + ], + "name": "DataAlreadySubmitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "EmptyBlobDataAtIndex", + "type": "error" + }, + { + "inputs": [], + "name": "EmptySubmissionData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "FeePaymentFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FeeTooLow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "finalBlockNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastFinalizedBlock", + "type": "uint256" + } + ], + "name": "FinalBlockNumberLessThanOrEqualToLastFinalizedBlock", + "type": "error" + }, + { + "inputs": [], + "name": "FinalBlockStateEqualsZeroHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "expected", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "value", + "type": "bytes32" + } + ], + "name": "FinalShnarfWrong", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "l2BlockTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentBlockTimestamp", + "type": "uint256" + } + ], + "name": "FinalizationInTheFuture", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "expected", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "value", + "type": "bytes32" + } + ], + "name": "FinalizationStateIncorrect", + "type": "error" + }, + { + "inputs": [], + "name": "FirstByteIsNotZero", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMerkleProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "errorReason", + "type": "string" + } + ], + "name": "InvalidProofOrProofVerificationRanOutOfGas", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProofType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "IsNotPaused", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "IsPaused", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "rollingHash", + "type": "bytes32" + } + ], + "name": "L1RollingHashDoesNotExistOnL1", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + } + ], + "name": "L2MerkleRootAlreadyAnchored", + "type": "error" + }, + { + "inputs": [], + "name": "L2MerkleRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "LastFinalizationTimeNotLapsed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "maxAllowedIndex", + "type": "uint32" + } + ], + "name": "LeafIndexOutOfBounds", + "type": "error" + }, + { + "inputs": [], + "name": "LimitIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageIndex", + "type": "uint256" + } + ], + "name": "MessageAlreadyClaimed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "MessageDoesNotExistOrHasAlreadyBeenClaimed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + } + ], + "name": "MessageSendingFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "rollingHash", + "type": "bytes32" + } + ], + "name": "MissingMessageNumberForRollingHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + } + ], + "name": "MissingRollingHashForMessageNumber", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "shnarf", + "type": "bytes32" + } + ], + "name": "ParentBlobNotSubmitted", + "type": "error" + }, + { + "inputs": [], + "name": "PeriodIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "PointEvaluationFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fieldElements", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blsCurveModulus", + "type": "uint256" + } + ], + "name": "PointEvaluationResponseInvalid", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + } + ], + "name": "PrecompileReturnDataLengthWrong", + "type": "error" + }, + { + "inputs": [], + "name": "ProofIsEmpty", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actual", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + } + ], + "name": "ProofLengthDifferentThanMerkleDepth", + "type": "error" + }, + { + "inputs": [], + "name": "RateLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrantCall", + "type": "error" + }, + { + "inputs": [], + "name": "StartingRootHashDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "ValueSentTooLow", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroHashNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "resettingAddress", + "type": "address" + } + ], + "name": "AmountUsedInPeriodReset", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "startBlockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "endBlockNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "shnarf", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "parentStateRootHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "finalStateRootHash", + "type": "bytes32" + } + ], + "name": "DataFinalizedV3", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "parentShnarf", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "shnarf", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "finalStateRootHash", + "type": "bytes32" + } + ], + "name": "DataSubmittedV3", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fallbackOperator", + "type": "address" + } + ], + "name": "FallbackOperatorAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fallbackOperator", + "type": "address" + } + ], + "name": "FallbackOperatorRoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "l2MerkleRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "treeDepth", + "type": "uint256" + } + ], + "name": "L2MerkleRootAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "l2Block", + "type": "uint256" + } + ], + "name": "L2MessagingBlockAnchored", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "amountChangeBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "amountUsedLoweredToLimit", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "usedAmountResetToZero", + "type": "bool" + } + ], + "name": "LimitAmountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes8", + "name": "previousVersion", + "type": "bytes8" + }, + { + "indexed": true, + "internalType": "bytes8", + "name": "newVersion", + "type": "bytes8" + } + ], + "name": "LineaRollupVersionChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_messageHash", + "type": "bytes32" + } + ], + "name": "MessageClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "_messageHash", + "type": "bytes32" + } + ], + "name": "MessageSent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "PauseTypeRoleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "messageSender", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "periodInSeconds", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "limitInWei", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currentPeriodEnd", + "type": "uint256" + } + ], + "name": "RateLimitInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "rollingHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "RollingHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum IPauseManager.PauseType", + "name": "unPauseType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "UnPauseTypeRoleSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "messageSender", + "type": "address" + }, + { + "indexed": true, + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + } + ], + "name": "UnPaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "verifierAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "proofType", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifierSetBy", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "oldVerifierAddress", + "type": "address" + } + ], + "name": "VerifierAddressChanged", + "type": "event" + }, + { + "inputs": [], + "name": "CONTRACT_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_SHNARF", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INBOX_STATUS_RECEIVED", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INBOX_STATUS_UNKNOWN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OPERATOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OUTBOX_STATUS_RECEIVED", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OUTBOX_STATUS_SENT", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "OUTBOX_STATUS_UNKNOWN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ALL_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_BLOB_SUBMISSION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_FINALIZATION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_L1_L2_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_L2_L1_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_LIMIT_SETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_ALL_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_BLOB_SUBMISSION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_FINALIZATION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_L1_L2_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UNPAUSE_L2_L1_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "USED_RATE_LIMIT_RESETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERIFIER_SETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERIFIER_UNSETTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "shnarf", + "type": "bytes32" + } + ], + "name": "blobShnarfExists", + "outputs": [ + { + "internalType": "uint256", + "name": "exists", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_feeRecipient", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "name": "claimMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "leafIndex", + "type": "uint32" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "feeRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IL1MessageService.ClaimMessageWithProofParams", + "name": "_params", + "type": "tuple" + } + ], + "name": "claimMessageWithProof", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "currentFinalizedShnarf", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentFinalizedState", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentL2BlockNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentL2StoredL1MessageNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentL2StoredL1RollingHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentPeriodAmountInWei", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentPeriodEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + } + ], + "name": "dataEndingBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "endingBlock", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + } + ], + "name": "dataFinalStateRootHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "finalStateRootHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + } + ], + "name": "dataParents", + "outputs": [ + { + "internalType": "bytes32", + "name": "parentHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + } + ], + "name": "dataShnarfHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "shnarfHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + } + ], + "name": "dataStartingBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "startingBlock", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fallbackOperator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_aggregatedProof", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_proofType", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "parentStateRootHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "endBlockNumber", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "parentShnarf", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "snarkHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "finalStateRootHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "dataEvaluationPoint", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "dataEvaluationClaim", + "type": "bytes32" + } + ], + "internalType": "struct ILineaRollup.ShnarfData", + "name": "shnarfData", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "lastFinalizedTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "finalTimestamp", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "lastFinalizedL1RollingHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "l1RollingHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastFinalizedL1RollingHashMessageNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "l1RollingHashMessageNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "l2MerkleTreesDepth", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "l2MerkleRoots", + "type": "bytes32[]" + }, + { + "internalType": "bytes", + "name": "l2MessagingBlocksOffsets", + "type": "bytes" + } + ], + "internalType": "struct ILineaRollup.FinalizationDataV3", + "name": "_finalizationData", + "type": "tuple" + } + ], + "name": "finalizeBlocks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "inboxL2L1MessageStatus", + "outputs": [ + { + "internalType": "uint256", + "name": "messageStatus", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "initialStateRootHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "initialL2BlockNumber", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTimestamp", + "type": "uint256" + }, + { + "internalType": "address", + "name": "defaultVerifier", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rateLimitPeriodInSeconds", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rateLimitAmountInWei", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "addressWithRole", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPermissionsManager.RoleAddress[]", + "name": "roleAddresses", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "pauseTypeRoles", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "unpauseTypeRoles", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "fallbackOperator", + "type": "address" + }, + { + "internalType": "address", + "name": "defaultAdmin", + "type": "address" + } + ], + "internalType": "struct ILineaRollup.InitializationData", + "name": "_initializationData", + "type": "tuple" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_messageNumber", + "type": "uint256" + } + ], + "name": "isMessageClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + } + ], + "name": "l2MerkleRootsDepths", + "outputs": [ + { + "internalType": "uint256", + "name": "treeDepth", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "limitInWei", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextMessageNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "messageHash", + "type": "bytes32" + } + ], + "name": "outboxL1L2MessageStatus", + "outputs": [ + { + "internalType": "uint256", + "name": "messageStatus", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "pauseByType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "pauseType", + "type": "bytes32" + } + ], + "name": "pauseTypeStatuses", + "outputs": [ + { + "internalType": "bool", + "name": "pauseStatus", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "periodInSeconds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addressWithRole", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPermissionsManager.RoleAddress[]", + "name": "_roleAddresses", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_pauseTypeRoles", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "pauseType", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "internalType": "struct IPauseManager.PauseTypeRole[]", + "name": "_unpauseTypeRoles", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "_fallbackOperator", + "type": "address" + } + ], + "name": "reinitializeLineaRollupV6", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resetAmountUsedInPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "resetRateLimitAmount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "messageNumber", + "type": "uint256" + } + ], + "name": "rollingHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "rollingHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_calldata", + "type": "bytes" + } + ], + "name": "sendMessage", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "sender", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_messageNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_rollingHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_lastFinalizedTimestamp", + "type": "uint256" + } + ], + "name": "setFallbackOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newVerifierAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_proofType", + "type": "uint256" + } + ], + "name": "setVerifierAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "stateRootHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "stateRootHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "dataEvaluationClaim", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "kzgCommitment", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "kzgProof", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "finalStateRootHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "snarkHash", + "type": "bytes32" + } + ], + "internalType": "struct ILineaRollup.BlobSubmission[]", + "name": "_blobSubmissions", + "type": "tuple[]" + }, + { + "internalType": "bytes32", + "name": "_parentShnarf", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_finalBlobShnarf", + "type": "bytes32" + } + ], + "name": "submitBlobs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "finalStateRootHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "snarkHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "compressedData", + "type": "bytes" + } + ], + "internalType": "struct ILineaRollup.CompressedCalldataSubmission", + "name": "_submission", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "_parentShnarf", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_expectedShnarf", + "type": "bytes32" + } + ], + "name": "submitDataAsCalldata", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "systemMigrationBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IPauseManager.PauseType", + "name": "_pauseType", + "type": "uint8" + } + ], + "name": "unPauseByType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_proofType", + "type": "uint256" + } + ], + "name": "unsetVerifierAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proofType", + "type": "uint256" + } + ], + "name": "verifiers", + "outputs": [ + { + "internalType": "address", + "name": "verifierAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600e575f80fd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615619806100e05f395ff3fe60806040526004361061049d575f3560e01c806373bd07b71161026b578063b837dbe911610156578063cc5782f6116100d1578063d5d4b83511610087578063e196fb5d1161006d578063e196fb5d14610ed4578063e97a1e9e14610ef3578063f5b541a614610f65575f80fd5b8063d5d4b83514610e8b578063d722bbfc14610ea1575f80fd5b8063cd9b9e9a116100b7578063cd9b9e9a14610e29578063cf5b276414610e3f578063d547741f14610e6c575f80fd5b8063cc5782f614610dc8578063cc6f725114610df6575f80fd5b8063bf3e750511610126578063c0c4e5841161010c578063c0c4e58414610d75578063c1dc0f0714610d94578063c211697414610da9575f80fd5b8063bf3e750514610d2d578063c0729ab114610d60575f80fd5b8063b837dbe914610ca7578063b9174ba314610cbc578063bc61e73314610cef578063bcc3003d14610d0e575f80fd5b80639ac25d08116101e6578063a98e773d116101b6578063ad422ff01161019c578063ad422ff014610c4b578063aea4f74514610c60578063b59faa6014610c74575f80fd5b8063a98e773d14610bea578063ac1eff6814610c09575f80fd5b80639ac25d0814610b725780639ee8b21114610ba55780639f3ce55a14610bc4578063a217fddf14610bd7575f80fd5b8063914e57eb1161023b578063921b278e11610221578063921b278e14610b3d578063986fcddd14610a4e57806399467a3514610b53575f80fd5b8063914e57eb14610ac057806391d1485414610aec575f80fd5b806373bd07b714610a3a5780637d1e8c5514610a4e5780638be745d114610a615780638de4948714610a8d575f80fd5b80634cdd389b1161038b57806360e83cf31161030657806367e404ce116102d6578063695378f5116102bc578063695378f5146109be5780636a906b80146109d45780636e67384314610a07575f80fd5b806367e404ce146109665780636854f6bc1461099f575f80fd5b806360e83cf3146108bc57806363213155146108e85780636463fb2a1461091b57806366f96e981461093a575f80fd5b8063587944561161035b5780635c721a0c116103415780635c721a0c146108395780635ed73ceb146108645780636078bfd814610890575f80fd5b806358794456146108245780635b7eb4bd14610742575f80fd5b80634cdd389b146107875780635230eef2146107b3578063557eac73146107e65780635603c65f14610805575f80fd5b8063289581741161041b57806338b90333116103eb5780633fc08b65116103d15780633fc08b651461071757806348922ab714610742578063491e093614610768575f80fd5b806338b903331461068f5780633b12eccb146106e4575f80fd5b8063289581741461061c5780632c70645c1461063b5780632f2ff15d1461065157806336568abe14610670575f80fd5b806312d3fa9a116104705780631f443da0116104565780631f443da0146105965780632130d812146105c2578063248a9ca3146105ee575f80fd5b806312d3fa9a1461054d5780631e2ff94f14610580575f80fd5b806301ffc9a7146104a157806303134d1d146104d557806305861180146105165780631065a3991461052c575b5f80fd5b3480156104ac575f80fd5b506104c06104bb3660046148d2565b610f98565b60405190151581526020015b60405180910390f35b3480156104e0575f80fd5b506105087f1ab87f7458c0e3d07e9881c14ee67f0141703614fd48ea5b15ed987e5f4b030e81565b6040519081526020016104cc565b348015610521575f80fd5b506105086101bb5481565b348015610537575f80fd5b5061054b610546366004614911565b611030565b005b348015610558575f80fd5b506105087f67c2dca7476ee0fe1dd3cba13428c6760bfe2599a6dfe26a9ad7ef27317c6e7781565b34801561058b575f80fd5b506105086101185481565b3480156105a1575f80fd5b506105086105b036600461492f565b6101b96020525f908152604090205481565b3480156105cd575f80fd5b506105086105dc36600461492f565b6101be6020525f908152604090205481565b3480156105f9575f80fd5b5061050861060836600461492f565b5f9081526065602052604090206001015490565b348015610627575f80fd5b5061054b61063636600461492f565b611139565b348015610646575f80fd5b506105086101835481565b34801561065c575f80fd5b5061054b61066b366004614967565b6111f9565b34801561067b575f80fd5b5061054b61068a366004614967565b611222565b34801561069a575f80fd5b506106d76040518060400160405280600381526020017f362e30000000000000000000000000000000000000000000000000000000000081525081565b6040516104cc9190614995565b3480156106ef575f80fd5b506105087fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b348015610722575f80fd5b5061050861073136600461492f565b60a56020525f908152604090205481565b34801561074d575f80fd5b50610756600181565b60405160ff90911681526020016104cc565b348015610773575f80fd5b5061054b610782366004614a2d565b6112d5565b348015610792575f80fd5b506105086107a136600461492f565b6101b76020525f908152604090205481565b3480156107be575f80fd5b506105087f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b3480156107f1575f80fd5b5061054b61080036600461492f565b6115d9565b348015610810575f80fd5b5061054b61081f366004614abd565b61169f565b34801561082f575f80fd5b5061050860995481565b348015610844575f80fd5b5061050861085336600461492f565b60a66020525f908152604090205481565b34801561086f575f80fd5b5061050861087e36600461492f565b6101ba6020525f908152604090205481565b34801561089b575f80fd5b506105086108aa36600461492f565b6101b66020525f908152604090205481565b3480156108c7575f80fd5b506105086108d636600461492f565b6101506020525f908152604090205481565b3480156108f3575f80fd5b506105087fe37c272ea30e2bb381ad7cf89ae754b49153250609f36d0cbdad8b64c184bb5c81565b348015610926575f80fd5b5061054b610935366004614b35565b611797565b348015610945575f80fd5b5061050861095436600461492f565b6101b86020525f908152604090205481565b348015610971575f80fd5b5061097a611c3e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104cc565b3480156109aa575f80fd5b5061054b6109b9366004614b6d565b611c76565b3480156109c9575f80fd5b506105086101195481565b3480156109df575f80fd5b506105087fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b348015610a12575f80fd5b506105087f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b348015610a45575f80fd5b50610756600281565b348015610a59575f80fd5b506107565f81565b348015610a6c575f80fd5b50610508610a7b36600461492f565b61011a6020525f908152604090205481565b348015610a98575f80fd5b506105087fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b348015610acb575f80fd5b50610508610ada36600461492f565b61014e6020525f908152604090205481565b348015610af7575f80fd5b506104c0610b06366004614967565b5f91825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610b48575f80fd5b506105086101bf5481565b348015610b5e575f80fd5b5061054b610b6d366004614bbb565b611e6c565b348015610b7d575f80fd5b506105087f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015610bb0575f80fd5b506104c0610bbf36600461492f565b612152565b61054b610bd2366004614c38565b612175565b348015610be2575f80fd5b506105085f81565b348015610bf5575f80fd5b5061054b610c04366004614c90565b6122be565b348015610c14575f80fd5b5061097a610c2336600461492f565b61011b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610c56575f80fd5b5061050860985481565b348015610c6b575f80fd5b5061054b612731565b348015610c7f575f80fd5b506105087fe4831f9e4316ac2c65117d1f602fbf56d38128a9973d5e3fdbc5b77265c18d4081565b348015610cb2575f80fd5b5061050860e45481565b348015610cc7575f80fd5b506105087f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b348015610cfa575f80fd5b506104c0610d09366004614911565b61278c565b348015610d19575f80fd5b5061054b610d28366004614cc8565b6127b0565b348015610d38575f80fd5b506105087f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610d6b575f80fd5b50610508609a5481565b348015610d80575f80fd5b5061054b610d8f366004614d32565b6128fa565b348015610d9f575f80fd5b5061050860975481565b348015610db4575f80fd5b5061054b610dc3366004614de4565b612b2d565b348015610dd3575f80fd5b506104c0610de236600461492f565b60d96020525f908152604090205460ff1681565b348015610e01575f80fd5b506105087fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b348015610e34575f80fd5b506105086101bd5481565b348015610e4a575f80fd5b506101c05461097a9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610e77575f80fd5b5061054b610e86366004614967565b612c5a565b348015610e96575f80fd5b506105086101bc5481565b348015610eac575f80fd5b506105087f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a81565b348015610edf575f80fd5b5061054b610eee366004614911565b612c7e565b348015610efe575f80fd5b50610508604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610f70575f80fd5b506105087f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061102a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60dc5f82600881111561104557611045614e0e565b600881111561105657611056614e0e565b81526020019081526020015f205461106d81612d56565b6110768261278c565b6110b757816040517f186596540000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b60405180910390fd5b8160088111156110c9576110c9614e0e565b60da8054600190921b1990911690558160088111156110ea576110ea614e0e565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a61116381612d56565b5f82815261011b6020908152604080832054905173ffffffffffffffffffffffffffffffffffffffff90911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f8281526065602052604090206001015461121381612d56565b61121d8383612d60565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146112c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016110ae565b6112d18282612e52565b5050565b6112dd612f0b565b85878484875f5a90506112f06003612fa8565b61132461131e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b8f61303a565b5f6113348f8f8f8f8c8f8f613041565b905061133f8161309a565b61135161134c8d8f614ec2565b6130f4565b5f808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d60405161137b929190614ed5565b5f6040518083038185875af1925050503d805f81146113b5576040519150601f19603f3d011682016040523d82523d5f602084013e6113ba565b606091505b509150915081611424578051156113d45780518082602001fd5b8f6040517f546134430000000000000000000000000000000000000000000000000000000081526004016110ae919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b61145861145260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b5f61303a565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a25050861590506115c157855f84900361151057853b15801561150e573a5a6114ac61bc7c86614ec2565b6114b69190614eaf565b6114c09190614ee4565b91508188111561150a5773ffffffffffffffffffffffffffffffffffffffff87166108fc6114ee848b614eaf565b6040518115909202915f818181858888f193505050505061150e565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff8416156115335783611535565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050509050806115bd576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016110ae565b5050505b5050505050506115cf61316a565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261160381612d56565b5f805f4260995410156116285760975461161d9042614ec2565b60995550600161163a565b609a5485101561163a57849250600191505b609885905580806116485750815b1561165357609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b60066116aa81612fa8565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296116d481612d56565b5f85900361170e576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a602052604090205484351461175a576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd545f6117698684613198565b90505f61177d878484878b6020013561343b565b905061178b81898c8c6134be565b50505050505050505050565b61179f612f0b565b60a081018035906117b39060808401614efb565b6117c1610120840184614f16565b6117d2610100860160e08701614efb565b5f5a90506117e06003612fa8565b6101008701355f90815261015060205260408120549081900361182f576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118398880614f77565b90508114611888578061184c8980614f77565b6040517f5e3fd6ad00000000000000000000000000000000000000000000000000000000815260048101939093526024830152506044016110ae565b611895886020013561375a565b6118aa61134c60c08a013560a08b0135614ec2565b5f6118f36118be60808b0160608c01614efb565b6118ce60a08c0160808d01614efb565b8b60a001358c60c001358d602001358e8061012001906118ee9190614f16565b613041565b905061191e816119038b80614f77565b61191360608e0160408f01614fdb565b8d61010001356137d2565b611954576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199761198260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b61199260808c0160608d01614efb565b61303a565b5f806119a960a08c0160808d01614efb565b73ffffffffffffffffffffffffffffffffffffffff1660c08c01356119d26101208e018e614f16565b6040516119e0929190614ed5565b5f6040518083038185875af1925050503d805f8114611a1a576040519150601f19603f3d011682016040523d82523d5f602084013e611a1f565b606091505b509150915081611a9457805115611a395780518082602001fd5b611a4960a08c0160808d01614efb565b6040517f5461344300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016110ae565b611ac261145260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611c2d57855f849003611b7c57853b158015611b7a573a5a611b1861bc7c86614ec2565b611b229190614eaf565b611b2c9190614ee4565b915081881115611b765773ffffffffffffffffffffffffffffffffffffffff87166108fc611b5a848b614eaf565b6040518115909202915f818181858888f1935050505050611b7a565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff841615611b9f5783611ba1565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611c29576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016110ae565b5050505b505050505050611c3b61316a565b50565b5f611c71611c6d60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b5c90565b905090565b6005611c8181612fa8565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611cab81612d56565b611cb86040860186614f16565b90505f03611cf2576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611d006040870187614f16565b604051611d0e929190614ed5565b604051809103902090505f611d308760200135835f9182526020526040902090565b90505f611d7c8760208a01358a3585611d55611d4f60408f018f614f16565b896138d7565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b9050808614611dc1576040517fd3664fb300000000000000000000000000000000000000000000000000000000815260048101879052602481018290526044016110ae565b5f8181526101be602052604090205415611e0a576040517f0f06cd15000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b5f8181526101be602052604090819020600190555181907f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee07231990611e5a908a908c3590918252602082015260400190565b60405180910390a25050505050505050565b6004611e7781612fa8565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611ea181612d56565b845f819003611edc576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b804915611f18576040517f8019aff7000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b6040805160a0810182525f8082526060602083018190529282018390529181018290526080810182905281905f8881526101be60205260408120549003611f8e576040517f6e5424c2000000000000000000000000000000000000000000000000000000008152600481018990526024016110ae565b875f5b85811015612067578b8b82818110611fab57611fab614ffe565b9050602002810190611fbd919061502b565b611fc690615166565b81499450925083612006576040517fc0e41e1d000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b60808301515f818152602086905260409020955061203485875f1c865f0151876020015188604001516139d8565b6060848101518551604080519687526020870194909452928501528301869052608083015260a090912090600101611f91565b508088146120ab576040517fd3664fb300000000000000000000000000000000000000000000000000000000815260048101899052602481018290526044016110ae565b5f8181526101be6020526040902054156120f4576040517f0f06cd15000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b5f8181526101be602090815260409182902060019055606084015182518c81529182015282917f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee072319910160405180910390a25050505050505050505050565b600881901c5f90815261014f6020526040812054600160ff84161b16151561102a565b600261218081612fa8565b73ffffffffffffffffffffffffffffffffffffffff85166121cd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612207576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f9182612217836151f3565b9091555090505f6122288634614eaf565b90505f61223a33898985878b8b613041565b90506122468382613ba5565b808873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516122ac959493929190615271565b60405180910390a45050505050505050565b5f54610100900460ff16158080156122dc57505f54600160ff909116105b806122f55750303b1580156122f557505f5460ff166001145b612381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016110ae565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156123dd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6123ee6080840160608501614efb565b73ffffffffffffffffffffffffffffffffffffffff160361243b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61245e61244b60e08401846152a1565b6124596101008601866152a1565b613c21565b61247082608001358360a00135613ed0565b61248b5f61248661016085016101408601614efb565b612d60565b6124a061249b60c08401846152a1565b613f91565b6124b06080830160608401614efb565b5f805261011b6020527f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561252f61014083016101208401614efb565b6101c080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561258761014083016101208401614efb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f60405160405180910390a36020828101356101198190555f90815261011a825260408082208535905580518084018390528082018390527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830185905260a08084018690528451808503909101815260c08401855280519087012085526101be86528385206001905560e0830185905261010083018590526101208301919091526101408201849052610160808301859052835180840390910181526101808301808552815191909601206101bd558385526101a0820193909352908501356101c09091015290206101bf5580156112d1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf961275b81612d56565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b5f81600881111561279f5761279f614e0e565b60da54600190911b16151592915050565b6127bd62f099c082614ec2565b4210156127f6576040517f4306cbb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805184815260208101849052908101829052606090206101bf541461286e576101bf546040805185815260208101859052908101839052606090206040517fbc5aad11000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016110ae565b6101c05473ffffffffffffffffffffffffffffffffffffffff166128b27f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982612d60565b60405173ffffffffffffffffffffffffffffffffffffffff82169033907f9fc8868f8577b31b805ee65bb52325782b5e2708dbdb7f04c7467c6785fccb30905f90a350505050565b5f54600690610100900460ff1615801561291a57505f5460ff8083169116105b6129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016110ae565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556129e08888613f91565b6129ec86868686613c21565b6101c080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560405133907f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f905f90a36040517f362e300000000000000000000000000000000000000000000000000000000000907f352e300000000000000000000000000000000000000000000000000000000000907f2f8492a7a430cf917798dfb60bc5af634f68e6c40287947df0ea6f7ec0669bd8905f90a35f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c612b5781612d56565b73ffffffffffffffffffffffffffffffffffffffff8316612ba4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b602090815260409182902054915173ffffffffffffffffffffffffffffffffffffffff928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f82815260656020526040902060010154612c7481612d56565b61121d8383612e52565b60db5f826008811115612c9357612c93614e0e565b6008811115612ca457612ca4614e0e565b81526020019081526020015f2054612cbb81612d56565b612cc48261278c565b15612cfd57816040517fc0a71b580000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b816008811115612d0f57612d0f614e0e565b60da8054600190921b9091179055816008811115612d2f57612d2f614e0e565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d45593361110d565b611c3b8133614153565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166112d1575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612df43390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156112d1575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f612f3a611c6d60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614eaf565b14612f71576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fa6612f9f60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614eaf565b600161303a565b565b60da54816008811115612fbd57612fbd614e0e565b6001901b811615612ffc57816040517fc0a71b580000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b60028116156112d15760016040517fc0a71b580000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b80825d5050565b5f60405188815287602082015286604082015285606082015284608082015260c060a08201528260c0820152602083065f811561307f578160200390505b848660e085013790930160e001902098975050505050505050565b5f81815260a660205260409020546001146130e4576040517f992d87c3000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b5f90815260a66020526040812055565b8015611c3b57426099541015613119576097546131119042614ec2565b609955613129565b609a546131269082614ec2565b90505b609854811115613165576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b612fa661145260017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614eaf565b5f818360200135116131e3576040517f7061440500000000000000000000000000000000000000000000000000000000815260208401356004820152602481018390526044016110ae565b6131f783610180013584610140013561420c565b6101bf54604080516101608601358152610120860135602082015260e086013591810191909152606090201461328d57604080516101608501358152610120850135602082015260e085013591810191909152606090206101bf546040517fbc5aad11000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016110ae565b42836101000135106132d8576040517fbf81c6e000000000000000000000000000000000000000000000000000000000815261010084013560048201524260248201526044016110ae565b6080830135613313576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61335660408401356060850135608086013560a087013560c0880135604080519586526020860194909452928401919091526060830152608082015260a0902090565b90506133746133696101c0850185614f77565b856101a001356142d9565b61338b6133856101e0850185614f16565b846143df565b6020808401355f81815261011a909252604090912060808501359055610119556101bd8190556133e0610180840135610140850135610100860135604080519384526020840192909252908201526060902090565b6101bf558060208401356133f3846151f3565b60408051873581526080880135602082015291955085917fa0262dc79e4ccb71ceac8574ae906311ae338aa4a2044fd4ec4b99fad5ab60cb910160405180910390a492915050565b5f604051858152846020820152604060e0880160408301378360808201528260a082015260a0610120880160c08301376101808101610200880135602081026102208a018337602002902061016082015261018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190069695505050505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f815181106134f2576134f2614ffe565b6020908102919091018101919091525f85815261011b909152604090205473ffffffffffffffffffffffffffffffffffffffff168061355d576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808273ffffffffffffffffffffffffffffffffffffffff16637e4f7a8a60e01b87878760405160240161359393929190615305565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161361c9190615376565b5f604051808303815f865af19150503d805f8114613655576040519150601f19603f3d011682016040523d82523d5f602084013e61365a565b606091505b5091509150816137015780511561369f57602081017bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511663ca389c4460e01b178152815181fd5b6040517fca389c4400000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f556e6b6e6f776e0000000000000000000000000000000000000000000000000060448201526064016110ae565b5f818060200190518101906137169190615381565b90508061374f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b600881901c5f90815261014f6020526040902054600160ff83161b16156137b0576040517f335a4a90000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f8060016137e18660026154c1565b6137eb9190614eaf565b90508063ffffffff168463ffffffff161115613843576040517ff7ec909700000000000000000000000000000000000000000000000000000000815263ffffffff8086166004830152821660248201526044016110ae565b865f5b868110156138c957600163ffffffff8716821c811690036138935761388c88888381811061387657613876614ffe565b90506020020135835f9182526020526040902090565b91506138c1565b6138be828989848181106138a9576138a9614ffe565b905060200201355f9182526020526040902090565b91505b600101613846565b509092149695505050505050565b5f6138e36020846154cc565b1561391a576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b80156139cf57602081039050808601357fff0000000000000000000000000000000000000000000000000000000000000081161561398057604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061393d565b50509392505050565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a73ffffffffffffffffffffffffffffffffffffffff168787878787604051602001613a30959493929190615504565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052613a6891615376565b5f60405180830381855afa9150503d805f8114613aa0576040519150601f19603f3d011682016040523d82523d5f602084013e613aa5565b606091505b509150915081613ae1576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040815114613b29578051604080517ff75db3810000000000000000000000000000000000000000000000000000000081526110ae9290600401918252602082015260400190565b6020810151604082015161100082141580613b6457507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b1561374f576040517f68dcad5f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016110ae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f54610100900460ff16613cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b825f5b81811015613dbe57858582818110613cd457613cd4614ffe565b9050604002016020013560db5f888885818110613cf357613cf3614ffe565b613d099260206040909202019081019150614911565b6008811115613d1a57613d1a614e0e565b6008811115613d2b57613d2b614e0e565b815260208101919091526040015f20557f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec6091868683818110613d6e57613d6e614ffe565b613d849260206040909202019081019150614911565b878784818110613d9657613d96614ffe565b90506040020160200135604051613dae92919061552a565b60405180910390a1600101613cba565b508190505f5b81811015613ec857838382818110613dde57613dde614ffe565b9050604002016020013560dc5f868685818110613dfd57613dfd614ffe565b613e139260206040909202019081019150614911565b6008811115613e2457613e24614e0e565b6008811115613e3557613e35614e0e565b815260208101919091526040015f20557fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c2848483818110613e7857613e78614ffe565b613e8e9260206040909202019081019150614911565b858584818110613ea057613ea0614ffe565b90506040020160200135604051613eb892919061552a565b60405180910390a1600101613dc4565b505050505050565b5f54610100900460ff16613f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b613f6e614473565b613f76614473565b613f7e614473565b613f888282614509565b5050600160e455565b5f54610100900460ff16614027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b805f5b8181101561414d575f84848381811061404557614045614ffe565b61405b9260206040909202019081019150614efb565b73ffffffffffffffffffffffffffffffffffffffff16036140a8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106140ba576140ba614ffe565b905060400201602001355f801b036140fe576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61414584848381811061411357614113614ffe565b9050604002016020013585858481811061412f5761412f614ffe565b6124869260206040909202019081019150614efb565b60010161402a565b50505050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166112d1576141928161466f565b61419d83602061468e565b6040516020016141ae929190615545565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526110ae91600401614995565b815f0361424e5780156112d1576040517f0c256592000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b80614288576040517f5228f4c8000000000000000000000000000000000000000000000000000000008152600481018390526024016110ae565b5f82815261014e602052604090205481146112d1576040517f36459fa000000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016110ae565b5f5b8281101561414d576101505f8585848181106142f9576142f9614ffe565b9050602002013581526020019081526020015f20545f146143625783838281811061432657614326614ffe565b905060200201356040517fe5d144250000000000000000000000000000000000000000000000000000000081526004016110ae91815260200190565b816101505f86868581811061437957614379614ffe565b9050602002013581526020019081526020015f2081905550818484838181106143a4576143a4614ffe565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a36001016142db565b6143ea6002836154cc565b15614424576040517f0c91d776000000000000000000000000000000000000000000000000000000008152600481018390526024016110ae565b5f805b8381101561446c576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a2600201614427565b5050505050565b5f54610100900460ff16612fa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b5f54610100900460ff1661459f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b815f036145d8576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03614611576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609782905560988190556146258242614ec2565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a990606001612725565b606061102a73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61469c836002614ee4565b6146a7906002614ec2565b67ffffffffffffffff8111156146bf576146bf615067565b6040519080825280601f01601f1916602001820160405280156146e9576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f8151811061471f5761471f614ffe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061478157614781614ffe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6147bb846002614ee4565b6147c6906001614ec2565b90505b6001811115614862577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061480757614807614ffe565b1a60f81b82828151811061481d5761481d614ffe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c9361485b816155af565b90506147c9565b5083156148cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016110ae565b9392505050565b5f602082840312156148e2575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146148cb575f80fd5b5f60208284031215614921575f80fd5b8135600981106148cb575f80fd5b5f6020828403121561493f575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611c3b575f80fd5b5f8060408385031215614978575f80fd5b82359150602083013561498a81614946565b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f8083601f8401126149f8575f80fd5b50813567ffffffffffffffff811115614a0f575f80fd5b602083019150836020828501011115614a26575f80fd5b9250929050565b5f805f805f805f8060e0898b031215614a44575f80fd5b8835614a4f81614946565b97506020890135614a5f81614946565b965060408901359550606089013594506080890135614a7d81614946565b935060a089013567ffffffffffffffff811115614a98575f80fd5b614aa48b828c016149e8565b999c989b50969995989497949560c00135949350505050565b5f805f8060608587031215614ad0575f80fd5b843567ffffffffffffffff811115614ae6575f80fd5b614af2878288016149e8565b90955093505060208501359150604085013567ffffffffffffffff811115614b18575f80fd5b85016102008188031215614b2a575f80fd5b939692955090935050565b5f60208284031215614b45575f80fd5b813567ffffffffffffffff811115614b5b575f80fd5b820161014081850312156148cb575f80fd5b5f805f60608486031215614b7f575f80fd5b833567ffffffffffffffff811115614b95575f80fd5b840160608187031215614ba6575f80fd5b95602085013595506040909401359392505050565b5f805f8060608587031215614bce575f80fd5b843567ffffffffffffffff811115614be4575f80fd5b8501601f81018713614bf4575f80fd5b803567ffffffffffffffff811115614c0a575f80fd5b8760208260051b8401011115614c1e575f80fd5b602091820198909750908601359560400135945092505050565b5f805f8060608587031215614c4b575f80fd5b8435614c5681614946565b935060208501359250604085013567ffffffffffffffff811115614c78575f80fd5b614c84878288016149e8565b95989497509550505050565b5f60208284031215614ca0575f80fd5b813567ffffffffffffffff811115614cb6575f80fd5b820161016081850312156148cb575f80fd5b5f805f60608486031215614cda575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112614d01575f80fd5b50813567ffffffffffffffff811115614d18575f80fd5b6020830191508360208260061b8501011115614a26575f80fd5b5f805f805f805f6080888a031215614d48575f80fd5b873567ffffffffffffffff811115614d5e575f80fd5b614d6a8a828b01614cf1565b909850965050602088013567ffffffffffffffff811115614d89575f80fd5b614d958a828b01614cf1565b909650945050604088013567ffffffffffffffff811115614db4575f80fd5b614dc08a828b01614cf1565b9094509250506060880135614dd481614946565b8091505092959891949750929550565b5f8060408385031215614df5575f80fd5b8235614e0081614946565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60098110614e70577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6020810161102a8284614e3b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561102a5761102a614e82565b8082018082111561102a5761102a614e82565b818382375f9101908152919050565b808202811582820484141761102a5761102a614e82565b5f60208284031215614f0b575f80fd5b81356148cb81614946565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f49575f80fd5b83018035915067ffffffffffffffff821115614f63575f80fd5b602001915036819003821315614a26575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614faa575f80fd5b83018035915067ffffffffffffffff821115614fc4575f80fd5b6020019150600581901b3603821315614a26575f80fd5b5f60208284031215614feb575f80fd5b813563ffffffff811681146148cb575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261505d575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156150b7576150b7615067565b60405290565b5f82601f8301126150cc575f80fd5b813567ffffffffffffffff8111156150e6576150e6615067565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff8111828210171561513357615133615067565b60405281815283820160200185101561514a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60a08236031215615176575f80fd5b61517e615094565b82358152602083013567ffffffffffffffff81111561519b575f80fd5b6151a7368286016150bd565b602083015250604083013567ffffffffffffffff8111156151c6575f80fd5b6151d2368286016150bd565b60408301525060608381013590820152608092830135928101929092525090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361522357615223614e82565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b858152846020820152836040820152608060608201525f61529660808301848661522a565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126152d4575f80fd5b83018035915067ffffffffffffffff8211156152ee575f80fd5b6020019150600681901b3603821315614a26575f80fd5b604081525f61531860408301858761522a565b82810360208401528084518083526020830191506020860192505f5b81811015615352578351835260209384019390920191600101615334565b5090979650505050505050565b5f81518060208401855e5f93019283525090919050565b5f6148cb828461535f565b5f60208284031215615391575f80fd5b815180151581146148cb575f80fd5b6001815b60018411156153db578085048111156153bf576153bf614e82565b60018416156153cd57908102905b60019390931c9280026153a4565b935093915050565b5f826153f15750600161102a565b816153fd57505f61102a565b8160018114615413576002811461541d57615439565b600191505061102a565b60ff84111561542e5761542e614e82565b50506001821b61102a565b5060208310610133831016604e8410600b841016171561545c575081810a61102a565b6154877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846153a0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156154b9576154b9614e82565b029392505050565b5f6148cb83836153e3565b5f826154ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b8581528460208201528360408201525f615296615524606084018661535f565b8461535f565b604081016155388285614e3b565b8260208301529392505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f615576601783018561535f565b7f206973206d697373696e6720726f6c652000000000000000000000000000000081526155a6601182018561535f565b95945050505050565b5f816155bd576155bd614e82565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122093c0899fafcb326651661ea44d0d07175683e620b7aad7944aa1dbdd20f50bf064736f6c634300081a0033", + "deployedBytecode": "0x60806040526004361061049d575f3560e01c806373bd07b71161026b578063b837dbe911610156578063cc5782f6116100d1578063d5d4b83511610087578063e196fb5d1161006d578063e196fb5d14610ed4578063e97a1e9e14610ef3578063f5b541a614610f65575f80fd5b8063d5d4b83514610e8b578063d722bbfc14610ea1575f80fd5b8063cd9b9e9a116100b7578063cd9b9e9a14610e29578063cf5b276414610e3f578063d547741f14610e6c575f80fd5b8063cc5782f614610dc8578063cc6f725114610df6575f80fd5b8063bf3e750511610126578063c0c4e5841161010c578063c0c4e58414610d75578063c1dc0f0714610d94578063c211697414610da9575f80fd5b8063bf3e750514610d2d578063c0729ab114610d60575f80fd5b8063b837dbe914610ca7578063b9174ba314610cbc578063bc61e73314610cef578063bcc3003d14610d0e575f80fd5b80639ac25d08116101e6578063a98e773d116101b6578063ad422ff01161019c578063ad422ff014610c4b578063aea4f74514610c60578063b59faa6014610c74575f80fd5b8063a98e773d14610bea578063ac1eff6814610c09575f80fd5b80639ac25d0814610b725780639ee8b21114610ba55780639f3ce55a14610bc4578063a217fddf14610bd7575f80fd5b8063914e57eb1161023b578063921b278e11610221578063921b278e14610b3d578063986fcddd14610a4e57806399467a3514610b53575f80fd5b8063914e57eb14610ac057806391d1485414610aec575f80fd5b806373bd07b714610a3a5780637d1e8c5514610a4e5780638be745d114610a615780638de4948714610a8d575f80fd5b80634cdd389b1161038b57806360e83cf31161030657806367e404ce116102d6578063695378f5116102bc578063695378f5146109be5780636a906b80146109d45780636e67384314610a07575f80fd5b806367e404ce146109665780636854f6bc1461099f575f80fd5b806360e83cf3146108bc57806363213155146108e85780636463fb2a1461091b57806366f96e981461093a575f80fd5b8063587944561161035b5780635c721a0c116103415780635c721a0c146108395780635ed73ceb146108645780636078bfd814610890575f80fd5b806358794456146108245780635b7eb4bd14610742575f80fd5b80634cdd389b146107875780635230eef2146107b3578063557eac73146107e65780635603c65f14610805575f80fd5b8063289581741161041b57806338b90333116103eb5780633fc08b65116103d15780633fc08b651461071757806348922ab714610742578063491e093614610768575f80fd5b806338b903331461068f5780633b12eccb146106e4575f80fd5b8063289581741461061c5780632c70645c1461063b5780632f2ff15d1461065157806336568abe14610670575f80fd5b806312d3fa9a116104705780631f443da0116104565780631f443da0146105965780632130d812146105c2578063248a9ca3146105ee575f80fd5b806312d3fa9a1461054d5780631e2ff94f14610580575f80fd5b806301ffc9a7146104a157806303134d1d146104d557806305861180146105165780631065a3991461052c575b5f80fd5b3480156104ac575f80fd5b506104c06104bb3660046148d2565b610f98565b60405190151581526020015b60405180910390f35b3480156104e0575f80fd5b506105087f1ab87f7458c0e3d07e9881c14ee67f0141703614fd48ea5b15ed987e5f4b030e81565b6040519081526020016104cc565b348015610521575f80fd5b506105086101bb5481565b348015610537575f80fd5b5061054b610546366004614911565b611030565b005b348015610558575f80fd5b506105087f67c2dca7476ee0fe1dd3cba13428c6760bfe2599a6dfe26a9ad7ef27317c6e7781565b34801561058b575f80fd5b506105086101185481565b3480156105a1575f80fd5b506105086105b036600461492f565b6101b96020525f908152604090205481565b3480156105cd575f80fd5b506105086105dc36600461492f565b6101be6020525f908152604090205481565b3480156105f9575f80fd5b5061050861060836600461492f565b5f9081526065602052604090206001015490565b348015610627575f80fd5b5061054b61063636600461492f565b611139565b348015610646575f80fd5b506105086101835481565b34801561065c575f80fd5b5061054b61066b366004614967565b6111f9565b34801561067b575f80fd5b5061054b61068a366004614967565b611222565b34801561069a575f80fd5b506106d76040518060400160405280600381526020017f362e30000000000000000000000000000000000000000000000000000000000081525081565b6040516104cc9190614995565b3480156106ef575f80fd5b506105087fb6cc65f42901ed602aec1619cc1ead29d487cd489094a37615153eaeb991d77081565b348015610722575f80fd5b5061050861073136600461492f565b60a56020525f908152604090205481565b34801561074d575f80fd5b50610756600181565b60405160ff90911681526020016104cc565b348015610773575f80fd5b5061054b610782366004614a2d565b6112d5565b348015610792575f80fd5b506105086107a136600461492f565b6101b76020525f908152604090205481565b3480156107be575f80fd5b506105087f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf981565b3480156107f1575f80fd5b5061054b61080036600461492f565b6115d9565b348015610810575f80fd5b5061054b61081f366004614abd565b61169f565b34801561082f575f80fd5b5061050860995481565b348015610844575f80fd5b5061050861085336600461492f565b60a66020525f908152604090205481565b34801561086f575f80fd5b5061050861087e36600461492f565b6101ba6020525f908152604090205481565b34801561089b575f80fd5b506105086108aa36600461492f565b6101b66020525f908152604090205481565b3480156108c7575f80fd5b506105086108d636600461492f565b6101506020525f908152604090205481565b3480156108f3575f80fd5b506105087fe37c272ea30e2bb381ad7cf89ae754b49153250609f36d0cbdad8b64c184bb5c81565b348015610926575f80fd5b5061054b610935366004614b35565b611797565b348015610945575f80fd5b5061050861095436600461492f565b6101b86020525f908152604090205481565b348015610971575f80fd5b5061097a611c3e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104cc565b3480156109aa575f80fd5b5061054b6109b9366004614b6d565b611c76565b3480156109c9575f80fd5b506105086101195481565b3480156109df575f80fd5b506105087fd8b4c34c2ec1f3194471108c64ad2beda340c0337ee4ca35592f9ef270f4228b81565b348015610a12575f80fd5b506105087f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c81565b348015610a45575f80fd5b50610756600281565b348015610a59575f80fd5b506107565f81565b348015610a6c575f80fd5b50610508610a7b36600461492f565b61011a6020525f908152604090205481565b348015610a98575f80fd5b506105087fe1fce82838dd7a42cfe783f60dc6233c8aa2c4fc66e77817805e767ec5e349b681565b348015610acb575f80fd5b50610508610ada36600461492f565b61014e6020525f908152604090205481565b348015610af7575f80fd5b506104c0610b06366004614967565b5f91825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610b48575f80fd5b506105086101bf5481565b348015610b5e575f80fd5b5061054b610b6d366004614bbb565b611e6c565b348015610b7d575f80fd5b506105087f56bdc3c9ec86cb7db110a7699b2ade72f0b8819727d9f7d906b012641505fa7781565b348015610bb0575f80fd5b506104c0610bbf36600461492f565b612152565b61054b610bd2366004614c38565b612175565b348015610be2575f80fd5b506105085f81565b348015610bf5575f80fd5b5061054b610c04366004614c90565b6122be565b348015610c14575f80fd5b5061097a610c2336600461492f565b61011b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610c56575f80fd5b5061050860985481565b348015610c6b575f80fd5b5061054b612731565b348015610c7f575f80fd5b506105087fe4831f9e4316ac2c65117d1f602fbf56d38128a9973d5e3fdbc5b77265c18d4081565b348015610cb2575f80fd5b5061050860e45481565b348015610cc7575f80fd5b506105087f430a7f0cb00b5ebbe63cecc96e82cf959a883e7c13a95110854f1fa6b3fbf59881565b348015610cfa575f80fd5b506104c0610d09366004614911565b61278c565b348015610d19575f80fd5b5061054b610d28366004614cc8565b6127b0565b348015610d38575f80fd5b506105087f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b348015610d6b575f80fd5b50610508609a5481565b348015610d80575f80fd5b5061054b610d8f366004614d32565b6128fa565b348015610d9f575f80fd5b5061050860975481565b348015610db4575f80fd5b5061054b610dc3366004614de4565b612b2d565b348015610dd3575f80fd5b506104c0610de236600461492f565b60d96020525f908152604090205460ff1681565b348015610e01575f80fd5b506105087fe8cb6172fcf5cbaae022b7c910224a4f0c20d53227e630056efff182155a5abc81565b348015610e34575f80fd5b506105086101bd5481565b348015610e4a575f80fd5b506101c05461097a9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610e77575f80fd5b5061054b610e86366004614967565b612c5a565b348015610e96575f80fd5b506105086101bc5481565b348015610eac575f80fd5b506105087f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a81565b348015610edf575f80fd5b5061054b610eee366004614911565b612c7e565b348015610efe575f80fd5b50610508604080515f602082018190529181018290527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608201526080810182905260a081019190915260c0016040516020818303038152906040528051906020012081565b348015610f70575f80fd5b506105087f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061102a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60dc5f82600881111561104557611045614e0e565b600881111561105657611056614e0e565b81526020019081526020015f205461106d81612d56565b6110768261278c565b6110b757816040517f186596540000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b60405180910390fd5b8160088111156110c9576110c9614e0e565b60da8054600190921b1990911690558160088111156110ea576110ea614e0e565b7fd071d2b85dec4489435b541d2f0e2570db09b09db9efd8703948d44a433df65a335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7f6b5661ddfbd1fbd525c902a513e0f47d9c74f1c1ee8a2d4f1937ad305fb8f41a61116381612d56565b5f82815261011b6020908152604080832054905173ffffffffffffffffffffffffffffffffffffffff90911681523392859290917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b5f8281526065602052604090206001015461121381612d56565b61121d8383612d60565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146112c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016110ae565b6112d18282612e52565b5050565b6112dd612f0b565b85878484875f5a90506112f06003612fa8565b61132461131e60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b8f61303a565b5f6113348f8f8f8f8c8f8f613041565b905061133f8161309a565b61135161134c8d8f614ec2565b6130f4565b5f808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d60405161137b929190614ed5565b5f6040518083038185875af1925050503d805f81146113b5576040519150601f19603f3d011682016040523d82523d5f602084013e6113ba565b606091505b509150915081611424578051156113d45780518082602001fd5b8f6040517f546134430000000000000000000000000000000000000000000000000000000081526004016110ae919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b61145861145260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b5f61303a565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a25050861590506115c157855f84900361151057853b15801561150e573a5a6114ac61bc7c86614ec2565b6114b69190614eaf565b6114c09190614ee4565b91508188111561150a5773ffffffffffffffffffffffffffffffffffffffff87166108fc6114ee848b614eaf565b6040518115909202915f818181858888f193505050505061150e565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff8416156115335783611535565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f193505050509050806115bd576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016110ae565b5050505b5050505050506115cf61316a565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261160381612d56565b5f805f4260995410156116285760975461161d9042614ec2565b60995550600161163a565b609a5485101561163a57849250600191505b609885905580806116485750815b1561165357609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b60066116aa81612fa8565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296116d481612d56565b5f85900361170e576040517f7907d79b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610119545f81815261011a602052604090205484351461175a576040517fead4c30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101bd545f6117698684613198565b90505f61177d878484878b6020013561343b565b905061178b81898c8c6134be565b50505050505050505050565b61179f612f0b565b60a081018035906117b39060808401614efb565b6117c1610120840184614f16565b6117d2610100860160e08701614efb565b5f5a90506117e06003612fa8565b6101008701355f90815261015060205260408120549081900361182f576040517f4e68667500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118398880614f77565b90508114611888578061184c8980614f77565b6040517f5e3fd6ad00000000000000000000000000000000000000000000000000000000815260048101939093526024830152506044016110ae565b611895886020013561375a565b6118aa61134c60c08a013560a08b0135614ec2565b5f6118f36118be60808b0160608c01614efb565b6118ce60a08c0160808d01614efb565b8b60a001358c60c001358d602001358e8061012001906118ee9190614f16565b613041565b905061191e816119038b80614f77565b61191360608e0160408f01614fdb565b8d61010001356137d2565b611954576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199761198260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b61199260808c0160608d01614efb565b61303a565b5f806119a960a08c0160808d01614efb565b73ffffffffffffffffffffffffffffffffffffffff1660c08c01356119d26101208e018e614f16565b6040516119e0929190614ed5565b5f6040518083038185875af1925050503d805f8114611a1a576040519150601f19603f3d011682016040523d82523d5f602084013e611a1f565b606091505b509150915081611a9457805115611a395780518082602001fd5b611a4960a08c0160808d01614efb565b6040517f5461344300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016110ae565b611ac261145260017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b60405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e905f90a2505050505f861115611c2d57855f849003611b7c57853b158015611b7a573a5a611b1861bc7c86614ec2565b611b229190614eaf565b611b2c9190614ee4565b915081881115611b765773ffffffffffffffffffffffffffffffffffffffff87166108fc611b5a848b614eaf565b6040518115909202915f818181858888f1935050505050611b7a565b8791505b505b5f73ffffffffffffffffffffffffffffffffffffffff841615611b9f5783611ba1565b335b90505f8173ffffffffffffffffffffffffffffffffffffffff166108fc8490811502906040515f60405180830381858888f19350505050905080611c29576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016110ae565b5050505b505050505050611c3b61316a565b50565b5f611c71611c6d60017f3095e8dc547eeb8bf90020768c67e29e974614469d8f71638ac29f39b96e4893614eaf565b5c90565b905090565b6005611c8181612fa8565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611cab81612d56565b611cb86040860186614f16565b90505f03611cf2576040517fc01eab5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611d006040870187614f16565b604051611d0e929190614ed5565b604051809103902090505f611d308760200135835f9182526020526040902090565b90505f611d7c8760208a01358a3585611d55611d4f60408f018f614f16565b896138d7565b604080519586526020860194909452928401919091526060830152608082015260a0902090565b9050808614611dc1576040517fd3664fb300000000000000000000000000000000000000000000000000000000815260048101879052602481018290526044016110ae565b5f8181526101be602052604090205415611e0a576040517f0f06cd15000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b5f8181526101be602052604090819020600190555181907f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee07231990611e5a908a908c3590918252602082015260400190565b60405180910390a25050505050505050565b6004611e7781612fa8565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611ea181612d56565b845f819003611edc576040517fb1504a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b804915611f18576040517f8019aff7000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b6040805160a0810182525f8082526060602083018190529282018390529181018290526080810182905281905f8881526101be60205260408120549003611f8e576040517f6e5424c2000000000000000000000000000000000000000000000000000000008152600481018990526024016110ae565b875f5b85811015612067578b8b82818110611fab57611fab614ffe565b9050602002810190611fbd919061502b565b611fc690615166565b81499450925083612006576040517fc0e41e1d000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b60808301515f818152602086905260409020955061203485875f1c865f0151876020015188604001516139d8565b6060848101518551604080519687526020870194909452928501528301869052608083015260a090912090600101611f91565b508088146120ab576040517fd3664fb300000000000000000000000000000000000000000000000000000000815260048101899052602481018290526044016110ae565b5f8181526101be6020526040902054156120f4576040517f0f06cd15000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b5f8181526101be602090815260409182902060019055606084015182518c81529182015282917f55f4c645c36aa5cd3f443d6be44d7a7a5df9d2100d7139dfc69d4289ee072319910160405180910390a25050505050505050505050565b600881901c5f90815261014f6020526040812054600160ff84161b16151561102a565b600261218081612fa8565b73ffffffffffffffffffffffffffffffffffffffff85166121cd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34841115612207576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60e480545f9182612217836151f3565b9091555090505f6122288634614eaf565b90505f61223a33898985878b8b613041565b90506122468382613ba5565b808873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8a86888c8c6040516122ac959493929190615271565b60405180910390a45050505050505050565b5f54610100900460ff16158080156122dc57505f54600160ff909116105b806122f55750303b1580156122f557505f5460ff166001145b612381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016110ae565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156123dd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6123ee6080840160608501614efb565b73ffffffffffffffffffffffffffffffffffffffff160361243b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61245e61244b60e08401846152a1565b6124596101008601866152a1565b613c21565b61247082608001358360a00135613ed0565b61248b5f61248661016085016101408601614efb565b612d60565b6124a061249b60c08401846152a1565b613f91565b6124b06080830160608401614efb565b5f805261011b6020527f033d11f27e62ab919708ec716731da80d261a6e4253259b7acde9bf89d28ec1880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561252f61014083016101208401614efb565b6101c080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561258761014083016101208401614efb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f60405160405180910390a36020828101356101198190555f90815261011a825260408082208535905580518084018390528082018390527f072ead6777750dc20232d1cee8dc9a395c2d350df4bbaa5096c6f59b214dcecd60608083018290526080830185905260a08084018690528451808503909101815260c08401855280519087012085526101be86528385206001905560e0830185905261010083018590526101208301919091526101408201849052610160808301859052835180840390910181526101808301808552815191909601206101bd558385526101a0820193909352908501356101c09091015290206101bf5580156112d1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f0cf0d2deb70d7bdac2fa48c4ac99bc558170be0ce5fcb994caefa4bf7b96edf961275b81612d56565b5f609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b5f81600881111561279f5761279f614e0e565b60da54600190911b16151592915050565b6127bd62f099c082614ec2565b4210156127f6576040517f4306cbb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805184815260208101849052908101829052606090206101bf541461286e576101bf546040805185815260208101859052908101839052606090206040517fbc5aad11000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016110ae565b6101c05473ffffffffffffffffffffffffffffffffffffffff166128b27f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92982612d60565b60405173ffffffffffffffffffffffffffffffffffffffff82169033907f9fc8868f8577b31b805ee65bb52325782b5e2708dbdb7f04c7467c6785fccb30905f90a350505050565b5f54600690610100900460ff1615801561291a57505f5460ff8083169116105b6129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016110ae565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556129e08888613f91565b6129ec86868686613c21565b6101c080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915560405133907f1f82add12d98b5eaed4d6a6d5f74cfc7a85e5c90c335ab5562f77f220ed45d5f905f90a36040517f362e300000000000000000000000000000000000000000000000000000000000907f352e300000000000000000000000000000000000000000000000000000000000907f2f8492a7a430cf917798dfb60bc5af634f68e6c40287947df0ea6f7ec0669bd8905f90a35f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050565b7f32937fd5162e282df7e9a14a5073a2425321c7966eaf70ed6c838a1006d84c4c612b5781612d56565b73ffffffffffffffffffffffffffffffffffffffff8316612ba4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815261011b602090815260409182902054915173ffffffffffffffffffffffffffffffffffffffff928316815233928592908716917f4a29db3fc6b42bda201e4b4d69ce8d575eeeba5f153509c0d0a342af0f1bd021910160405180910390a4505f90815261011b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f82815260656020526040902060010154612c7481612d56565b61121d8383612e52565b60db5f826008811115612c9357612c93614e0e565b6008811115612ca457612ca4614e0e565b81526020019081526020015f2054612cbb81612d56565b612cc48261278c565b15612cfd57816040517fc0a71b580000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b816008811115612d0f57612d0f614e0e565b60da8054600190921b9091179055816008811115612d2f57612d2f614e0e565b7f534f879afd40abb4e39f8e1b77a316be4c8e3521d9cf5a3a3db8959d574d45593361110d565b611c3b8133614153565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166112d1575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612df43390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156112d1575f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f612f3a611c6d60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614eaf565b14612f71576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fa6612f9f60017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614eaf565b600161303a565b565b60da54816008811115612fbd57612fbd614e0e565b6001901b811615612ffc57816040517fc0a71b580000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b60028116156112d15760016040517fc0a71b580000000000000000000000000000000000000000000000000000000081526004016110ae9190614e74565b80825d5050565b5f60405188815287602082015286604082015285606082015284608082015260c060a08201528260c0820152602083065f811561307f578160200390505b848660e085013790930160e001902098975050505050505050565b5f81815260a660205260409020546001146130e4576040517f992d87c3000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b5f90815260a66020526040812055565b8015611c3b57426099541015613119576097546131119042614ec2565b609955613129565b609a546131269082614ec2565b90505b609854811115613165576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a55565b612fa661145260017f084edf88d5959696dcc7aab5c8674a33a1ef78f37dda21b782ed03bddb22ade5614eaf565b5f818360200135116131e3576040517f7061440500000000000000000000000000000000000000000000000000000000815260208401356004820152602481018390526044016110ae565b6131f783610180013584610140013561420c565b6101bf54604080516101608601358152610120860135602082015260e086013591810191909152606090201461328d57604080516101608501358152610120850135602082015260e085013591810191909152606090206101bf546040517fbc5aad11000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016110ae565b42836101000135106132d8576040517fbf81c6e000000000000000000000000000000000000000000000000000000000815261010084013560048201524260248201526044016110ae565b6080830135613313576040517f2898482a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61335660408401356060850135608086013560a087013560c0880135604080519586526020860194909452928401919091526060830152608082015260a0902090565b90506133746133696101c0850185614f77565b856101a001356142d9565b61338b6133856101e0850185614f16565b846143df565b6020808401355f81815261011a909252604090912060808501359055610119556101bd8190556133e0610180840135610140850135610100860135604080519384526020840192909252908201526060902090565b6101bf558060208401356133f3846151f3565b60408051873581526080880135602082015291955085917fa0262dc79e4ccb71ceac8574ae906311ae338aa4a2044fd4ec4b99fad5ab60cb910160405180910390a492915050565b5f604051858152846020820152604060e0880160408301378360808201528260a082015260a0610120880160c08301376101808101610200880135602081026102208a018337602002902061016082015261018090207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190069695505050505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f815181106134f2576134f2614ffe565b6020908102919091018101919091525f85815261011b909152604090205473ffffffffffffffffffffffffffffffffffffffff168061355d576040517f69ed70ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808273ffffffffffffffffffffffffffffffffffffffff16637e4f7a8a60e01b87878760405160240161359393929190615305565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161361c9190615376565b5f604051808303815f865af19150503d805f8114613655576040519150601f19603f3d011682016040523d82523d5f602084013e61365a565b606091505b5091509150816137015780511561369f57602081017bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81511663ca389c4460e01b178152815181fd5b6040517fca389c4400000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f556e6b6e6f776e0000000000000000000000000000000000000000000000000060448201526064016110ae565b5f818060200190518101906137169190615381565b90508061374f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b600881901c5f90815261014f6020526040902054600160ff83161b16156137b0576040517f335a4a90000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b600881901c5f90815261014f602052604090208054600160ff84161b17905550565b5f8060016137e18660026154c1565b6137eb9190614eaf565b90508063ffffffff168463ffffffff161115613843576040517ff7ec909700000000000000000000000000000000000000000000000000000000815263ffffffff8086166004830152821660248201526044016110ae565b865f5b868110156138c957600163ffffffff8716821c811690036138935761388c88888381811061387657613876614ffe565b90506020020135835f9182526020526040902090565b91506138c1565b6138be828989848181106138a9576138a9614ffe565b905060200201355f9182526020526040902090565b91505b600101613846565b509092149695505050505050565b5f6138e36020846154cc565b1561391a576040517f6426c6c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f729eebce00000000000000000000000000000000000000000000000000000000835b80156139cf57602081039050808601357fff0000000000000000000000000000000000000000000000000000000000000081161561398057604051838152600481fd5b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001817f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018787090893505061393d565b50509392505050565b7f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001840693505f80600a73ffffffffffffffffffffffffffffffffffffffff168787878787604051602001613a30959493929190615504565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052613a6891615376565b5f60405180830381855afa9150503d805f8114613aa0576040519150601f19603f3d011682016040523d82523d5f602084013e613aa5565b606091505b509150915081613ae1576040517fa71194af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040815114613b29578051604080517ff75db3810000000000000000000000000000000000000000000000000000000081526110ae9290600401918252602082015260400190565b6020810151604082015161100082141580613b6457507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114155b1561374f576040517f68dcad5f00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016110ae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015f90815261014e60208181526040808420548452848252808420868552929091528083208290555190918391839186917fea3b023b4c8680d4b4824f0143132c95476359a2bb70a81d6c5a36f6918f63399190a4505050565b5f54610100900460ff16613cb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b825f5b81811015613dbe57858582818110613cd457613cd4614ffe565b9050604002016020013560db5f888885818110613cf357613cf3614ffe565b613d099260206040909202019081019150614911565b6008811115613d1a57613d1a614e0e565b6008811115613d2b57613d2b614e0e565b815260208101919091526040015f20557f33aa8fd1ce49e1761bc8d27fd53414bfefc45d690feed0ce55019d7d3aec6091868683818110613d6e57613d6e614ffe565b613d849260206040909202019081019150614911565b878784818110613d9657613d96614ffe565b90506040020160200135604051613dae92919061552a565b60405180910390a1600101613cba565b508190505f5b81811015613ec857838382818110613dde57613dde614ffe565b9050604002016020013560dc5f868685818110613dfd57613dfd614ffe565b613e139260206040909202019081019150614911565b6008811115613e2457613e24614e0e565b6008811115613e3557613e35614e0e565b815260208101919091526040015f20557fe7bf4b8dc0c17a52dc9e52323a3ab61cb2079db35f969125b1f8a3d984c6f6c2848483818110613e7857613e78614ffe565b613e8e9260206040909202019081019150614911565b858584818110613ea057613ea0614ffe565b90506040020160200135604051613eb892919061552a565b60405180910390a1600101613dc4565b505050505050565b5f54610100900460ff16613f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b613f6e614473565b613f76614473565b613f7e614473565b613f888282614509565b5050600160e455565b5f54610100900460ff16614027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b805f5b8181101561414d575f84848381811061404557614045614ffe565b61405b9260206040909202019081019150614efb565b73ffffffffffffffffffffffffffffffffffffffff16036140a8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383828181106140ba576140ba614ffe565b905060400201602001355f801b036140fe576040517f0742d05300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61414584848381811061411357614113614ffe565b9050604002016020013585858481811061412f5761412f614ffe565b6124869260206040909202019081019150614efb565b60010161402a565b50505050565b5f82815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166112d1576141928161466f565b61419d83602061468e565b6040516020016141ae929190615545565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526110ae91600401614995565b815f0361424e5780156112d1576040517f0c256592000000000000000000000000000000000000000000000000000000008152600481018290526024016110ae565b80614288576040517f5228f4c8000000000000000000000000000000000000000000000000000000008152600481018390526024016110ae565b5f82815261014e602052604090205481146112d1576040517f36459fa000000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016110ae565b5f5b8281101561414d576101505f8585848181106142f9576142f9614ffe565b9050602002013581526020019081526020015f20545f146143625783838281811061432657614326614ffe565b905060200201356040517fe5d144250000000000000000000000000000000000000000000000000000000081526004016110ae91815260200190565b816101505f86868581811061437957614379614ffe565b9050602002013581526020019081526020015f2081905550818484838181106143a4576143a4614ffe565b905060200201357f300e6f978eee6a4b0bba78dd8400dc64fd5652dbfc868a2258e16d0977be222b60405160405180910390a36001016142db565b6143ea6002836154cc565b15614424576040517f0c91d776000000000000000000000000000000000000000000000000000000008152600481018390526024016110ae565b5f805b8381101561446c576040518582013560f01c9250838301907f3c116827db9db3a30c1a25db8b0ee4bab9d2b223560209cfd839601b621c726d905f90a2600201614427565b5050505050565b5f54610100900460ff16612fa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b5f54610100900460ff1661459f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016110ae565b815f036145d8576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03614611576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609782905560988190556146258242614ec2565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a990606001612725565b606061102a73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61469c836002614ee4565b6146a7906002614ec2565b67ffffffffffffffff8111156146bf576146bf615067565b6040519080825280601f01601f1916602001820160405280156146e9576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f8151811061471f5761471f614ffe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061478157614781614ffe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6147bb846002614ee4565b6147c6906001614ec2565b90505b6001811115614862577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061480757614807614ffe565b1a60f81b82828151811061481d5761481d614ffe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c9361485b816155af565b90506147c9565b5083156148cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016110ae565b9392505050565b5f602082840312156148e2575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146148cb575f80fd5b5f60208284031215614921575f80fd5b8135600981106148cb575f80fd5b5f6020828403121561493f575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611c3b575f80fd5b5f8060408385031215614978575f80fd5b82359150602083013561498a81614946565b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f8083601f8401126149f8575f80fd5b50813567ffffffffffffffff811115614a0f575f80fd5b602083019150836020828501011115614a26575f80fd5b9250929050565b5f805f805f805f8060e0898b031215614a44575f80fd5b8835614a4f81614946565b97506020890135614a5f81614946565b965060408901359550606089013594506080890135614a7d81614946565b935060a089013567ffffffffffffffff811115614a98575f80fd5b614aa48b828c016149e8565b999c989b50969995989497949560c00135949350505050565b5f805f8060608587031215614ad0575f80fd5b843567ffffffffffffffff811115614ae6575f80fd5b614af2878288016149e8565b90955093505060208501359150604085013567ffffffffffffffff811115614b18575f80fd5b85016102008188031215614b2a575f80fd5b939692955090935050565b5f60208284031215614b45575f80fd5b813567ffffffffffffffff811115614b5b575f80fd5b820161014081850312156148cb575f80fd5b5f805f60608486031215614b7f575f80fd5b833567ffffffffffffffff811115614b95575f80fd5b840160608187031215614ba6575f80fd5b95602085013595506040909401359392505050565b5f805f8060608587031215614bce575f80fd5b843567ffffffffffffffff811115614be4575f80fd5b8501601f81018713614bf4575f80fd5b803567ffffffffffffffff811115614c0a575f80fd5b8760208260051b8401011115614c1e575f80fd5b602091820198909750908601359560400135945092505050565b5f805f8060608587031215614c4b575f80fd5b8435614c5681614946565b935060208501359250604085013567ffffffffffffffff811115614c78575f80fd5b614c84878288016149e8565b95989497509550505050565b5f60208284031215614ca0575f80fd5b813567ffffffffffffffff811115614cb6575f80fd5b820161016081850312156148cb575f80fd5b5f805f60608486031215614cda575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112614d01575f80fd5b50813567ffffffffffffffff811115614d18575f80fd5b6020830191508360208260061b8501011115614a26575f80fd5b5f805f805f805f6080888a031215614d48575f80fd5b873567ffffffffffffffff811115614d5e575f80fd5b614d6a8a828b01614cf1565b909850965050602088013567ffffffffffffffff811115614d89575f80fd5b614d958a828b01614cf1565b909650945050604088013567ffffffffffffffff811115614db4575f80fd5b614dc08a828b01614cf1565b9094509250506060880135614dd481614946565b8091505092959891949750929550565b5f8060408385031215614df5575f80fd5b8235614e0081614946565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60098110614e70577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6020810161102a8284614e3b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561102a5761102a614e82565b8082018082111561102a5761102a614e82565b818382375f9101908152919050565b808202811582820484141761102a5761102a614e82565b5f60208284031215614f0b575f80fd5b81356148cb81614946565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f49575f80fd5b83018035915067ffffffffffffffff821115614f63575f80fd5b602001915036819003821315614a26575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614faa575f80fd5b83018035915067ffffffffffffffff821115614fc4575f80fd5b6020019150600581901b3603821315614a26575f80fd5b5f60208284031215614feb575f80fd5b813563ffffffff811681146148cb575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261505d575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156150b7576150b7615067565b60405290565b5f82601f8301126150cc575f80fd5b813567ffffffffffffffff8111156150e6576150e6615067565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff8111828210171561513357615133615067565b60405281815283820160200185101561514a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60a08236031215615176575f80fd5b61517e615094565b82358152602083013567ffffffffffffffff81111561519b575f80fd5b6151a7368286016150bd565b602083015250604083013567ffffffffffffffff8111156151c6575f80fd5b6151d2368286016150bd565b60408301525060608381013590820152608092830135928101929092525090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361522357615223614e82565b5060010190565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b858152846020820152836040820152608060608201525f61529660808301848661522a565b979650505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126152d4575f80fd5b83018035915067ffffffffffffffff8211156152ee575f80fd5b6020019150600681901b3603821315614a26575f80fd5b604081525f61531860408301858761522a565b82810360208401528084518083526020830191506020860192505f5b81811015615352578351835260209384019390920191600101615334565b5090979650505050505050565b5f81518060208401855e5f93019283525090919050565b5f6148cb828461535f565b5f60208284031215615391575f80fd5b815180151581146148cb575f80fd5b6001815b60018411156153db578085048111156153bf576153bf614e82565b60018416156153cd57908102905b60019390931c9280026153a4565b935093915050565b5f826153f15750600161102a565b816153fd57505f61102a565b8160018114615413576002811461541d57615439565b600191505061102a565b60ff84111561542e5761542e614e82565b50506001821b61102a565b5060208310610133831016604e8410600b841016171561545c575081810a61102a565b6154877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846153a0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156154b9576154b9614e82565b029392505050565b5f6148cb83836153e3565b5f826154ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500690565b8581528460208201528360408201525f615296615524606084018661535f565b8461535f565b604081016155388285614e3b565b8260208301529392505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f615576601783018561535f565b7f206973206d697373696e6720726f6c652000000000000000000000000000000081526155a6601182018561535f565b95945050505050565b5f816155bd576155bd614e82565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122093c0899fafcb326651661ea44d0d07175683e620b7aad7944aa1dbdd20f50bf064736f6c634300081a0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/e2e/src/abi/DummyContract.json b/contracts/local-deployments-artifacts/static-artifacts/DummyContract.json similarity index 100% rename from e2e/src/abi/DummyContract.json rename to contracts/local-deployments-artifacts/static-artifacts/DummyContract.json diff --git a/e2e/src/abi/L2TestContract.json b/contracts/local-deployments-artifacts/static-artifacts/L2TestContract.json similarity index 100% rename from e2e/src/abi/L2TestContract.json rename to contracts/local-deployments-artifacts/static-artifacts/L2TestContract.json diff --git a/contracts/local-deployments-artifacts/static-artifacts/ProxyAdmin.json b/contracts/local-deployments-artifacts/static-artifacts/ProxyAdmin.json new file mode 100644 index 00000000..3b7985c6 --- /dev/null +++ b/contracts/local-deployments-artifacts/static-artifacts/ProxyAdmin.json @@ -0,0 +1,160 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "contracts/proxies/ProxyAdmin.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "changeProxyAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + } + ], + "name": "getProxyAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + } + ], + "name": "getProxyImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "upgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6108658061007e6000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220688ab5dd8d9528556ea321a4b4ef35edd0288c19274db8bf4057c8b61d9e438764736f6c63430008130033", + "deployedBytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220688ab5dd8d9528556ea321a4b4ef35edd0288c19274db8bf4057c8b61d9e438764736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} + } \ No newline at end of file diff --git a/e2e/src/abi/TestContract.json b/contracts/local-deployments-artifacts/static-artifacts/TestContract.json similarity index 100% rename from e2e/src/abi/TestContract.json rename to contracts/local-deployments-artifacts/static-artifacts/TestContract.json diff --git a/contracts/local-deployments-artifacts/static-artifacts/TransparentUpgradeableProxy.json b/contracts/local-deployments-artifacts/static-artifacts/TransparentUpgradeableProxy.json new file mode 100644 index 00000000..75c2a5ef --- /dev/null +++ b/contracts/local-deployments-artifacts/static-artifacts/TransparentUpgradeableProxy.json @@ -0,0 +1,85 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "contracts/proxies/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6080604052604051620010f0380380620010f0833981016040819052620000269162000424565b828162000036828260006200004d565b50620000449050826200007f565b50505062000557565b6200005883620000f1565b600082511180620000665750805b156200007a5762000078838362000133565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000c1600080516020620010a9833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000ee8162000162565b50565b620000fc8162000200565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200015b8383604051806060016040528060278152602001620010c96027913962000297565b9392505050565b6001600160a01b038116620001cd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80600080516020620010a98339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c4565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001df565b6060600080856001600160a01b031685604051620002b6919062000504565b600060405180830381855af49150503d8060008114620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5090925090506200030c8683838762000316565b9695505050505050565b606083156200038a57825160000362000382576001600160a01b0385163b620003825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c4565b508162000396565b6200039683836200039e565b949350505050565b815115620003af5781518083602001fd5b8060405162461bcd60e51b8152600401620001c4919062000522565b80516001600160a01b0381168114620003e357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200041b57818101518382015260200162000401565b50506000910152565b6000806000606084860312156200043a57600080fd5b6200044584620003cb565b92506200045560208501620003cb565b60408501519092506001600160401b03808211156200047357600080fd5b818601915086601f8301126200048857600080fd5b8151818111156200049d576200049d620003e8565b604051601f8201601f19908116603f01168101908382118183101715620004c857620004c8620003e8565b81604052828152896020848701011115620004e257600080fd5b620004f5836020830160208801620003fe565b80955050505050509250925092565b6000825162000518818460208701620003fe565b9190910192915050565b602081526000825180602084015262000543816040850160208701620003fe565b601f01601f19169190910160400192915050565b610b4280620005676000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6102a1565b73ffffffffffffffffffffffffffffffffffffffff1633036102975760607fffffffff00000000000000000000000000000000000000000000000000000000600035167fc9a6301a000000000000000000000000000000000000000000000000000000008101610098576100916102e1565b915061028f565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e957610091610338565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013a5761009161037e565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018b576100916103af565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101dc576100916103fc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029f610410565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102eb610420565b60006102fa36600481846108d7565b810190610307919061092a565b90506103248160405180602001604052806000815250600061042b565b505060408051602081019091526000815290565b606060008061034a36600481846108d7565b8101906103579190610974565b915091506103678282600161042b565b604051806020016040528060008152509250505090565b6060610388610420565b600061039736600481846108d7565b8101906103a4919061092a565b905061032481610457565b60606103b9610420565b60006103c36102a1565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b6060610406610420565b60006103c36104bb565b61029f61041b6104bb565b6104ca565b341561029f57600080fd5b610434836104ee565b6000825111806104415750805b1561045257610450838361053b565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104806102a1565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104b881610567565b50565b60006104c5610673565b905090565b3660008037600080366000845af43d6000803e8080156104e9573d6000f35b3d6000fd5b6104f78161069b565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606105608383604051806060016040528060278152602001610ae660279139610766565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661060a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610286565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c5565b73ffffffffffffffffffffffffffffffffffffffff81163b61073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610286565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61062d565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516107909190610a78565b600060405180830381855af49150503d80600081146107cb576040519150601f19603f3d011682016040523d82523d6000602084013e6107d0565b606091505b50915091506107e1868383876107eb565b9695505050505050565b6060831561088157825160000361087a5773ffffffffffffffffffffffffffffffffffffffff85163b61087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610286565b508161088b565b61088b8383610893565b949350505050565b8151156108a35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102869190610a94565b600080858511156108e757600080fd5b838611156108f457600080fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461092557600080fd5b919050565b60006020828403121561093c57600080fd5b61056082610901565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561098757600080fd5b61099083610901565b9150602083013567ffffffffffffffff808211156109ad57600080fd5b818501915085601f8301126109c157600080fd5b8135818111156109d3576109d3610945565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610a1957610a19610945565b81604052828152886020848701011115610a3257600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b83811015610a6f578181015183820152602001610a57565b50506000910152565b60008251610a8a818460208701610a54565b9190910192915050565b6020815260008251806020840152610ab3816040850160208701610a54565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220edc7bfa5f7979ed0c081674a3fa29e5926f28f054c2f3bf69ac91dbea8a20b2264736f6c63430008130033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6102a1565b73ffffffffffffffffffffffffffffffffffffffff1633036102975760607fffffffff00000000000000000000000000000000000000000000000000000000600035167fc9a6301a000000000000000000000000000000000000000000000000000000008101610098576100916102e1565b915061028f565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e957610091610338565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013a5761009161037e565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018b576100916103af565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101dc576100916103fc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029f610410565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102eb610420565b60006102fa36600481846108d7565b810190610307919061092a565b90506103248160405180602001604052806000815250600061042b565b505060408051602081019091526000815290565b606060008061034a36600481846108d7565b8101906103579190610974565b915091506103678282600161042b565b604051806020016040528060008152509250505090565b6060610388610420565b600061039736600481846108d7565b8101906103a4919061092a565b905061032481610457565b60606103b9610420565b60006103c36102a1565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b6060610406610420565b60006103c36104bb565b61029f61041b6104bb565b6104ca565b341561029f57600080fd5b610434836104ee565b6000825111806104415750805b1561045257610450838361053b565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104806102a1565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104b881610567565b50565b60006104c5610673565b905090565b3660008037600080366000845af43d6000803e8080156104e9573d6000f35b3d6000fd5b6104f78161069b565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606105608383604051806060016040528060278152602001610ae660279139610766565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661060a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610286565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c5565b73ffffffffffffffffffffffffffffffffffffffff81163b61073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610286565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61062d565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516107909190610a78565b600060405180830381855af49150503d80600081146107cb576040519150601f19603f3d011682016040523d82523d6000602084013e6107d0565b606091505b50915091506107e1868383876107eb565b9695505050505050565b6060831561088157825160000361087a5773ffffffffffffffffffffffffffffffffffffffff85163b61087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610286565b508161088b565b61088b8383610893565b949350505050565b8151156108a35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102869190610a94565b600080858511156108e757600080fd5b838611156108f457600080fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461092557600080fd5b919050565b60006020828403121561093c57600080fd5b61056082610901565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561098757600080fd5b61099083610901565b9150602083013567ffffffffffffffff808211156109ad57600080fd5b818501915085601f8301126109c157600080fd5b8135818111156109d3576109d3610945565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610a1957610a19610945565b81604052828152886020848701011115610a3257600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b83811015610a6f578181015183820152602001610a57565b50506000910152565b60008251610a8a818460208701610a54565b9190910192915050565b6020815260008251806020840152610ab3816040850160208701610a54565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220edc7bfa5f7979ed0c081674a3fa29e5926f28f054c2f3bf69ac91dbea8a20b2264736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} + } \ No newline at end of file diff --git a/contracts/scripts/utils.ts b/contracts/scripts/utils.ts index 543598ce..b41285ac 100644 --- a/contracts/scripts/utils.ts +++ b/contracts/scripts/utils.ts @@ -1,18 +1,17 @@ import { ethers } from "ethers"; -import { HardhatEthersHelpers } from "hardhat/types"; /** * @param provider ethers JsonRpcProvider or HardhatEthersHelpers provider instance * @returns {Promise<{maxPriorityFeePerGas: *, maxFeePerGas: *}>} */ async function get1559Fees( - provider: ethers.JsonRpcProvider | HardhatEthersHelpers["provider"], -): Promise<{ maxPriorityFeePerGas?: bigint; maxFeePerGas?: bigint }> { - const { maxPriorityFeePerGas, maxFeePerGas } = await provider.getFeeData(); - + provider: ethers.Provider, +): Promise<{ maxPriorityFeePerGas?: bigint; maxFeePerGas?: bigint; gasPrice?: bigint }> { + const { maxPriorityFeePerGas, maxFeePerGas, gasPrice } = await provider.getFeeData(); return { ...(maxPriorityFeePerGas ? { maxPriorityFeePerGas } : {}), ...(maxFeePerGas ? { maxFeePerGas } : {}), + ...(gasPrice ? { gasPrice } : {}), }; } diff --git a/coordinator/ethereum/blob-submitter/build.gradle b/coordinator/ethereum/blob-submitter/build.gradle index 06c4a733..7775de97 100644 --- a/coordinator/ethereum/blob-submitter/build.gradle +++ b/coordinator/ethereum/blob-submitter/build.gradle @@ -62,7 +62,6 @@ task integrationTest(type: Test) { testClassesDirs = sourceSets.integrationTest.output.classesDirs dependsOn(":localStackComposeUp") - dependsOn(rootProject.tasks.compileContracts) testLogging { events TestLogEvent.FAILED, diff --git a/coordinator/ethereum/gas-pricing/static-cap/build.gradle b/coordinator/ethereum/gas-pricing/static-cap/build.gradle index 7c6da96b..499fbf50 100644 --- a/coordinator/ethereum/gas-pricing/static-cap/build.gradle +++ b/coordinator/ethereum/gas-pricing/static-cap/build.gradle @@ -41,7 +41,6 @@ task integrationTest(type: Test) { classpath = sourceSets.integrationTest.runtimeClasspath testClassesDirs = sourceSets.integrationTest.output.classesDirs dependsOn(":localStackComposeUp") - dependsOn(rootProject.tasks.compileContracts) } diff --git a/coordinator/ethereum/message-anchoring/build.gradle b/coordinator/ethereum/message-anchoring/build.gradle index 8b00aa37..b6c8640d 100644 --- a/coordinator/ethereum/message-anchoring/build.gradle +++ b/coordinator/ethereum/message-anchoring/build.gradle @@ -43,5 +43,4 @@ task integrationTest(type: Test) { classpath = sourceSets.integrationTest.runtimeClasspath testClassesDirs = sourceSets.integrationTest.output.classesDirs dependsOn(":localStackComposeUp") - dependsOn(rootProject.tasks.compileContracts) } diff --git a/coordinator/ethereum/test-utils/build.gradle b/coordinator/ethereum/test-utils/build.gradle index 7a6848ff..1b9690d9 100644 --- a/coordinator/ethereum/test-utils/build.gradle +++ b/coordinator/ethereum/test-utils/build.gradle @@ -44,7 +44,6 @@ task integrationTest(type: Test) { testClassesDirs = sourceSets.integrationTest.output.classesDirs dependsOn(":localStackComposeUp") - dependsOn(rootProject.tasks.compileContracts) testLogging { events TestLogEvent.FAILED, TestLogEvent.SKIPPED, diff --git a/coordinator/ethereum/test-utils/src/main/kotlin/net/consensys/zkevm/ethereum/MakefileContractDeploymentHelper.kt b/coordinator/ethereum/test-utils/src/main/kotlin/net/consensys/zkevm/ethereum/MakefileContractDeploymentHelper.kt index 56607668..c5832e94 100644 --- a/coordinator/ethereum/test-utils/src/main/kotlin/net/consensys/zkevm/ethereum/MakefileContractDeploymentHelper.kt +++ b/coordinator/ethereum/test-utils/src/main/kotlin/net/consensys/zkevm/ethereum/MakefileContractDeploymentHelper.kt @@ -144,7 +144,7 @@ fun makeDeployLineaRollup( ) deploymentPrivateKey?.let { env["DEPLOYMENT_PRIVATE_KEY"] = it } val command = when (contractVersion) { - LineaContractVersion.V5 -> "make deploy-linea-rollup" + LineaContractVersion.V5 -> "make deploy-linea-rollup-v5" LineaContractVersion.V6 -> "make deploy-linea-rollup-v6" else -> throw IllegalArgumentException("Unsupported contract version: $contractVersion") } diff --git a/docker/compose.yml b/docker/compose.yml index 77b85e0a..85213bd7 100644 --- a/docker/compose.yml +++ b/docker/compose.yml @@ -489,21 +489,16 @@ services: build: context: ./config/l1-node/ profiles: [ "l1", "debug", "external-to-monorepo" ] - entrypoint: - - /bin/sh - - -c - - | - /config/generate-genesis.sh \ - --genesis-time ${L1_GENESIS_TIME} \ - --l1-genesis /config/l1-genesis.json \ - --network-config /config/network-config.yml \ - --mnemonics /config/mnemonics.yaml \ - --output-dir /data/l1-node-config + command: + --genesis-time ${L1_GENESIS_TIME} + --l1-genesis /config/l1-genesis.json + --network-config /config/network-config.yml + --mnemonics /config/mnemonics.yaml + --output-dir /data/l1-node-config volumes: - ./config/l1-node/cl/network-config.yml:/config/network-config.yml:ro - ./config/l1-node/cl/mnemonics.yaml:/config/mnemonics.yaml:ro - ./config/l1-node/el/genesis.json:/config/l1-genesis.json - - ./config/l1-node/generate-genesis.sh:/config/generate-genesis.sh - local-dev:/data l1-blockscout: diff --git a/docker/config/l1-node/Dockerfile b/docker/config/l1-node/Dockerfile index b97e3c51..57f9544d 100644 --- a/docker/config/l1-node/Dockerfile +++ b/docker/config/l1-node/Dockerfile @@ -1,12 +1,16 @@ -FROM golang:1.22-alpine as builder +FROM golang:1.23-alpine as builder RUN apk add --no-cache git && git clone https://github.com/protolambda/eth2-testnet-genesis.git \ && cd eth2-testnet-genesis \ - && git checkout 4b3498476f14b872b43080eee319adea45286daf \ && go install . -FROM alpine:3.19.1 +COPY ./generate-genesis.sh /generate-genesis.sh + +FROM alpine:3.20.3 RUN apk add --no-cache bash +COPY --from=builder /generate-genesis.sh /config/generate-genesis.sh COPY --from=builder /go/bin/eth2-testnet-genesis /usr/local/bin/ + +ENTRYPOINT [ "/bin/sh" , "/config/generate-genesis.sh" ] diff --git a/docs/get-started.md b/docs/get-started.md index 88f7046b..0cebb90f 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -6,7 +6,7 @@ - Docker v24 or higher - Docker Compose version v2.19+ - Make v3.81+ -- Pnpm >=v9.1.1 (https://pnpm.io/installation) +- Pnpm >=v9.12.2 (https://pnpm.io/installation) ### Run stack locally diff --git a/e2e/jest.config.ts b/e2e/jest.config.ts index ce990bd1..a70a68e5 100644 --- a/e2e/jest.config.ts +++ b/e2e/jest.config.ts @@ -8,10 +8,11 @@ const config: Config = { verbose: true, globalSetup: "./config/jest/global-setup.ts", globalTeardown: "./config/jest/global-teardown.ts", - maxWorkers: "50%", - maxConcurrency: 5, testTimeout: 3 * 60 * 1000, + maxConcurrency: 7, + maxWorkers: "75%", workerThreads: true, + forceExit: true, }; export default config; diff --git a/e2e/package.json b/e2e/package.json index 3787dffa..14249d1d 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -11,7 +11,7 @@ "test:e2e:local": "TEST_ENV=local npx jest", "test:e2e:dev": "TEST_ENV=dev npx jest --config ./jest.testnet.config.ts --bail --runInBand --testPathIgnorePatterns=restart.spec.ts", "test:e2e:sepolia": "TEST_ENV=sepolia npx jest --config ./jest.testnet.config.ts --bail --runInBand --testPathIgnorePatterns=restart.spec.ts", - "postinstall": "typechain --target ethers-v6 --out-dir ./src/typechain './src/abi/*.json'", + "postinstall": "typechain --target ethers-v6 --out-dir ./src/typechain '../contracts/local-deployments-artifacts/**/*.json'", "lint:fix": "pnpm run lint:ts:fix && pnpm run prettier:fix", "clean": "rimraf node_modules src/typechain" }, @@ -22,6 +22,7 @@ "@openzeppelin/upgrades-core": "1.33.1", "@typechain/ethers-v6": "0.5.1", "@types/jest": "29.5.13", + "async-mutex": "^0.5.0", "child_process": "1.0.2", "dotenv": "16.4.5", "ethers": "6.13.3", diff --git a/e2e/src/abi/L2MessageService.json b/e2e/src/abi/L2MessageService.json deleted file mode 100644 index 11bbeacd..00000000 --- a/e2e/src/abi/L2MessageService.json +++ /dev/null @@ -1,1107 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "FeePaymentFailed", - "type": "error" - }, - { - "inputs": [], - "name": "FeeTooLow", - "type": "error" - }, - { - "inputs": [], - "name": "FinalRollingHashIsZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "IsNotPaused", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "IsPaused", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "found", - "type": "uint256" - } - ], - "name": "L1MessageNumberSynchronizationWrong", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "expected", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "found", - "type": "bytes32" - } - ], - "name": "L1RollingHashSynchronizationWrong", - "type": "error" - }, - { - "inputs": [], - "name": "LimitIsZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDoesNotExistOrHasAlreadyBeenClaimed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "MessageHashesListLengthHigherThanOneHundred", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "destination", - "type": "address" - } - ], - "name": "MessageSendingFailed", - "type": "error" - }, - { - "inputs": [], - "name": "PeriodIsZero", - "type": "error" - }, - { - "inputs": [], - "name": "RateLimitExceeded", - "type": "error" - }, - { - "inputs": [], - "name": "ServiceHasMigratedToRollingHashes", - "type": "error" - }, - { - "inputs": [], - "name": "ValueSentTooLow", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddressNotAllowed", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "resettingAddress", - "type": "address" - } - ], - "name": "AmountUsedInPeriodReset", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "L1L2MessageHashesAddedToInbox", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "amountChangeBy", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "amountUsedLoweredToLimit", - "type": "bool" - }, - { - "indexed": false, - "internalType": "bool", - "name": "usedAmountResetToZero", - "type": "bool" - } - ], - "name": "LimitAmountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "_messageHash", - "type": "bytes32" - } - ], - "name": "MessageClaimed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "_messageHash", - "type": "bytes32" - } - ], - "name": "MessageSent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "previousMinimumFee", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newMinimumFee", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "calledBy", - "type": "address" - } - ], - "name": "MinimumFeeChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "messageSender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "periodInSeconds", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "limitInWei", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "currentPeriodEnd", - "type": "uint256" - } - ], - "name": "RateLimitInitialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "rollingHash", - "type": "bytes32" - } - ], - "name": "RollingHashUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "ServiceVersionMigrated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "messageSender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "UnPaused", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENERAL_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INBOX_STATUS_CLAIMED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INBOX_STATUS_RECEIVED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INBOX_STATUS_UNKNOWN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L1_L2_MESSAGE_SETTER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L1_L2_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L2_L1_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MINIMUM_FEE_SETTER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVING_SYSTEM_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RATE_LIMIT_SETTER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_messageHashes", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "_startingMessageNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_finalMessageNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "_finalRollingHash", - "type": "bytes32" - } - ], - "name": "anchorL1L2MessageHashes", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, - { - "internalType": "address payable", - "name": "_feeRecipient", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "name": "claimMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "currentPeriodAmountInWei", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentPeriodEnd", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "inboxL1L2MessageStatus", - "outputs": [ - { - "internalType": "uint256", - "name": "messageStatus", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_securityCouncil", - "type": "address" - }, - { - "internalType": "address", - "name": "_l1l2MessageSetter", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_rateLimitPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_rateLimitAmount", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_pauseType", - "type": "uint8" - } - ], - "name": "isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - } - ], - "name": "l1RollingHashes", - "outputs": [ - { - "internalType": "bytes32", - "name": "rollingHash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastAnchoredL1MessageNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "limitInWei", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "minimumFeeInWei", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nextMessageNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_pauseType", - "type": "uint8" - } - ], - "name": "pauseByType", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "pauseType", - "type": "bytes32" - } - ], - "name": "pauseTypeStatuses", - "outputs": [ - { - "internalType": "bool", - "name": "pauseStatus", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodInSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "resetAmountUsedInPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "resetRateLimitAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "sender", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_feeInWei", - "type": "uint256" - } - ], - "name": "setMinimumFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_pauseType", - "type": "uint8" - } - ], - "name": "unPauseByType", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6127f480620000f36000396000f3fe6080604052600436106102a05760003560e01c806391d148541161016e578063bc61e733116100cb578063cc5782f61161007f578063d84f91e811610064578063d84f91e81461074e578063e196fb5d14610782578063eb990c59146107a257600080fd5b8063cc5782f6146106fe578063d547741f1461072e57600080fd5b8063bf3e7505116100b0578063bf3e75051461069e578063c0729ab1146106d2578063c1dc0f07146106e857600080fd5b8063bc61e7331461063b578063bcbd6fcd1461066a57600080fd5b8063abd6230d11610122578063aea4f74511610107578063aea4f745146105fa578063b4a5a4b71461060f578063b837dbe91461062457600080fd5b8063abd6230d146105cf578063ad422ff0146105e457600080fd5b80639340a1d1116101535780639340a1d1146105905780639f3ce55a146105a7578063a217fddf146105ba57600080fd5b806391d148541461053d57806391f7b9011461033757600080fd5b806348922ab71161021c5780636a637967116101d05780637d1e8c55116101b55780637d1e8c55146104e35780637fe335d3146104f8578063899458831461052657600080fd5b80636a6379671461040e57806374377a34146104af57600080fd5b8063557eac7311610201578063557eac7314610443578063587944561461046357806367e404ce1461047957600080fd5b806348922ab71461040e578063491e09361461042357600080fd5b8063182a7506116102735780632f2ff15d116102585780632f2ff15d146103ae57806336568abe146103ce5780633c362146146103ee57600080fd5b8063182a75061461035e578063248a9ca31461037e57600080fd5b806301ffc9a7146102a55780630f6893ca146102da5780631065a3991461031557806311314d0f14610337575b600080fd5b3480156102b157600080fd5b506102c56102c0366004612180565b6107c2565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506103076102f53660046121c2565b60b06020526000908152604090205481565b6040519081526020016102d1565b34801561032157600080fd5b506103356103303660046121db565b61085b565b005b34801561034357600080fd5b5061034c600281565b60405160ff90911681526020016102d1565b34801561036a57600080fd5b506103356103793660046121c2565b610933565b34801561038a57600080fd5b506103076103993660046121c2565b60009081526065602052604090206001015490565b3480156103ba57600080fd5b506103356103c9366004612220565b6109a6565b3480156103da57600080fd5b506103356103e9366004612220565b6109d0565b3480156103fa57600080fd5b50610335610409366004612250565b610a83565b34801561041a57600080fd5b5061034c600181565b34801561042f57600080fd5b5061033561043e366004612324565b610d45565b34801561044f57600080fd5b5061033561045e3660046121c2565b611072565b34801561046f57600080fd5b5061030760995481565b34801561048557600080fd5b506101155460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b3480156104bb57600080fd5b506103077f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd6741581565b3480156104ef57600080fd5b5061034c600081565b34801561050457600080fd5b506103076105133660046121c2565b6101196020526000908152604090205481565b34801561053257600080fd5b506103076101175481565b34801561054957600080fd5b506102c5610558366004612220565b600091825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561059c57600080fd5b506103076101185481565b6103356105b53660046123ba565b61113a565b3480156105c657600080fd5b50610307600081565b3480156105db57600080fd5b5061034c600381565b3480156105f057600080fd5b5061030760985481565b34801561060657600080fd5b50610335611385565b34801561061b57600080fd5b5061034c600481565b34801561063057600080fd5b506103076101165481565b34801561064757600080fd5b506102c56106563660046121db565b60a654600160ff9092169190911b16151590565b34801561067657600080fd5b506103077fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba281565b3480156106aa57600080fd5b506103077f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b3480156106de57600080fd5b50610307609a5481565b3480156106f457600080fd5b5061030760975481565b34801561070a57600080fd5b506102c56107193660046121c2565b60a56020526000908152604090205460ff1681565b34801561073a57600080fd5b50610335610749366004612220565b6113e1565b34801561075a57600080fd5b506103077f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b34801561078e57600080fd5b5061033561079d3660046121db565b611406565b3480156107ae57600080fd5b506103356107bd366004612416565b6114b1565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061085557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26610885816117c2565b60a654600160ff84161b166108d0576040517fb015579f00000000000000000000000000000000000000000000000000000000815260ff831660048201526024015b60405180910390fd5b60a68054600160ff851690811b199091169091557fef04ba2036ccaeab3a59717b51d2b9146b0b0904077177f1148a5418bf1eae23335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba261095d816117c2565b610117805490839055604080518281526020810185905233917f6d8040017e56a6d91bb242def14af5d7eae1eaff7475e45c678dac5d49d35498910160405180910390a2505050565b6000828152606560205260409020600101546109c1816117c2565b6109cb83836117cf565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610a75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016108c7565b610a7f82826118c3565b5050565b6001610a8e8161197e565b7f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd67415610ab8816117c2565b856064811115610af7576040517f3b174434000000000000000000000000000000000000000000000000000000008152600481018290526024016108c7565b6000849003610b32576040517f36a4bb9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101185480610b4260018961248b565b14610b8f57610b5260018861248b565b6040517fd39e75f90000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016108c7565b6000818152610119602052604081205490805b84811015610c27578b8b82818110610bbc57610bbc61249e565b905060200201359150600060ff1660b060008481526020019081526020016000205403610c1757600082815260b06020526040902060019055610c09838360009182526020526040902090565b9250610c14846124cd565b93505b610c20816124cd565b9050610ba2565b50878314610c6b576040517fd39e75f900000000000000000000000000000000000000000000000000000000815260048101899052602481018490526044016108c7565b818714610cae576040517f7557a60a00000000000000000000000000000000000000000000000000000000815260048101889052602481018390526044016108c7565b610118548314610d38576101188390556000838152610119602052604090819020839055517f9995fb3da0c2de4012f2b814b6fc29ce7507571dcb20b8d0bd38621a842df1eb90610d02908d908d90612505565b60405180910390a1604051829084907f99b65a4301b38c09fb6a5f27052d73e8372bbe8f6779d678bfe8a41b66cce7ac90600090a35b5050505050505050505050565b610d4d6119c5565b858784848760005a9050610d616002611a38565b60008e8e8e8e8b8e8e604051602001610d8097969594939291906125a0565b604051602081830303815290604052805190602001209050610da181611abe565b8e61011560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d604051610e0e9291906125f9565b60006040518083038185875af1925050503d8060008114610e4b576040519150601f19603f3d011682016040523d82523d6000602084013e610e50565b606091505b509150915081610eba57805115610e6a5780518082602001fd5b8f6040517f546134430000000000000000000000000000000000000000000000000000000081526004016108c7919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b61011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd1517905560405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e90600090a250508615905061105857856000849003610fa457853b158015610fa2573a5a610f3f61ae3486612609565b610f49919061248b565b610f53919061261c565b915081881115610f9e5773ffffffffffffffffffffffffffffffffffffffff87166108fc610f81848b61248b565b6040518115909202916000818181858888f1935050505050610fa2565b8791505b505b600073ffffffffffffffffffffffffffffffffffffffff841615610fc85783610fca565b335b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050905080611054576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016108c7565b5050505b505050505050611068600160b155565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261109c816117c2565b60008060004260995410156110c3576097546110b89042612609565b6099555060016110d5565b609a548510156110d557849250600191505b609885905580806110e35750815b156110ee57609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b6111446003611a38565b73ffffffffffffffffffffffffffffffffffffffff8416611191576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b348311156111cb576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101175480841015611209576040517f732f941300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611216838761248b565b9150611222863461248b565b61011680549192506000919082611238836124cd565b90915550905061125061124b8484612609565b611b1d565b600033898585858b8b60405160200161126f97969594939291906125a0565b604051602081830303815290604052805190602001209050808973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8787878d8d6040516112ed959493929190612633565b60405180910390a4604051600090419087908381818185875af1925050503d8060008114611337576040519150601f19603f3d011682016040523d82523d6000602084013e61133c565b606091505b5050905080611379576040517fa57c4df40000000000000000000000000000000000000000000000000000000081524160048201526024016108c7565b50505050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d826113af816117c2565b6000609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b6000828152606560205260409020600101546113fc816117c2565b6109cb83836118c3565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26611430816117c2565b60a654600160ff84161b1615611477576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff831660048201526024016108c7565b60a68054600160ff851690811b9091179091557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d33610907565b600054610100900460ff16158080156114d15750600054600160ff909116105b806114eb5750303b1580156114eb575060005460ff166001145b611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108c7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156115d557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8516611622576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661166f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611677611b93565b61167f611b93565b611687611b93565b6116918383611c2c565b61169a84611d9c565b6001610116556116ab6000866117cf565b6116d57fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba2866117cf565b6116ff7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82866117cf565b6117297f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26866117cf565b61011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd1517905580156117bb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6117cc8133611e5d565b50565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610a7f57600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118653390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610a7f57600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60a654600160ff83161b16156117cc576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff821660048201526024016108c7565b600260b15403611a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c7565b600260b155565b60a654600160ff83161b811615611a80576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff831660048201526024016108c7565b6002811615610a7f576040517fdb246dde000000000000000000000000000000000000000000000000000000008152600160048201526024016108c7565b600081815260b06020526040902054600114611b09576040517f992d87c3000000000000000000000000000000000000000000000000000000008152600481018290526024016108c7565b600090815260b06020526040902060029055565b6000426099541015611b4057609754611b369042612609565b6099555080611b51565b81609a54611b4e9190612609565b90505b609854811115611b8d576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a5550565b600054610100900460ff16611c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c7565b565b600054610100900460ff16611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c7565b81600003611cfd576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611d37576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055611d4b8242612609565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b600054610100900460ff16611e33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c7565b6117cc7f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd67415826117cf565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610a7f57611e9d81611f17565b611ea8836020611f36565b604051602001611eb9929190612688565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526108c791600401612709565b606061085573ffffffffffffffffffffffffffffffffffffffff831660145b60606000611f4583600261261c565b611f50906002612609565b67ffffffffffffffff811115611f6857611f6861275a565b6040519080825280601f01601f191660200182016040528015611f92576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611fc957611fc961249e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061202c5761202c61249e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061206884600261261c565b612073906001612609565b90505b6001811115612110577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106120b4576120b461249e565b1a60f81b8282815181106120ca576120ca61249e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361210981612789565b9050612076565b508315612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c7565b9392505050565b60006020828403121561219257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461217957600080fd5b6000602082840312156121d457600080fd5b5035919050565b6000602082840312156121ed57600080fd5b813560ff8116811461217957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146117cc57600080fd5b6000806040838503121561223357600080fd5b823591506020830135612245816121fe565b809150509250929050565b60008060008060006080868803121561226857600080fd5b853567ffffffffffffffff8082111561228057600080fd5b818801915088601f83011261229457600080fd5b8135818111156122a357600080fd5b8960208260051b85010111156122b857600080fd5b60209283019a909950918801359760408101359750606001359550909350505050565b60008083601f8401126122ed57600080fd5b50813567ffffffffffffffff81111561230557600080fd5b60208301915083602082850101111561231d57600080fd5b9250929050565b60008060008060008060008060e0898b03121561234057600080fd5b883561234b816121fe565b9750602089013561235b816121fe565b965060408901359550606089013594506080890135612379816121fe565b935060a089013567ffffffffffffffff81111561239557600080fd5b6123a18b828c016122db565b999c989b50969995989497949560c00135949350505050565b600080600080606085870312156123d057600080fd5b84356123db816121fe565b935060208501359250604085013567ffffffffffffffff8111156123fe57600080fd5b61240a878288016122db565b95989497509550505050565b6000806000806080858703121561242c57600080fd5b8435612437816121fe565b93506020850135612447816121fe565b93969395505050506040820135916060013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108555761085561245c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124fe576124fe61245c565b5060010190565b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561253e57600080fd5b8260051b80856040850137919091016040019392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525086604083015285606083015284608083015260c060a08301526125ec60c083018486612557565b9998505050505050505050565b8183823760009101908152919050565b808201808211156108555761085561245c565b80820281158282048414176108555761085561245c565b858152846020820152836040820152608060608201526000612659608083018486612557565b979650505050505050565b60005b8381101561267f578181015183820152602001612667565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516126c0816017850160208801612664565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516126fd816028840160208801612664565b01602801949350505050565b6020815260008251806020840152612728816040850160208701612664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000816127985761279861245c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122017cf86a9c68413ebd5a3989438a1b8e0790020c1619afa2937bc73ce4abda97964736f6c63430008130033", - "deployedBytecode": "0x6080604052600436106102a05760003560e01c806391d148541161016e578063bc61e733116100cb578063cc5782f61161007f578063d84f91e811610064578063d84f91e81461074e578063e196fb5d14610782578063eb990c59146107a257600080fd5b8063cc5782f6146106fe578063d547741f1461072e57600080fd5b8063bf3e7505116100b0578063bf3e75051461069e578063c0729ab1146106d2578063c1dc0f07146106e857600080fd5b8063bc61e7331461063b578063bcbd6fcd1461066a57600080fd5b8063abd6230d11610122578063aea4f74511610107578063aea4f745146105fa578063b4a5a4b71461060f578063b837dbe91461062457600080fd5b8063abd6230d146105cf578063ad422ff0146105e457600080fd5b80639340a1d1116101535780639340a1d1146105905780639f3ce55a146105a7578063a217fddf146105ba57600080fd5b806391d148541461053d57806391f7b9011461033757600080fd5b806348922ab71161021c5780636a637967116101d05780637d1e8c55116101b55780637d1e8c55146104e35780637fe335d3146104f8578063899458831461052657600080fd5b80636a6379671461040e57806374377a34146104af57600080fd5b8063557eac7311610201578063557eac7314610443578063587944561461046357806367e404ce1461047957600080fd5b806348922ab71461040e578063491e09361461042357600080fd5b8063182a7506116102735780632f2ff15d116102585780632f2ff15d146103ae57806336568abe146103ce5780633c362146146103ee57600080fd5b8063182a75061461035e578063248a9ca31461037e57600080fd5b806301ffc9a7146102a55780630f6893ca146102da5780631065a3991461031557806311314d0f14610337575b600080fd5b3480156102b157600080fd5b506102c56102c0366004612180565b6107c2565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506103076102f53660046121c2565b60b06020526000908152604090205481565b6040519081526020016102d1565b34801561032157600080fd5b506103356103303660046121db565b61085b565b005b34801561034357600080fd5b5061034c600281565b60405160ff90911681526020016102d1565b34801561036a57600080fd5b506103356103793660046121c2565b610933565b34801561038a57600080fd5b506103076103993660046121c2565b60009081526065602052604090206001015490565b3480156103ba57600080fd5b506103356103c9366004612220565b6109a6565b3480156103da57600080fd5b506103356103e9366004612220565b6109d0565b3480156103fa57600080fd5b50610335610409366004612250565b610a83565b34801561041a57600080fd5b5061034c600181565b34801561042f57600080fd5b5061033561043e366004612324565b610d45565b34801561044f57600080fd5b5061033561045e3660046121c2565b611072565b34801561046f57600080fd5b5061030760995481565b34801561048557600080fd5b506101155460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d1565b3480156104bb57600080fd5b506103077f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd6741581565b3480156104ef57600080fd5b5061034c600081565b34801561050457600080fd5b506103076105133660046121c2565b6101196020526000908152604090205481565b34801561053257600080fd5b506103076101175481565b34801561054957600080fd5b506102c5610558366004612220565b600091825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561059c57600080fd5b506103076101185481565b6103356105b53660046123ba565b61113a565b3480156105c657600080fd5b50610307600081565b3480156105db57600080fd5b5061034c600381565b3480156105f057600080fd5b5061030760985481565b34801561060657600080fd5b50610335611385565b34801561061b57600080fd5b5061034c600481565b34801561063057600080fd5b506103076101165481565b34801561064757600080fd5b506102c56106563660046121db565b60a654600160ff9092169190911b16151590565b34801561067657600080fd5b506103077fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba281565b3480156106aa57600080fd5b506103077f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8281565b3480156106de57600080fd5b50610307609a5481565b3480156106f457600080fd5b5061030760975481565b34801561070a57600080fd5b506102c56107193660046121c2565b60a56020526000908152604090205460ff1681565b34801561073a57600080fd5b50610335610749366004612220565b6113e1565b34801561075a57600080fd5b506103077f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b34801561078e57600080fd5b5061033561079d3660046121db565b611406565b3480156107ae57600080fd5b506103356107bd366004612416565b6114b1565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061085557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26610885816117c2565b60a654600160ff84161b166108d0576040517fb015579f00000000000000000000000000000000000000000000000000000000815260ff831660048201526024015b60405180910390fd5b60a68054600160ff851690811b199091169091557fef04ba2036ccaeab3a59717b51d2b9146b0b0904077177f1148a5418bf1eae23335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25050565b7fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba261095d816117c2565b610117805490839055604080518281526020810185905233917f6d8040017e56a6d91bb242def14af5d7eae1eaff7475e45c678dac5d49d35498910160405180910390a2505050565b6000828152606560205260409020600101546109c1816117c2565b6109cb83836117cf565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610a75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016108c7565b610a7f82826118c3565b5050565b6001610a8e8161197e565b7f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd67415610ab8816117c2565b856064811115610af7576040517f3b174434000000000000000000000000000000000000000000000000000000008152600481018290526024016108c7565b6000849003610b32576040517f36a4bb9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101185480610b4260018961248b565b14610b8f57610b5260018861248b565b6040517fd39e75f90000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016108c7565b6000818152610119602052604081205490805b84811015610c27578b8b82818110610bbc57610bbc61249e565b905060200201359150600060ff1660b060008481526020019081526020016000205403610c1757600082815260b06020526040902060019055610c09838360009182526020526040902090565b9250610c14846124cd565b93505b610c20816124cd565b9050610ba2565b50878314610c6b576040517fd39e75f900000000000000000000000000000000000000000000000000000000815260048101899052602481018490526044016108c7565b818714610cae576040517f7557a60a00000000000000000000000000000000000000000000000000000000815260048101889052602481018390526044016108c7565b610118548314610d38576101188390556000838152610119602052604090819020839055517f9995fb3da0c2de4012f2b814b6fc29ce7507571dcb20b8d0bd38621a842df1eb90610d02908d908d90612505565b60405180910390a1604051829084907f99b65a4301b38c09fb6a5f27052d73e8372bbe8f6779d678bfe8a41b66cce7ac90600090a35b5050505050505050505050565b610d4d6119c5565b858784848760005a9050610d616002611a38565b60008e8e8e8e8b8e8e604051602001610d8097969594939291906125a0565b604051602081830303815290604052805190602001209050610da181611abe565b8e61011560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808f73ffffffffffffffffffffffffffffffffffffffff168e8d8d604051610e0e9291906125f9565b60006040518083038185875af1925050503d8060008114610e4b576040519150601f19603f3d011682016040523d82523d6000602084013e610e50565b606091505b509150915081610eba57805115610e6a5780518082602001fd5b8f6040517f546134430000000000000000000000000000000000000000000000000000000081526004016108c7919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b61011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd1517905560405183907fa4c827e719e911e8f19393ccdb85b5102f08f0910604d340ba38390b7ff2ab0e90600090a250508615905061105857856000849003610fa457853b158015610fa2573a5a610f3f61ae3486612609565b610f49919061248b565b610f53919061261c565b915081881115610f9e5773ffffffffffffffffffffffffffffffffffffffff87166108fc610f81848b61248b565b6040518115909202916000818181858888f1935050505050610fa2565b8791505b505b600073ffffffffffffffffffffffffffffffffffffffff841615610fc85783610fca565b335b905060008173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050905080611054576040517fa57c4df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016108c7565b5050505b505050505050611068600160b155565b5050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d8261109c816117c2565b60008060004260995410156110c3576097546110b89042612609565b6099555060016110d5565b609a548510156110d557849250600191505b609885905580806110e35750815b156110ee57609a8390555b60408051868152831515602082015282151581830152905133917fbc3dc0cb5c15c51c81316450d44048838bb478b9809447d01c766a06f3e9f2c8919081900360600190a25050505050565b6111446003611a38565b73ffffffffffffffffffffffffffffffffffffffff8416611191576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b348311156111cb576040517fb03b693200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101175480841015611209576040517f732f941300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611216838761248b565b9150611222863461248b565b61011680549192506000919082611238836124cd565b90915550905061125061124b8484612609565b611b1d565b600033898585858b8b60405160200161126f97969594939291906125a0565b604051602081830303815290604052805190602001209050808973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe856c2b8bd4eb0027ce32eeaf595c21b0b6b4644b326e5b7bd80a1cf8db72e6c8787878d8d6040516112ed959493929190612633565b60405180910390a4604051600090419087908381818185875af1925050503d8060008114611337576040519150601f19603f3d011682016040523d82523d6000602084013e61133c565b606091505b5050905080611379576040517fa57c4df40000000000000000000000000000000000000000000000000000000081524160048201526024016108c7565b50505050505050505050565b7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d826113af816117c2565b6000609a81905560405133917fba88c025b0cbb77022c0c487beef24f759f1e4be2f51a205bc427cee19c2eaa691a250565b6000828152606560205260409020600101546113fc816117c2565b6109cb83836118c3565b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26611430816117c2565b60a654600160ff84161b1615611477576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff831660048201526024016108c7565b60a68054600160ff851690811b9091179091557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d33610907565b600054610100900460ff16158080156114d15750600054600160ff909116105b806114eb5750303b1580156114eb575060005460ff166001145b611577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108c7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156115d557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8516611622576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661166f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611677611b93565b61167f611b93565b611687611b93565b6116918383611c2c565b61169a84611d9c565b6001610116556116ab6000866117cf565b6116d57fcc6ce8bb749b4b07d2f635ce95747506096d0737f9abf10cc8f4a14384603ba2866117cf565b6116ff7f1185e52d62bfbbea270e57d3d09733d221b53ab7a18bae82bb3c6c74bab16d82866117cf565b6117297f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a26866117cf565b61011580547fffffffffffffffffffffffff00000000000000000000000000000000000000001663075bcd1517905580156117bb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6117cc8133611e5d565b50565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610a7f57600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118653390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610a7f57600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60a654600160ff83161b16156117cc576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff821660048201526024016108c7565b600260b15403611a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c7565b600260b155565b60a654600160ff83161b811615611a80576040517fdb246dde00000000000000000000000000000000000000000000000000000000815260ff831660048201526024016108c7565b6002811615610a7f576040517fdb246dde000000000000000000000000000000000000000000000000000000008152600160048201526024016108c7565b600081815260b06020526040902054600114611b09576040517f992d87c3000000000000000000000000000000000000000000000000000000008152600481018290526024016108c7565b600090815260b06020526040902060029055565b6000426099541015611b4057609754611b369042612609565b6099555080611b51565b81609a54611b4e9190612609565b90505b609854811115611b8d576040517fa74c1c5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609a5550565b600054610100900460ff16611c2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c7565b565b600054610100900460ff16611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c7565b81600003611cfd576040517fb5ed5a3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611d37576040517fd10d72bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60978290556098819055611d4b8242612609565b60998190556097546098546040805192835260208301919091528101919091527f8f805c372b66240792580418b7328c0c554ae235f0932475c51b026887fe26a99060600160405180910390a15050565b600054610100900460ff16611e33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c7565b6117cc7f4705265620026983c754c5288b65446d794a03174326ec6d7c0b5c7f1fd67415826117cf565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610a7f57611e9d81611f17565b611ea8836020611f36565b604051602001611eb9929190612688565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526108c791600401612709565b606061085573ffffffffffffffffffffffffffffffffffffffff831660145b60606000611f4583600261261c565b611f50906002612609565b67ffffffffffffffff811115611f6857611f6861275a565b6040519080825280601f01601f191660200182016040528015611f92576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611fc957611fc961249e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061202c5761202c61249e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061206884600261261c565b612073906001612609565b90505b6001811115612110577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106120b4576120b461249e565b1a60f81b8282815181106120ca576120ca61249e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361210981612789565b9050612076565b508315612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c7565b9392505050565b60006020828403121561219257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461217957600080fd5b6000602082840312156121d457600080fd5b5035919050565b6000602082840312156121ed57600080fd5b813560ff8116811461217957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146117cc57600080fd5b6000806040838503121561223357600080fd5b823591506020830135612245816121fe565b809150509250929050565b60008060008060006080868803121561226857600080fd5b853567ffffffffffffffff8082111561228057600080fd5b818801915088601f83011261229457600080fd5b8135818111156122a357600080fd5b8960208260051b85010111156122b857600080fd5b60209283019a909950918801359760408101359750606001359550909350505050565b60008083601f8401126122ed57600080fd5b50813567ffffffffffffffff81111561230557600080fd5b60208301915083602082850101111561231d57600080fd5b9250929050565b60008060008060008060008060e0898b03121561234057600080fd5b883561234b816121fe565b9750602089013561235b816121fe565b965060408901359550606089013594506080890135612379816121fe565b935060a089013567ffffffffffffffff81111561239557600080fd5b6123a18b828c016122db565b999c989b50969995989497949560c00135949350505050565b600080600080606085870312156123d057600080fd5b84356123db816121fe565b935060208501359250604085013567ffffffffffffffff8111156123fe57600080fd5b61240a878288016122db565b95989497509550505050565b6000806000806080858703121561242c57600080fd5b8435612437816121fe565b93506020850135612447816121fe565b93969395505050506040820135916060013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108555761085561245c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124fe576124fe61245c565b5060010190565b6020815281602082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561253e57600080fd5b8260051b80856040850137919091016040019392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401525086604083015285606083015284608083015260c060a08301526125ec60c083018486612557565b9998505050505050505050565b8183823760009101908152919050565b808201808211156108555761085561245c565b80820281158282048414176108555761085561245c565b858152846020820152836040820152608060608201526000612659608083018486612557565b979650505050505050565b60005b8381101561267f578181015183820152602001612667565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516126c0816017850160208801612664565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516126fd816028840160208801612664565b01602801949350505050565b6020815260008251806020840152612728816040850160208701612664565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000816127985761279861245c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122017cf86a9c68413ebd5a3989438a1b8e0790020c1619afa2937bc73ce4abda97964736f6c63430008130033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/e2e/src/abi/LineaRollup.json b/e2e/src/abi/LineaRollup.json deleted file mode 100644 index 5cd05a24..00000000 --- a/e2e/src/abi/LineaRollup.json +++ /dev/null @@ -1,2356 +0,0 @@ -{ - "abi": [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "BlobSubmissionDataIsMissing", - "type": "error" - }, - { - "inputs": [], - "name": "BytesLengthNotMultipleOf32", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "bytesLength", - "type": "uint256" - } - ], - "name": "BytesLengthNotMultipleOfTwo", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "currentDataHash", - "type": "bytes32" - } - ], - "name": "DataAlreadySubmitted", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "actual", - "type": "uint256" - } - ], - "name": "DataStartingBlockDoesNotMatch", - "type": "error" - }, - { - "inputs": [], - "name": "EmptyBlobData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "EmptyBlobDataAtIndex", - "type": "error" - }, - { - "inputs": [], - "name": "EmptySubmissionData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "FeePaymentFailed", - "type": "error" - }, - { - "inputs": [], - "name": "FeeTooLow", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "actual", - "type": "uint256" - } - ], - "name": "FinalBlockDoesNotMatchShnarfFinalBlock", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "finalBlockNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "lastFinalizedBlock", - "type": "uint256" - } - ], - "name": "FinalBlockNumberLessThanOrEqualToLastFinalizedBlock", - "type": "error" - }, - { - "inputs": [], - "name": "FinalBlockStateEqualsZeroHash", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "expected", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "value", - "type": "bytes32" - } - ], - "name": "FinalShnarfWrong", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "l2BlockTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentBlockTimestamp", - "type": "uint256" - } - ], - "name": "FinalizationInTheFuture", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "expected", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "value", - "type": "bytes32" - } - ], - "name": "FinalizationStateIncorrect", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "firstBlockNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalBlockNumber", - "type": "uint256" - } - ], - "name": "FirstBlockGreaterThanFinalBlock", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "firstBlockNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "lastFinalizedBlock", - "type": "uint256" - } - ], - "name": "FirstBlockLessThanOrEqualToLastFinalizedBlock", - "type": "error" - }, - { - "inputs": [], - "name": "FirstByteIsNotZero", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidMerkleProof", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidProof", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidProofType", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "IsNotPaused", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "IsPaused", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "rollingHash", - "type": "bytes32" - } - ], - "name": "L1RollingHashDoesNotExistOnL1", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "merkleRoot", - "type": "bytes32" - } - ], - "name": "L2MerkleRootAlreadyAnchored", - "type": "error" - }, - { - "inputs": [], - "name": "L2MerkleRootDoesNotExist", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "expected", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "actual", - "type": "bytes32" - } - ], - "name": "LastFinalizedShnarfWrong", - "type": "error" - }, - { - "inputs": [], - "name": "LimitIsZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageIndex", - "type": "uint256" - } - ], - "name": "MessageAlreadyClaimed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "MessageDoesNotExistOrHasAlreadyBeenClaimed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "destination", - "type": "address" - } - ], - "name": "MessageSendingFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "rollingHash", - "type": "bytes32" - } - ], - "name": "MissingMessageNumberForRollingHash", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - } - ], - "name": "MissingRollingHashForMessageNumber", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "expected", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "actual", - "type": "bytes32" - } - ], - "name": "ParentStateRootHashInvalid", - "type": "error" - }, - { - "inputs": [], - "name": "PeriodIsZero", - "type": "error" - }, - { - "inputs": [], - "name": "PointEvaluationFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "fieldElements", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "blsCurveModulus", - "type": "uint256" - } - ], - "name": "PointEvaluationResponseInvalid", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "actual", - "type": "uint256" - } - ], - "name": "PrecompileReturnDataLengthWrong", - "type": "error" - }, - { - "inputs": [], - "name": "ProofIsEmpty", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "actual", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - } - ], - "name": "ProofLengthDifferentThanMerkleDepth", - "type": "error" - }, - { - "inputs": [], - "name": "RateLimitExceeded", - "type": "error" - }, - { - "inputs": [], - "name": "ReentrantCall", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shnarfsLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalBlockNumbers", - "type": "uint256" - } - ], - "name": "ShnarfAndFinalBlockNumberLengthsMismatched", - "type": "error" - }, - { - "inputs": [], - "name": "SnarkHashIsZeroHash", - "type": "error" - }, - { - "inputs": [], - "name": "StartingRootHashDoesNotMatch", - "type": "error" - }, - { - "inputs": [], - "name": "ValueSentTooLow", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddressNotAllowed", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "resettingAddress", - "type": "address" - } - ], - "name": "AmountUsedInPeriodReset", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "stateRootHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bool", - "name": "finalizedWithProof", - "type": "bool" - } - ], - "name": "BlockFinalized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "lastBlockFinalized", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "startingRootHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "finalRootHash", - "type": "bytes32" - } - ], - "name": "BlocksVerificationDone", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "lastBlockFinalized", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "startingRootHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "finalRootHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "bool", - "name": "withProof", - "type": "bool" - } - ], - "name": "DataFinalized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "shnarf", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "endBlock", - "type": "uint256" - } - ], - "name": "DataSubmittedV2", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32[]", - "name": "messageHashes", - "type": "bytes32[]" - } - ], - "name": "L1L2MessagesReceivedOnL2", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "L2L1MessageHashAddedToInbox", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "l2MerkleRoot", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "treeDepth", - "type": "uint256" - } - ], - "name": "L2MerkleRootAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "l2Block", - "type": "uint256" - } - ], - "name": "L2MessagingBlockAnchored", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "amountChangeBy", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "amountUsedLoweredToLimit", - "type": "bool" - }, - { - "indexed": false, - "internalType": "bool", - "name": "usedAmountResetToZero", - "type": "bool" - } - ], - "name": "LimitAmountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "_messageHash", - "type": "bytes32" - } - ], - "name": "MessageClaimed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "_messageHash", - "type": "bytes32" - } - ], - "name": "MessageSent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "messageSender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "periodInSeconds", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "limitInWei", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "currentPeriodEnd", - "type": "uint256" - } - ], - "name": "RateLimitInitialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "rollingHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "RollingHashUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "systemMigrationBlock", - "type": "uint256" - } - ], - "name": "SystemMigrationBlockInitialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "messageSender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "pauseType", - "type": "uint256" - } - ], - "name": "UnPaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "verifierAddress", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "proofType", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "verifierSetBy", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "oldVerifierAddress", - "type": "address" - } - ], - "name": "VerifierAddressChanged", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENERAL_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_SHNARF", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INBOX_STATUS_RECEIVED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INBOX_STATUS_UNKNOWN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L1_L2_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L2_L1_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "OPERATOR_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "OUTBOX_STATUS_RECEIVED", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "OUTBOX_STATUS_SENT", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "OUTBOX_STATUS_UNKNOWN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROVING_SYSTEM_PAUSE_TYPE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RATE_LIMIT_SETTER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "VERIFIER_SETTER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, - { - "internalType": "address payable", - "name": "_feeRecipient", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "name": "claimMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32[]", - "name": "proof", - "type": "bytes32[]" - }, - { - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - }, - { - "internalType": "uint32", - "name": "leafIndex", - "type": "uint32" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "fee", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "address payable", - "name": "feeRecipient", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "merkleRoot", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct IL1MessageService.ClaimMessageWithProofParams", - "name": "_params", - "type": "tuple" - } - ], - "name": "claimMessageWithProof", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "currentFinalizedShnarf", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentFinalizedState", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentL2BlockNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentL2StoredL1MessageNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentL2StoredL1RollingHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentPeriodAmountInWei", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentPeriodEnd", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - } - ], - "name": "dataEndingBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "endingBlock", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - } - ], - "name": "dataFinalStateRootHashes", - "outputs": [ - { - "internalType": "bytes32", - "name": "finalStateRootHash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - } - ], - "name": "dataParents", - "outputs": [ - { - "internalType": "bytes32", - "name": "parentHash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - } - ], - "name": "dataShnarfHashes", - "outputs": [ - { - "internalType": "bytes32", - "name": "shnarfHash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - } - ], - "name": "dataStartingBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "startingBlock", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_aggregatedProof", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "_proofType", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "parentStateRootHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "lastFinalizedShnarf", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "finalBlockInData", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "parentShnarf", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "snarkHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "finalStateRootHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "dataEvaluationPoint", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "dataEvaluationClaim", - "type": "bytes32" - } - ], - "internalType": "struct ILineaRollup.ShnarfData", - "name": "shnarfData", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "lastFinalizedTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalTimestamp", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "lastFinalizedL1RollingHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "l1RollingHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "lastFinalizedL1RollingHashMessageNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "l1RollingHashMessageNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "l2MerkleTreesDepth", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "l2MerkleRoots", - "type": "bytes32[]" - }, - { - "internalType": "bytes", - "name": "l2MessagingBlocksOffsets", - "type": "bytes" - } - ], - "internalType": "struct ILineaRollup.FinalizationDataV2", - "name": "_finalizationData", - "type": "tuple" - } - ], - "name": "finalizeBlocksWithProof", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "parentStateRootHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "lastFinalizedShnarf", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "finalBlockInData", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "parentShnarf", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "snarkHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "finalStateRootHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "dataEvaluationPoint", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "dataEvaluationClaim", - "type": "bytes32" - } - ], - "internalType": "struct ILineaRollup.ShnarfData", - "name": "shnarfData", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "lastFinalizedTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalTimestamp", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "lastFinalizedL1RollingHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "l1RollingHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "lastFinalizedL1RollingHashMessageNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "l1RollingHashMessageNumber", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "l2MerkleTreesDepth", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "l2MerkleRoots", - "type": "bytes32[]" - }, - { - "internalType": "bytes", - "name": "l2MessagingBlocksOffsets", - "type": "bytes" - } - ], - "internalType": "struct ILineaRollup.FinalizationDataV2", - "name": "_finalizationData", - "type": "tuple" - } - ], - "name": "finalizeBlocksWithoutProof", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "inboxL2L1MessageStatus", - "outputs": [ - { - "internalType": "uint256", - "name": "messageStatus", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_initialStateRootHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "_initialL2BlockNumber", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_defaultVerifier", - "type": "address" - }, - { - "internalType": "address", - "name": "_securityCouncil", - "type": "address" - }, - { - "internalType": "address[]", - "name": "_operators", - "type": "address[]" - }, - { - "internalType": "uint256", - "name": "_rateLimitPeriodInSeconds", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_rateLimitAmountInWei", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_genesisTimestamp", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "_shnarfs", - "type": "bytes32[]" - }, - { - "internalType": "uint256[]", - "name": "_finalBlockNumbers", - "type": "uint256[]" - } - ], - "name": "initializeParentShnarfsAndFinalizedState", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_messageNumber", - "type": "uint256" - } - ], - "name": "isMessageClaimed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_pauseType", - "type": "uint8" - } - ], - "name": "isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "merkleRoot", - "type": "bytes32" - } - ], - "name": "l2MerkleRootsDepths", - "outputs": [ - { - "internalType": "uint256", - "name": "treeDepth", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "limitInWei", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nextMessageNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "messageHash", - "type": "bytes32" - } - ], - "name": "outboxL1L2MessageStatus", - "outputs": [ - { - "internalType": "uint256", - "name": "messageStatus", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_pauseType", - "type": "uint8" - } - ], - "name": "pauseByType", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "pauseType", - "type": "bytes32" - } - ], - "name": "pauseTypeStatuses", - "outputs": [ - { - "internalType": "bool", - "name": "pauseStatus", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodInSeconds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "resetAmountUsedInPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "resetRateLimitAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "messageNumber", - "type": "uint256" - } - ], - "name": "rollingHashes", - "outputs": [ - { - "internalType": "bytes32", - "name": "rollingHash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_fee", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" - } - ], - "name": "sendMessage", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "sender", - "outputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newVerifierAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_proofType", - "type": "uint256" - } - ], - "name": "setVerifierAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "shnarf", - "type": "bytes32" - } - ], - "name": "shnarfFinalBlockNumbers", - "outputs": [ - { - "internalType": "uint256", - "name": "finalBlockNumber", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "stateRootHashes", - "outputs": [ - { - "internalType": "bytes32", - "name": "stateRootHash", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "finalStateRootHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "firstBlockInData", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalBlockInData", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "snarkHash", - "type": "bytes32" - } - ], - "internalType": "struct ILineaRollup.SupportingSubmissionDataV2", - "name": "submissionData", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "dataEvaluationClaim", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "kzgCommitment", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "kzgProof", - "type": "bytes" - } - ], - "internalType": "struct ILineaRollup.BlobSubmissionData[]", - "name": "_blobSubmissionData", - "type": "tuple[]" - }, - { - "internalType": "bytes32", - "name": "_parentShnarf", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_finalBlobShnarf", - "type": "bytes32" - } - ], - "name": "submitBlobs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "finalStateRootHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "firstBlockInData", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalBlockInData", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "snarkHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "compressedData", - "type": "bytes" - } - ], - "internalType": "struct ILineaRollup.SubmissionDataV2", - "name": "_submissionData", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "_parentShnarf", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "_expectedShnarf", - "type": "bytes32" - } - ], - "name": "submitDataAsCalldata", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "systemMigrationBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "_pauseType", - "type": "uint8" - } - ], - "name": "unPauseByType", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_proofType", - "type": "uint256" - } - ], - "name": "unsetVerifierAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proofType", - "type": "uint256" - } - ], - "name": "verifiers", - "outputs": [ - { - "internalType": "address", - "name": "verifierAddress", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ] -} \ No newline at end of file diff --git a/e2e/src/abi/ProxyAdmin.json b/e2e/src/abi/ProxyAdmin.json deleted file mode 100644 index b6e181e2..00000000 --- a/e2e/src/abi/ProxyAdmin.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "contractName": "ProxyAdmin", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "contract ITransparentUpgradeableProxy", - "name": "proxy", - "type": "address" - }, - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "changeProxyAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ITransparentUpgradeableProxy", - "name": "proxy", - "type": "address" - } - ], - "name": "getProxyAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ITransparentUpgradeableProxy", - "name": "proxy", - "type": "address" - } - ], - "name": "getProxyImplementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ITransparentUpgradeableProxy", - "name": "proxy", - "type": "address" - }, - { - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "upgrade", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ITransparentUpgradeableProxy", - "name": "proxy", - "type": "address" - }, - { - "internalType": "address", - "name": "implementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61069a8061007e6000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212207ad53e1008cce369999f6b5f2f77109510b404ff1de9b47b639981fd68e6239264736f6c63430008090033", - "deployedBytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212207ad53e1008cce369999f6b5f2f77109510b404ff1de9b47b639981fd68e6239264736f6c63430008090033", - "linkReferences": {}, - "deployedLinkReferences": {} - } \ No newline at end of file diff --git a/e2e/src/abi/TestPlonkVerifierForDataAggregation.json b/e2e/src/abi/TestPlonkVerifierForDataAggregation.json deleted file mode 100644 index 8c0111f9..00000000 --- a/e2e/src/abi/TestPlonkVerifierForDataAggregation.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "TestPlonkVerifierForDataAggregation", - "sourceName": "contracts/verifiers/test/TestPlonkVerifierForDataAggregation.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "bytes", - "name": "proof", - "type": "bytes" - }, - { - "internalType": "uint256[]", - "name": "public_inputs", - "type": "uint256[]" - } - ], - "name": "Verify", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b506129b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80637e4f7a8a14610030575b600080fd5b61004361003e3660046128b9565b610057565b604051901515815260200160405180910390f35b6000604051610220810161006a8461043a565b610074858561044d565b61007d8661049d565b610086876104b3565b600061009386868a6106bc565b905061009e816109f4565b90506100aa8189610a5b565b90506100b68189610aea565b5060608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061010a8460108561284d565b086101a08401525061011d818587610b55565b61012882868a610ed1565b91507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183086101808401525061015f905061127c565b610168866123c5565b61017186612358565b61017a86611f72565b61018386611a71565b61018c86611789565b610195866113cd565b6101e0015190506128b1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f77726f6e67206e756d626572206f66207075626c696320696e707574730000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6572726f72206563206f7065726174696f6e00000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e707574732061726520626967676572207468616e207200000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f77726f6e672070726f6f662073697a65000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f70656e696e677320626967676572207468616e2072000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6572726f722076657269667900000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6572726f722072616e646f6d2067656e206b7a670000000000000000000000006044820152606481fd5b6001811461044a5761044a6101a1565b50565b60005b81811015610498577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000833511156104895761048961025f565b60209290920191600101610450565b505050565b6103a08181146104af576104af6102be565b5050565b6102a081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156104e9576104e961031d565b5061028081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105205761052061031d565b5061018081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105575761055761031d565b506101a081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000008135111561058e5761058e61031d565b506101c081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105c5576105c561031d565b506101e081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105fc576105fc61031d565b5061020081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156106335761063361031d565b5061026081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000008135111561066a5761066a61031d565b50610340810160005b6001811015610498577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000823511156106ad576106ad61031d565b60209190910190600101610673565b600060405161022081016467616d6d6181527f02b433cd99b33b9fdba96401bbf39bd0f5f67e77ab109892fd462a1a4bb4c77d60208201527f09185e84da16e93455517004ed7c4407cf02c9e877d9137029602a8fbd608d5160408201527f015cfb53cb67714080757255dca722254b9f02473adc68ffad8fed99ffcec84f60608201527f1ad16c51ef408d7dfa401c8e4957c3c88ed42be7b10f16dcbc31160bc73f0b6e60808201527f0f8b1f59a0d05259ef250ac4ad1fbf7a7b92d00cd2ee6d16a461736190c8e5b560a08201527f2140af9a35d0c1f2cb2a36e0422ac0a0ab3deedade996f3c25da12ab4f64a8d060c08201527f176483729ec70267f31944f44d8fd2b46bb449b053ab28a088ca0c9374b8514560e08201527f073766ef0bf4fb51ce28e3fba9579f978c4d59403d6e7eed6285ea4ea43142676101008201527f1d1931153ed9e8bdfbddcb626cad05f92b8c18b063e5693fd15e65f33321f13a6101208201527f2fb060b2a580e4aa0b3414e4bf76eec714e85149eb17cc588471a55dfdf502e46101408201527f1df6e9e9a3ffca4e632577bf42848a21344ffdba31c3be584fc36e99de7d95646101608201527f1d19f23ff924846cb4598a0ec9a60f429198685e5d8cb444c7c26d6cfb79a90c6101808201527f0cfd83155387d72f55c1cb7cb5c1f124a0880f81c081ccf13c6f49ffe99f86a36101a08201527f180fdb19efe9161e6c9a8c917e2f0120c0a45d15c07e7d8194122f3b349cca196101c08201527f0b27e9c9e5631b28b452193fad7ff3753f82fa2b46712d74637a7eaeaf9949ba6101e08201527f1a03ed6446a3730033f3ca7f642c750bed84add29e07a0d92df48a09cf1e14586102008201527f135730fd4e7aa6fe43bb647c6e831f8852117cc63cc5c3576df5de31226e84246102208201527f02e22b2b0dd77d1248713cca10efb21d39456b820bd9c635fcbe13f97090d42d610240820152610260810160208602808883379081019060c0808784375061030501905060208282601b820160025afa9050806109be576109be61037c565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182066040820152509392505050565b600060405161022060405101636265746181528360208201526020816024601c840160025afa80610a2757610a2761037c565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018206602082015250919050565b600060405161022060405101606564616c7068618252602082018681526020810190506103608601600160400280828437928301929190910190506040610220870182375060208282601b850160025afa905080610abb57610abb61037c565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181069091529392505050565b60405161022060405101637a657461815283602082015260c0808401604083013760208160e4601c840160025afa80610b2557610b2561037c565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006606091909101525050565b600060405160608101516101a0820151915085610b7481878585610bf1565b60009250600091505b85821015610be7577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001853582510992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018385086020958601959094506001929092019101610b7d565b5050509392505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2d5e098bb31e86271ccb415b196942d755b0a9c3f21dd9882fa3d63ab1000001830960018560005b86811015610ce0577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103860882527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b8409925060209190910190600101610c3b565b50610cec818789610da5565b50600190508560005b86811015610d9b577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001868551090982526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b84099250600101610cf5565b5050505050505050565b600183526000805b83811015610dfb5781850151828401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060208401935080848801525050600181019050610dad565b506020810382019150808401935050610e3c6020840160027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103855161284d565b60005b83811015610eca5760208503945082517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018651840984527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018184097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090940193925050600101610e3f565b5050505050565b600060405160608101516101a082015191506103608401600080610efb896020850135853561107e565b9150610f0c8960058a018787610f42565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840987089998505050505050505050565b6000610f6f85857f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b61284d565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103840894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2d5e098bb31e86271ccb415b196942d755b0a9c3f21dd9882fa3d63ab100000182099050611028867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff8761284d565b94507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018482099695505050505050565b600083526000602084015280604084015250806060830152506000608082015360306081820153600060828201536042608382015360536084820153604260858201536032608682015360326087820153602d608882015360506089820153606c608a820153606f608b820153606e608c820153606b608d820153600b608e8201536000602082608f8460025afa806111195761111961037c565b8251600160208501536042602185015360536022850153604260238501536032602485015360326025850153602d602685015360506027850153606c6028850153606f6029850153606e602a850153606b602b850153600b602c850153602084602d8660025afa91508161118f5761118f61037c565b8351186020840152600260408401536042604184015360536042840153604260438401536032604484015360326045840153602d604684015360506047840153606c6048840153606f6049840153606e604a840153606b604b840153600b604c84015360208301602081602d8360025afa915050806112105761121061037c565b507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017001000000000000000000000000000000008351099050602082015160801c7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089392505050565b604051610220604051016101a08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103606085015108611302837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff8361284d565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2d5e098bb31e86271ccb415b196942d755b0a9c3f21dd9882fa3d63ab1000001820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282098451935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905082820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282099050806080840152505050565b6040516102208101610140820151815261016082015160208201526102c083013560408201526102e08301356060820152610220830135608082015261024083013560a082015261030083013560c082015261032083013560e082015260608201516101008201526101c08201516101208201526020816101408360025afa80611459576114596103db565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018251069050816040810192506102c085013581526102e085013560208201526114a983836103008801846127b4565b61014084016114be84846102208901846127b4565b61012085016114d2846102608901836127fb565b6001855260026020860152805160408087019182529095908160608160075afa9150816115015761150161037c565b60208101915081517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038252611539868285866126a3565b5050836040850194506115568560608801516102c08a0184612742565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b60608801510995507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186850993506115d685856103008a01846127b4565b6115e2858284856126a3565b50602082810180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470381528251865291810151908501527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408501527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608501527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808501527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0850152905160c0840152805160e08401527f12740934ba9615b77b6a49b06fcce83ce90d67b1d0e2a530069e3a7306569a916101008401527f116da8c89a0d090f3d8644ada33a5f1c8013ba7204aeca62d66d931b99afe6e76101208401527f25222d9816e5f86b4a7dedd00d04acc5c979c18bd22b834ea8c6d07c0ba441db6101408401527f076441042e77b6309644b56251f059cf14befc72ac8a6157d30924e58dc4c1726101608401529250610498905081604051602060006101808460085afa6000516101e09290920180519190921616905250565b6040516102206040510160208101604082016101c084015180610140860160a087015161014088015260c08701516101608801526102808801356101208801526117d8868360e08a018461276d565b6117eb826102a08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838309915061182186838a6101408b016127b4565b611834826101808a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018383099150611869868360408b01846127b4565b61187c826101a08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991506118b1868360808b01846127b4565b6118c4826101c08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f02b433cd99b33b9fdba96401bbf39bd0f5f67e77ab109892fd462a1a4bb4c77d86527f09185e84da16e93455517004ed7c4407cf02c9e877d9137029602a8fbd608d51855261193c8483888461276d565b61194f826101e08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f015cfb53cb67714080757255dca722254b9f02473adc68ffad8fed99ffcec84f86527f1ad16c51ef408d7dfa401c8e4957c3c88ed42be7b10f16dcbc31160bc73f0b6e85526119c78483888461276d565b6119da826102008a016101208a016127fb565b61034088017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184840992507f135730fd4e7aa6fe43bb647c6e831f8852117cc63cc5c3576df5de31226e842487527f02e22b2b0dd77d1248713cca10efb21d39456b820bd9c635fcbe13f97090d42d8652611a578584898561276d565b611a6683826101208b016127fb565b505050505050505050565b6040516467616d6d616102208201908152606082015161024083015260a082015161026083015260c08083015161028084015260e08301516102a08401526101008301516102c0840152836102e08401377f02b433cd99b33b9fdba96401bbf39bd0f5f67e77ab109892fd462a1a4bb4c77d610180828101919091527f09185e84da16e93455517004ed7c4407cf02c9e877d9137029602a8fbd608d516101a0808401919091527f015cfb53cb67714080757255dca722254b9f02473adc68ffad8fed99ffcec84f6101c0808501919091527f1ad16c51ef408d7dfa401c8e4957c3c88ed42be7b10f16dcbc31160bc73f0b6e6101e0808601919091527f135730fd4e7aa6fe43bb647c6e831f8852117cc63cc5c3576df5de31226e8424610200808701919091527f02e22b2b0dd77d1248713cca10efb21d39456b820bd9c635fcbe13f97090d42d610220870152610280888101356102408801526102a0808a0135610260890152958901359087015292870135938501939093528501356102c0840152908401356102e08301528301356103008201526103208101610340840160005b6001811015611c35578135835260209283019290910190600101611c16565b50506102608401359052601b61034560206101c085018285850160025afa9250505080611c6457611c6461037c565b506101c00180517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006905250565b604051610220604051017f176483729ec70267f31944f44d8fd2b46bb449b053ab28a088ca0c9374b8514581527f073766ef0bf4fb51ce28e3fba9579f978c4d59403d6e7eed6285ea4ea43142676020820152611cfd604082016101808501358360e08601612717565b7f1d1931153ed9e8bdfbddcb626cad05f92b8c18b063e5693fd15e65f33321f13a81527f2fb060b2a580e4aa0b3414e4bf76eec714e85149eb17cc588471a55dfdf502e46020820152611d5d604082016101a08501358360e0860161276d565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0840135610180850135097f1df6e9e9a3ffca4e632577bf42848a21344ffdba31c3be584fc36e99de7d956482527f1d19f23ff924846cb4598a0ec9a60f429198685e5d8cb444c7c26d6cfb79a90c6020830152611de660408301828460e0870161276d565b507f0cfd83155387d72f55c1cb7cb5c1f124a0880f81c081ccf13c6f49ffe99f86a381527f180fdb19efe9161e6c9a8c917e2f0120c0a45d15c07e7d8194122f3b349cca196020820152611e47604082016101c08501358360e0860161276d565b7f0b27e9c9e5631b28b452193fad7ff3753f82fa2b46712d74637a7eaeaf9949ba81527f1a03ed6446a3730033f3ca7f642c750bed84add29e07a0d92df48a09cf1e14586020820152611ea2604082018260e08501806126a3565b6103408301610360840160005b6001811015611eef578135845260208201356020850152611ed96040850184358660e0890161276d565b6020929092019160409190910190600101611eaf565b5050507f0f8b1f59a0d05259ef250ac4ad1fbf7a7b92d00cd2ee6d16a461736190c8e5b581527f2140af9a35d0c1f2cb2a36e0422ac0a0ab3deedade996f3c25da12ab4f64a8d06020820152611f4d60408201858360e0860161276d565b61022083013581526102408301356020820152610eca60408201868360e0860161276d565b60405160208101516040820151606083015160008401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184610260880135097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e088013586097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610180890135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161020089013587097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08a0135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600580097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001878a0998507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808c01358a0894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188860894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160058a0993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08c0135850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818a099250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08b0135830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000187830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183850997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018289097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103985085890997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160808a01518908975061234c88828c611c93565b50505050505050505050565b6040516002601001610220604051016123768183606086015161284d565b915061238b8183610140870160a08701612742565b61239e81610100860160a08601806126dd565b6123ad818360a0860180612717565b6123bf8160c0860160a08601806126dd565b50505050565b604051610220604051017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208301516101e08501350981527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604083015182510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808401358251088152602081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208401516102008601350981527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604084015182510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08501358251088152604082017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160408501516101c08701350881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001825184510983527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001815184510980845284517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019250900982527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102608501358351098252606082017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808501516102a08701350881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001835182510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160808501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010382510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a085015161028087013509825281518151146101e08501525050505050565b604051508151845260208201516020850152825160408501526020830151606085015260408160808660065afa80610eca57610eca610200565b604051508151845260208201516020850152823560408501526020830135606085015260408160808660065afa80610eca57610eca610200565b815184526020808301519085015260408481018490528160608660075afa80610eca57610eca610200565b813584526020808301359085015260408481018490528160608660075afa80610eca57610eca610200565b815184526020808301519085015260408481018490528460608160075afa815160408601526020820151606086015260408260808760065afa1680610eca57610eca610200565b813584526020808301359085015260408481018490528460608160075afa815160408601526020820151606086015260408260808760065afa1680610eca57610eca610200565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838335097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181835108825250505050565b602083526020808401526020604084015280606084015250806080830152507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a0820152600060208260c08460055afa806128ab576128ab61037c565b50505190565b949350505050565b600080600080604085870312156128cf57600080fd5b843567ffffffffffffffff808211156128e757600080fd5b818701915087601f8301126128fb57600080fd5b81358181111561290a57600080fd5b88602082850101111561291c57600080fd5b60209283019650945090860135908082111561293757600080fd5b818701915087601f83011261294b57600080fd5b81358181111561295a57600080fd5b8860208260051b850101111561296f57600080fd5b9598949750506020019450505056fea26469706673582212203a34f7f888032ffffe0341df30be2ff1e4f37f98cf4034382bb92e38185b951e64736f6c63430008160033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80637e4f7a8a14610030575b600080fd5b61004361003e3660046128b9565b610057565b604051901515815260200160405180910390f35b6000604051610220810161006a8461043a565b610074858561044d565b61007d8661049d565b610086876104b3565b600061009386868a6106bc565b905061009e816109f4565b90506100aa8189610a5b565b90506100b68189610aea565b5060608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061010a8460108561284d565b086101a08401525061011d818587610b55565b61012882868a610ed1565b91507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183086101808401525061015f905061127c565b610168866123c5565b61017186612358565b61017a86611f72565b61018386611a71565b61018c86611789565b610195866113cd565b6101e0015190506128b1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f77726f6e67206e756d626572206f66207075626c696320696e707574730000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6572726f72206563206f7065726174696f6e00000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e707574732061726520626967676572207468616e207200000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f77726f6e672070726f6f662073697a65000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f70656e696e677320626967676572207468616e2072000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6572726f722076657269667900000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6572726f722072616e646f6d2067656e206b7a670000000000000000000000006044820152606481fd5b6001811461044a5761044a6101a1565b50565b60005b81811015610498577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000833511156104895761048961025f565b60209290920191600101610450565b505050565b6103a08181146104af576104af6102be565b5050565b6102a081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156104e9576104e961031d565b5061028081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105205761052061031d565b5061018081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105575761055761031d565b506101a081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000008135111561058e5761058e61031d565b506101c081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105c5576105c561031d565b506101e081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156105fc576105fc61031d565b5061020081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156106335761063361031d565b5061026081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000008135111561066a5761066a61031d565b50610340810160005b6001811015610498577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000823511156106ad576106ad61031d565b60209190910190600101610673565b600060405161022081016467616d6d6181527f02b433cd99b33b9fdba96401bbf39bd0f5f67e77ab109892fd462a1a4bb4c77d60208201527f09185e84da16e93455517004ed7c4407cf02c9e877d9137029602a8fbd608d5160408201527f015cfb53cb67714080757255dca722254b9f02473adc68ffad8fed99ffcec84f60608201527f1ad16c51ef408d7dfa401c8e4957c3c88ed42be7b10f16dcbc31160bc73f0b6e60808201527f0f8b1f59a0d05259ef250ac4ad1fbf7a7b92d00cd2ee6d16a461736190c8e5b560a08201527f2140af9a35d0c1f2cb2a36e0422ac0a0ab3deedade996f3c25da12ab4f64a8d060c08201527f176483729ec70267f31944f44d8fd2b46bb449b053ab28a088ca0c9374b8514560e08201527f073766ef0bf4fb51ce28e3fba9579f978c4d59403d6e7eed6285ea4ea43142676101008201527f1d1931153ed9e8bdfbddcb626cad05f92b8c18b063e5693fd15e65f33321f13a6101208201527f2fb060b2a580e4aa0b3414e4bf76eec714e85149eb17cc588471a55dfdf502e46101408201527f1df6e9e9a3ffca4e632577bf42848a21344ffdba31c3be584fc36e99de7d95646101608201527f1d19f23ff924846cb4598a0ec9a60f429198685e5d8cb444c7c26d6cfb79a90c6101808201527f0cfd83155387d72f55c1cb7cb5c1f124a0880f81c081ccf13c6f49ffe99f86a36101a08201527f180fdb19efe9161e6c9a8c917e2f0120c0a45d15c07e7d8194122f3b349cca196101c08201527f0b27e9c9e5631b28b452193fad7ff3753f82fa2b46712d74637a7eaeaf9949ba6101e08201527f1a03ed6446a3730033f3ca7f642c750bed84add29e07a0d92df48a09cf1e14586102008201527f135730fd4e7aa6fe43bb647c6e831f8852117cc63cc5c3576df5de31226e84246102208201527f02e22b2b0dd77d1248713cca10efb21d39456b820bd9c635fcbe13f97090d42d610240820152610260810160208602808883379081019060c0808784375061030501905060208282601b820160025afa9050806109be576109be61037c565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182066040820152509392505050565b600060405161022060405101636265746181528360208201526020816024601c840160025afa80610a2757610a2761037c565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018206602082015250919050565b600060405161022060405101606564616c7068618252602082018681526020810190506103608601600160400280828437928301929190910190506040610220870182375060208282601b850160025afa905080610abb57610abb61037c565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181069091529392505050565b60405161022060405101637a657461815283602082015260c0808401604083013760208160e4601c840160025afa80610b2557610b2561037c565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006606091909101525050565b600060405160608101516101a0820151915085610b7481878585610bf1565b60009250600091505b85821015610be7577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001853582510992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018385086020958601959094506001929092019101610b7d565b5050509392505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2d5e098bb31e86271ccb415b196942d755b0a9c3f21dd9882fa3d63ab1000001830960018560005b86811015610ce0577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103860882527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b8409925060209190910190600101610c3b565b50610cec818789610da5565b50600190508560005b86811015610d9b577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001868551090982526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b84099250600101610cf5565b5050505050505050565b600183526000805b83811015610dfb5781850151828401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060208401935080848801525050600181019050610dad565b506020810382019150808401935050610e3c6020840160027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103855161284d565b60005b83811015610eca5760208503945082517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018651840984527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018184097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090940193925050600101610e3f565b5050505050565b600060405160608101516101a082015191506103608401600080610efb896020850135853561107e565b9150610f0c8960058a018787610f42565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840987089998505050505050505050565b6000610f6f85857f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b61284d565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103840894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2d5e098bb31e86271ccb415b196942d755b0a9c3f21dd9882fa3d63ab100000182099050611028867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff8761284d565b94507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018482099695505050505050565b600083526000602084015280604084015250806060830152506000608082015360306081820153600060828201536042608382015360536084820153604260858201536032608682015360326087820153602d608882015360506089820153606c608a820153606f608b820153606e608c820153606b608d820153600b608e8201536000602082608f8460025afa806111195761111961037c565b8251600160208501536042602185015360536022850153604260238501536032602485015360326025850153602d602685015360506027850153606c6028850153606f6029850153606e602a850153606b602b850153600b602c850153602084602d8660025afa91508161118f5761118f61037c565b8351186020840152600260408401536042604184015360536042840153604260438401536032604484015360326045840153602d604684015360506047840153606c6048840153606f6049840153606e604a840153606b604b840153600b604c84015360208301602081602d8360025afa915050806112105761121061037c565b507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017001000000000000000000000000000000008351099050602082015160801c7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089392505050565b604051610220604051016101a08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103606085015108611302837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff8361284d565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2d5e098bb31e86271ccb415b196942d755b0a9c3f21dd9882fa3d63ab1000001820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282098451935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905082820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282099050806080840152505050565b6040516102208101610140820151815261016082015160208201526102c083013560408201526102e08301356060820152610220830135608082015261024083013560a082015261030083013560c082015261032083013560e082015260608201516101008201526101c08201516101208201526020816101408360025afa80611459576114596103db565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018251069050816040810192506102c085013581526102e085013560208201526114a983836103008801846127b4565b61014084016114be84846102208901846127b4565b61012085016114d2846102608901836127fb565b6001855260026020860152805160408087019182529095908160608160075afa9150816115015761150161037c565b60208101915081517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038252611539868285866126a3565b5050836040850194506115568560608801516102c08a0184612742565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b60608801510995507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186850993506115d685856103008a01846127b4565b6115e2858284856126a3565b50602082810180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470381528251865291810151908501527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408501527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608501527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808501527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0850152905160c0840152805160e08401527f12740934ba9615b77b6a49b06fcce83ce90d67b1d0e2a530069e3a7306569a916101008401527f116da8c89a0d090f3d8644ada33a5f1c8013ba7204aeca62d66d931b99afe6e76101208401527f25222d9816e5f86b4a7dedd00d04acc5c979c18bd22b834ea8c6d07c0ba441db6101408401527f076441042e77b6309644b56251f059cf14befc72ac8a6157d30924e58dc4c1726101608401529250610498905081604051602060006101808460085afa6000516101e09290920180519190921616905250565b6040516102206040510160208101604082016101c084015180610140860160a087015161014088015260c08701516101608801526102808801356101208801526117d8868360e08a018461276d565b6117eb826102a08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838309915061182186838a6101408b016127b4565b611834826101808a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018383099150611869868360408b01846127b4565b61187c826101a08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991506118b1868360808b01846127b4565b6118c4826101c08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f02b433cd99b33b9fdba96401bbf39bd0f5f67e77ab109892fd462a1a4bb4c77d86527f09185e84da16e93455517004ed7c4407cf02c9e877d9137029602a8fbd608d51855261193c8483888461276d565b61194f826101e08a016101208a016127fb565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f015cfb53cb67714080757255dca722254b9f02473adc68ffad8fed99ffcec84f86527f1ad16c51ef408d7dfa401c8e4957c3c88ed42be7b10f16dcbc31160bc73f0b6e85526119c78483888461276d565b6119da826102008a016101208a016127fb565b61034088017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184840992507f135730fd4e7aa6fe43bb647c6e831f8852117cc63cc5c3576df5de31226e842487527f02e22b2b0dd77d1248713cca10efb21d39456b820bd9c635fcbe13f97090d42d8652611a578584898561276d565b611a6683826101208b016127fb565b505050505050505050565b6040516467616d6d616102208201908152606082015161024083015260a082015161026083015260c08083015161028084015260e08301516102a08401526101008301516102c0840152836102e08401377f02b433cd99b33b9fdba96401bbf39bd0f5f67e77ab109892fd462a1a4bb4c77d610180828101919091527f09185e84da16e93455517004ed7c4407cf02c9e877d9137029602a8fbd608d516101a0808401919091527f015cfb53cb67714080757255dca722254b9f02473adc68ffad8fed99ffcec84f6101c0808501919091527f1ad16c51ef408d7dfa401c8e4957c3c88ed42be7b10f16dcbc31160bc73f0b6e6101e0808601919091527f135730fd4e7aa6fe43bb647c6e831f8852117cc63cc5c3576df5de31226e8424610200808701919091527f02e22b2b0dd77d1248713cca10efb21d39456b820bd9c635fcbe13f97090d42d610220870152610280888101356102408801526102a0808a0135610260890152958901359087015292870135938501939093528501356102c0840152908401356102e08301528301356103008201526103208101610340840160005b6001811015611c35578135835260209283019290910190600101611c16565b50506102608401359052601b61034560206101c085018285850160025afa9250505080611c6457611c6461037c565b506101c00180517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006905250565b604051610220604051017f176483729ec70267f31944f44d8fd2b46bb449b053ab28a088ca0c9374b8514581527f073766ef0bf4fb51ce28e3fba9579f978c4d59403d6e7eed6285ea4ea43142676020820152611cfd604082016101808501358360e08601612717565b7f1d1931153ed9e8bdfbddcb626cad05f92b8c18b063e5693fd15e65f33321f13a81527f2fb060b2a580e4aa0b3414e4bf76eec714e85149eb17cc588471a55dfdf502e46020820152611d5d604082016101a08501358360e0860161276d565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0840135610180850135097f1df6e9e9a3ffca4e632577bf42848a21344ffdba31c3be584fc36e99de7d956482527f1d19f23ff924846cb4598a0ec9a60f429198685e5d8cb444c7c26d6cfb79a90c6020830152611de660408301828460e0870161276d565b507f0cfd83155387d72f55c1cb7cb5c1f124a0880f81c081ccf13c6f49ffe99f86a381527f180fdb19efe9161e6c9a8c917e2f0120c0a45d15c07e7d8194122f3b349cca196020820152611e47604082016101c08501358360e0860161276d565b7f0b27e9c9e5631b28b452193fad7ff3753f82fa2b46712d74637a7eaeaf9949ba81527f1a03ed6446a3730033f3ca7f642c750bed84add29e07a0d92df48a09cf1e14586020820152611ea2604082018260e08501806126a3565b6103408301610360840160005b6001811015611eef578135845260208201356020850152611ed96040850184358660e0890161276d565b6020929092019160409190910190600101611eaf565b5050507f0f8b1f59a0d05259ef250ac4ad1fbf7a7b92d00cd2ee6d16a461736190c8e5b581527f2140af9a35d0c1f2cb2a36e0422ac0a0ab3deedade996f3c25da12ab4f64a8d06020820152611f4d60408201858360e0860161276d565b61022083013581526102408301356020820152610eca60408201868360e0860161276d565b60405160208101516040820151606083015160008401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184610260880135097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e088013586097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610180890135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161020089013587097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08a0135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600580097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001878a0998507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808c01358a0894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188860894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160058a0993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08c0135850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818a099250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08b0135830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000187830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183850997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018289097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103985085890997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160808a01518908975061234c88828c611c93565b50505050505050505050565b6040516002601001610220604051016123768183606086015161284d565b915061238b8183610140870160a08701612742565b61239e81610100860160a08601806126dd565b6123ad818360a0860180612717565b6123bf8160c0860160a08601806126dd565b50505050565b604051610220604051017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208301516101e08501350981527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604083015182510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808401358251088152602081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208401516102008601350981527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604084015182510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08501358251088152604082017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160408501516101c08701350881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001825184510983527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001815184510980845284517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019250900982527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102608501358351098252606082017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808501516102a08701350881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001835182510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160808501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010382510881527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a085015161028087013509825281518151146101e08501525050505050565b604051508151845260208201516020850152825160408501526020830151606085015260408160808660065afa80610eca57610eca610200565b604051508151845260208201516020850152823560408501526020830135606085015260408160808660065afa80610eca57610eca610200565b815184526020808301519085015260408481018490528160608660075afa80610eca57610eca610200565b813584526020808301359085015260408481018490528160608660075afa80610eca57610eca610200565b815184526020808301519085015260408481018490528460608160075afa815160408601526020820151606086015260408260808760065afa1680610eca57610eca610200565b813584526020808301359085015260408481018490528460608160075afa815160408601526020820151606086015260408260808760065afa1680610eca57610eca610200565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838335097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181835108825250505050565b602083526020808401526020604084015280606084015250806080830152507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a0820152600060208260c08460055afa806128ab576128ab61037c565b50505190565b949350505050565b600080600080604085870312156128cf57600080fd5b843567ffffffffffffffff808211156128e757600080fd5b818701915087601f8301126128fb57600080fd5b81358181111561290a57600080fd5b88602082850101111561291c57600080fd5b60209283019650945090860135908082111561293757600080fd5b818701915087601f83011261294b57600080fd5b81358181111561295a57600080fd5b8860208260051b850101111561296f57600080fd5b9598949750506020019450505056fea26469706673582212203a34f7f888032ffffe0341df30be2ff1e4f37f98cf4034382bb92e38185b951e64736f6c63430008160033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/e2e/src/abi/TransparentUpgradeableProxy.json b/e2e/src/abi/TransparentUpgradeableProxy.json deleted file mode 100644 index be5fb606..00000000 --- a/e2e/src/abi/TransparentUpgradeableProxy.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "contractName": "TransparentUpgradeableProxy", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_logic", - "type": "address" - }, - { - "internalType": "address", - "name": "admin_", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": "0x608060405260405162000eda38038062000eda83398101604081905262000026916200049d565b828162000036828260006200004d565b50620000449050826200008a565b505050620005d0565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001791760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000eb360279139620002f8565b9392505050565b60006200018060008051602062000e9383398151915260001b6200037760201b620001a51760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e9383398151915260001b6200037760201b620001a51760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001a81760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001a51760201c565b6060600080856001600160a01b0316856040516200031791906200057d565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fa578251620003f2576001600160a01b0385163b620003f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000406565b6200040683836200040e565b949350505050565b8151156200041f5781518083602001fd5b8060405162461bcd60e51b8152600401620001f191906200059b565b80516001600160a01b03811681146200045357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048b57818101518382015260200162000471565b83811115620000835750506000910152565b600080600060608486031215620004b357600080fd5b620004be846200043b565b9250620004ce602085016200043b565b60408501519092506001600160401b0380821115620004ec57600080fd5b818601915086601f8301126200050157600080fd5b81518181111562000516576200051662000458565b604051601f8201601f19908116603f0116810190838211818310171562000541576200054162000458565b816040528281528960208487010111156200055b57600080fd5b6200056e8360208301602088016200046e565b80955050505050509250925092565b60008251620005918184602087016200046e565b9190910192915050565b6020815260008251806020840152620005bc8160408501602087016200046e565b601f01601f19169190910160400192915050565b6108b380620005e06000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", - "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033" - } \ No newline at end of file diff --git a/e2e/src/common/deployments.ts b/e2e/src/common/deployments.ts index 2a46c010..24870f3c 100644 --- a/e2e/src/common/deployments.ts +++ b/e2e/src/common/deployments.ts @@ -1,4 +1,4 @@ -import { AbiCoder, BaseContract, ContractFactory, Wallet, ethers } from "ethers"; +import { AbiCoder, AbstractSigner, BaseContract, ContractFactory, Wallet, ethers } from "ethers"; import { ProxyAdmin__factory, TransparentUpgradeableProxy__factory, ProxyAdmin } from "../typechain"; export const encodeData = (types: string[], values: unknown[], packed?: boolean) => { @@ -21,7 +21,7 @@ export const encodeLibraryName = (libraryName: string) => { export const deployContract = async ( contractFactory: T, - deployer: Wallet, + deployer: AbstractSigner, // eslint-disable-next-line @typescript-eslint/no-explicit-any args?: any[], ): Promise => { diff --git a/e2e/src/common/utils.ts b/e2e/src/common/utils.ts index 499f2019..0c229353 100644 --- a/e2e/src/common/utils.ts +++ b/e2e/src/common/utils.ts @@ -1,9 +1,9 @@ import * as fs from "fs"; import assert from "assert"; -import { BaseContract, BlockTag, TransactionReceipt, TransactionRequest, Wallet, ethers } from "ethers"; +import { AbstractSigner, BaseContract, BlockTag, TransactionReceipt, TransactionRequest, Wallet, ethers } from "ethers"; import path from "path"; import { exec } from "child_process"; -import { L2MessageService, LineaRollup } from "../typechain"; +import { L2MessageService, LineaRollupV5 } from "../typechain"; import { PayableOverrides, TypedContractEvent, TypedDeferredTopicFilter, TypedEventLog } from "../typechain/common"; import { MessageEvent, SendMessageArgs } from "./types"; @@ -79,7 +79,8 @@ export class TransactionExclusionClient { this.endpoint = endpoint; } - public async getTransactionExclusionStatusV1(txHash: String): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public async getTransactionExclusionStatusV1(txHash: string): Promise { const request = { method: "post", body: JSON.stringify({ @@ -94,13 +95,15 @@ export class TransactionExclusionClient { } public async saveRejectedTransactionV1( - txRejectionStage: String, - timestamp: String, // ISO-8601 - blockNumber: Number | null, - transactionRLP: String, - reasonMessage: String, - overflows: { module: String; count: Number; limit: Number }[], + txRejectionStage: string, + timestamp: string, // ISO-8601 + blockNumber: number | null, + transactionRLP: string, + reasonMessage: string, + overflows: { module: string; count: number; limit: number }[], + // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any let params: any = { txRejectionStage, timestamp, @@ -144,7 +147,7 @@ export async function getBlockByNumberOrBlockTag(rpcUrl: URL, blockTag: BlockTag } } -export async function getEvents( +export async function getEvents( contract: TContract, eventFilter: TypedDeferredTopicFilter, fromBlock?: BlockTag, @@ -165,7 +168,7 @@ export async function getEvents( contract: TContract, @@ -221,10 +224,13 @@ export async function waitForFile( throw new Error("File check timed out"); } -export async function sendTransactionsToGenerateTrafficWithInterval(signer: Wallet, pollingInterval: number = 1_000) { +export async function sendTransactionsToGenerateTrafficWithInterval( + signer: AbstractSigner, + pollingInterval: number = 1_000, +) { const { maxPriorityFeePerGas, maxFeePerGas } = await signer.provider!.getFeeData(); const transactionRequest = { - to: signer.address, + to: await signer.getAddress(), value: etherToWei("0.000001"), maxPriorityFeePerGas: maxPriorityFeePerGas, maxFeePerGas: maxFeePerGas, @@ -288,8 +294,8 @@ export function getMessageSentEventFromLogs( }); } -export const sendMessage = async ( - signer: Wallet, +export const sendMessage = async ( + signer: AbstractSigner, contract: T, args: SendMessageArgs, overrides?: PayableOverrides, diff --git a/e2e/src/config/jest/global-setup.ts b/e2e/src/config/jest/global-setup.ts index 96a4d777..d16e4083 100644 --- a/e2e/src/config/jest/global-setup.ts +++ b/e2e/src/config/jest/global-setup.ts @@ -11,31 +11,41 @@ declare global { export default async (): Promise => { const account = config.getL1AccountManager().whaleAccount(0); const l2Account = config.getL2AccountManager().whaleAccount(0); - - const [dummyContract, l2DummyContract] = await Promise.all([ - deployContract(new DummyContract__factory(), account), - deployContract(new DummyContract__factory(), l2Account), - ]); - console.log(`L1 Dummy contract deployed at address: ${await dummyContract.getAddress()}`); - console.log(`L2 Dummy contract deployed at address: ${await l2DummyContract.getAddress()}`); - - const l2TestContract = await deployContract(new TestContract__factory(), l2Account); - console.log(`L2 Test contract deployed at address: ${await l2TestContract.getAddress()}`); - - // Send ETH to the LineaRollup contract const lineaRollup = config.getLineaRollupContract(account); const l1JsonRpcProvider = config.getL1Provider(); - const value = etherToWei("500"); + const [l1AccountNonce, l2AccountNonce, { maxPriorityFeePerGas, maxFeePerGas }] = await Promise.all([ + account.getNonce(), + l2Account.getNonce(), + l1JsonRpcProvider.getFeeData(), + ]); + const fee = etherToWei("3"); const to = "0x8D97689C9818892B700e27F316cc3E41e17fBeb9"; const calldata = "0x"; - const { maxPriorityFeePerGas, maxFeePerGas } = await l1JsonRpcProvider.getFeeData(); - const tx = await lineaRollup.sendMessage(to, fee, calldata, { value, maxPriorityFeePerGas, maxFeePerGas }); - await tx.wait(); + + const [dummyContract, l2DummyContract, l2TestContract] = await Promise.all([ + deployContract(new DummyContract__factory(), account, [{ nonce: l1AccountNonce }]), + deployContract(new DummyContract__factory(), l2Account, [{ nonce: l2AccountNonce }]), + deployContract(new TestContract__factory(), l2Account, [{ nonce: l2AccountNonce + 1 }]), + // Send ETH to the LineaRollup contract + ( + await lineaRollup.sendMessage(to, fee, calldata, { + value: etherToWei("500"), + maxPriorityFeePerGas, + maxFeePerGas, + nonce: l1AccountNonce + 1, + }) + ).wait(), + ]); + + console.log(`L1 Dummy contract deployed at address: ${await dummyContract.getAddress()}`); + console.log(`L2 Dummy contract deployed at address: ${await l2DummyContract.getAddress()}`); + console.log(`L2 Test contract deployed at address: ${await l2TestContract.getAddress()}`); console.log("Generating L2 traffic..."); - const stopPolling = await sendTransactionsToGenerateTrafficWithInterval(l2Account, 2_000); + const pollingAccount = await config.getL2AccountManager().generateAccount(etherToWei("200")); + const stopPolling = await sendTransactionsToGenerateTrafficWithInterval(pollingAccount, 2_000); global.stopL2TrafficGeneration = stopPolling; }; diff --git a/e2e/src/config/tests-config/accounts/account-manager.ts b/e2e/src/config/tests-config/accounts/account-manager.ts index 42984b78..f0f4c3cf 100644 --- a/e2e/src/config/tests-config/accounts/account-manager.ts +++ b/e2e/src/config/tests-config/accounts/account-manager.ts @@ -1,9 +1,10 @@ -import { ethers, Provider, Wallet } from "ethers"; +import { ethers, NonceManager, Provider, TransactionResponse, Wallet } from "ethers"; +import { Mutex } from "async-mutex"; import Account from "./account"; import { etherToWei } from "../../../common/utils"; interface IAccountManager { - whaleAccount(accIndex?: number): Wallet; + whaleAccount(accIndex?: number): NonceManager; generateAccount(initialBalanceWei?: bigint): Promise; generateAccounts(numberOfAccounts: number, initialBalanceWei?: bigint): Promise; getWallet(account: Account): Wallet; @@ -26,16 +27,20 @@ abstract class AccountManager implements IAccountManager { protected readonly chainId: number; protected readonly whaleAccounts: Account[]; protected provider: Provider; - protected accountWallets: Wallet[]; + protected accountWallets: NonceManager[]; + private whaleAccountMutex: Mutex; constructor(provider: Provider, whaleAccounts: Account[], chainId: number) { this.provider = provider; this.whaleAccounts = whaleAccounts; this.chainId = chainId; - this.accountWallets = this.whaleAccounts.map((account) => getWallet(this.provider, account.privateKey)); + this.accountWallets = this.whaleAccounts.map( + (account) => new NonceManager(getWallet(this.provider, account.privateKey)), + ); + this.whaleAccountMutex = new Mutex(); } - selectWhaleAccount(accIndex?: number): { account: Account; accountWallet: Wallet } { + selectWhaleAccount(accIndex?: number): { account: Account; accountWallet: NonceManager } { if (accIndex) { return { account: this.whaleAccounts[accIndex], accountWallet: this.accountWallets[accIndex] }; } @@ -48,20 +53,16 @@ abstract class AccountManager implements IAccountManager { return { account: whaleAccount, accountWallet: whaleTxManager }; } - whaleAccount(accIndex?: number): Wallet { + whaleAccount(accIndex?: number): NonceManager { return this.selectWhaleAccount(accIndex).accountWallet; } async generateAccount(initialBalanceWei = etherToWei("10")): Promise { const accounts = await this.generateAccounts(1, initialBalanceWei); - return this.getWallet(accounts[0]); + return accounts[0]; } - async generateAccounts( - numberOfAccounts: number, - initialBalanceWei = etherToWei("10"), - retryDelayMs = 1_000, - ): Promise { + async generateAccounts(numberOfAccounts: number, initialBalanceWei = etherToWei("10")): Promise { const { account: whaleAccount, accountWallet: whaleAccountWallet } = this.selectWhaleAccount(); console.log( @@ -69,6 +70,7 @@ abstract class AccountManager implements IAccountManager { ); const accounts: Account[] = []; + const transactionResponses: TransactionResponse[] = []; for (let i = 0; i < numberOfAccounts; i++) { const randomBytes = ethers.randomBytes(32); @@ -76,44 +78,36 @@ abstract class AccountManager implements IAccountManager { const newAccount = new Account(randomPrivKey, ethers.computeAddress(randomPrivKey)); accounts.push(newAccount); - let success = false; - while (!success) { - try { - const tx = { - to: newAccount.address, - value: initialBalanceWei, - gasPrice: ethers.parseUnits("300", "gwei"), - gasLimit: 21000n, - }; - const transactionResponse = await whaleAccountWallet.sendTransaction(tx); - console.log( - `Waiting for account funding: newAccount=${newAccount.address} txHash=${transactionResponse.hash} whaleAccount=${whaleAccount.address}`, - ); - const receipt = await transactionResponse.wait(); + const tx = { + to: newAccount.address, + value: initialBalanceWei, + gasPrice: ethers.parseUnits("300", "gwei"), + gasLimit: 21000n, + }; - if (!receipt) { - throw new Error(`Transaction failed to be mined`); - } - - if (receipt.status !== 1) { - throw new Error(`Transaction failed with status ${receipt.status}`); - } - console.log( - `Account funded: newAccount=${newAccount.address} balance=${( - await this.provider.getBalance(newAccount.address) - ).toString()} wei`, - ); - success = true; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - console.log( - `Failed to send funds from accAddress=${whaleAccount.address}. Retrying funding in ${retryDelayMs}ms...`, - ); - await new Promise((resolve) => setTimeout(resolve, retryDelayMs)); - } + const release = await this.whaleAccountMutex.acquire(); + try { + const transactionResponse = await whaleAccountWallet.sendTransaction(tx); + console.log( + `Transaction sent: newAccount=${newAccount.address} txHash=${transactionResponse.hash} whaleAccount=${whaleAccount.address}`, + ); + transactionResponses.push(transactionResponse); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + console.error(`Failed to fund account ${newAccount.address}: ${error.message}`); + whaleAccountWallet.reset(); + } finally { + release(); } } - return accounts.map((account) => getWallet(this.provider, account.privateKey)); + + await Promise.all(transactionResponses.map((tx) => tx.wait())); + + console.log( + `Accounts funded: newAccounts=${accounts.map((account) => account.address).join(",")} balance=${initialBalanceWei.toString()} wei`, + ); + + return accounts.map((account) => this.getWallet(account)); } getWallet(account: Account): Wallet { diff --git a/e2e/src/config/tests-config/environments/dev.ts b/e2e/src/config/tests-config/environments/dev.ts index 1ed0d35b..f5833168 100644 --- a/e2e/src/config/tests-config/environments/dev.ts +++ b/e2e/src/config/tests-config/environments/dev.ts @@ -37,6 +37,7 @@ const config: Config = { rpcUrl: L2_RPC_URL, chainId: L2_CHAIN_ID, l2MessageServiceAddress: "0x33bf916373159A8c1b54b025202517BfDbB7863D", + l2TestContractAddress: "", accountManager: new EnvironmentBasedAccountManager( new ethers.JsonRpcProvider(L2_RPC_URL.toString()), L2_WHALE_ACCOUNTS, diff --git a/e2e/src/config/tests-config/environments/sepolia.ts b/e2e/src/config/tests-config/environments/sepolia.ts index c9fb33f3..c525ceb8 100644 --- a/e2e/src/config/tests-config/environments/sepolia.ts +++ b/e2e/src/config/tests-config/environments/sepolia.ts @@ -36,6 +36,7 @@ const config: Config = { rpcUrl: L2_RPC_URL, chainId: L2_CHAIN_ID, l2MessageServiceAddress: "0x971e727e956690b9957be6d51Ec16E73AcAC83A7", + l2TestContractAddress: "", accountManager: new EnvironmentBasedAccountManager( new ethers.JsonRpcProvider(L2_RPC_URL.toString()), L2_WHALE_ACCOUNTS, diff --git a/e2e/src/config/tests-config/setup.ts b/e2e/src/config/tests-config/setup.ts index 600fe127..314f2316 100644 --- a/e2e/src/config/tests-config/setup.ts +++ b/e2e/src/config/tests-config/setup.ts @@ -1,12 +1,12 @@ -import { JsonRpcProvider, Wallet } from "ethers"; -import { Config } from "./types"; +import { AbstractSigner, JsonRpcProvider, Wallet } from "ethers"; +import { Config, L2Config, LocalL2Config } from "./types"; import { DummyContract, DummyContract__factory, L2MessageService, L2MessageService__factory, - LineaRollup, - LineaRollup__factory, + LineaRollupV5, + LineaRollupV5__factory, TestContract, TestContract__factory, } from "../../typechain"; @@ -24,19 +24,17 @@ export default class TestSetup { } public getL2SequencerProvider(): JsonRpcProvider | undefined { - if (this.config.L2.sequencerEndpoint) { - return new JsonRpcProvider(this.config.L2.sequencerEndpoint.toString()); - } else { + if (!this.isLocalL2Config(this.config.L2)) { return undefined; } + return new JsonRpcProvider(this.config.L2.sequencerEndpoint.toString()); } public getL2BesuNodeProvider(): JsonRpcProvider | undefined { - if (this.config.L2.besuNodeRpcUrl) { - return new JsonRpcProvider(this.config.L2.besuNodeRpcUrl.toString()); - } else { + if (!this.isLocalL2Config(this.config.L2)) { return undefined; } + return new JsonRpcProvider(this.config.L2.besuNodeRpcUrl.toString()); } public getL1ChainId(): number { @@ -48,23 +46,35 @@ export default class TestSetup { } public getShomeiEndpoint(): URL | undefined { + if (!this.isLocalL2Config(this.config.L2)) { + return undefined; + } return this.config.L2.shomeiEndpoint; } public getShomeiFrontendEndpoint(): URL | undefined { + if (!this.isLocalL2Config(this.config.L2)) { + return undefined; + } return this.config.L2.shomeiFrontendEndpoint; } public getSequencerEndpoint(): URL | undefined { + if (!this.isLocalL2Config(this.config.L2)) { + return undefined; + } return this.config.L2.sequencerEndpoint; } public getTransactionExclusionEndpoint(): URL | undefined { + if (!this.isLocalL2Config(this.config.L2)) { + return undefined; + } return this.config.L2.transactionExclusionEndpoint; } - public getLineaRollupContract(signer?: Wallet): LineaRollup { - const lineaRollup: LineaRollup = LineaRollup__factory.connect( + public getLineaRollupContract(signer?: AbstractSigner): LineaRollupV5 { + const lineaRollup: LineaRollupV5 = LineaRollupV5__factory.connect( this.config.L1.lineaRollupAddress, this.getL1Provider(), ); @@ -130,4 +140,14 @@ export default class TestSetup { public getL2AccountManager(): AccountManager { return this.config.L2.accountManager; } + + private isLocalL2Config(config: L2Config): config is LocalL2Config { + return ( + (config as LocalL2Config).besuNodeRpcUrl !== undefined && + (config as LocalL2Config).sequencerEndpoint !== undefined && + (config as LocalL2Config).shomeiEndpoint !== undefined && + (config as LocalL2Config).shomeiFrontendEndpoint !== undefined && + (config as LocalL2Config).transactionExclusionEndpoint !== undefined + ); + } } diff --git a/e2e/src/config/tests-config/types.ts b/e2e/src/config/tests-config/types.ts index c4a3d167..ddb02fbc 100644 --- a/e2e/src/config/tests-config/types.ts +++ b/e2e/src/config/tests-config/types.ts @@ -11,16 +11,25 @@ export type L1Config = BaseConfig & { lineaRollupAddress: string; }; -export type L2Config = BaseConfig & { +export type BaseL2Config = BaseConfig & { l2MessageServiceAddress: string; - l2TestContractAddress?: string; - besuNodeRpcUrl?: URL; - shomeiEndpoint?: URL; - shomeiFrontendEndpoint?: URL; - sequencerEndpoint?: URL; - transactionExclusionEndpoint?: URL; + l2TestContractAddress: string; }; +export type LocalL2Config = BaseL2Config & { + besuNodeRpcUrl: URL; + shomeiEndpoint: URL; + shomeiFrontendEndpoint: URL; + sequencerEndpoint: URL; + transactionExclusionEndpoint: URL; +}; + +export type DevL2Config = BaseL2Config; + +export type SepoliaL2Config = BaseL2Config; + +export type L2Config = LocalL2Config | DevL2Config | SepoliaL2Config; + export type Config = { L1: L1Config; L2: L2Config; diff --git a/e2e/src/restart.spec.ts b/e2e/src/restart.spec.ts index 9f828bf0..e734177b 100644 --- a/e2e/src/restart.spec.ts +++ b/e2e/src/restart.spec.ts @@ -32,6 +32,8 @@ async function waitForCoordinatorRestart() { } } +const l1AccountManager = config.getL1AccountManager(); + describe("Coordinator restart test suite", () => { it.concurrent( "When the coordinator restarts it should resume blob submission and finalization", @@ -101,7 +103,7 @@ describe("Coordinator restart test suite", () => { } const l1Provider = config.getL1Provider(); - const l1MessageSender = await config.getL1AccountManager().generateAccount(); + const l1MessageSender = await l1AccountManager.generateAccount(); const lineaRollup = config.getLineaRollupContract(); const l2MessageService = config.getL2MessageServiceContract(); diff --git a/e2e/src/submission-finalization.spec.ts b/e2e/src/submission-finalization.spec.ts index 8fa7e538..54da51f7 100644 --- a/e2e/src/submission-finalization.spec.ts +++ b/e2e/src/submission-finalization.spec.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from "@jest/globals"; +import { NonceManager } from "ethers"; import { getMessageSentEventFromLogs, sendMessage, @@ -8,7 +9,8 @@ import { etherToWei, } from "./common/utils"; import { config } from "./config/tests-config"; -import { LineaRollup } from "./typechain"; + +const l1AccountManager = config.getL1AccountManager(); describe("Submission and finalization test suite", () => { const sendMessages = async () => { @@ -16,18 +18,13 @@ describe("Submission and finalization test suite", () => { const messageValue = etherToWei("0.0051"); const destinationAddress = "0x8D97689C9818892B700e27F316cc3E41e17fBeb9"; - const l1MessageSender = await config.getL1AccountManager().generateAccount(); + const l1MessageSender = new NonceManager(await l1AccountManager.generateAccount()); const lineaRollup = config.getLineaRollupContract(); console.log("Sending messages on L1"); // Send L1 messages const l1MessagesPromises = []; - // eslint-disable-next-line prefer-const - let [l1MessageSenderNonce, { maxPriorityFeePerGas, maxFeePerGas }] = await Promise.all([ - config.getL1Provider().getTransactionCount(l1MessageSender.address), - config.getL1Provider().getFeeData(), - ]); for (let i = 0; i < 5; i++) { l1MessagesPromises.push( @@ -41,13 +38,9 @@ describe("Submission and finalization test suite", () => { }, { value: messageValue, - nonce: l1MessageSenderNonce, - maxPriorityFeePerGas, - maxFeePerGas, }, ), ); - l1MessageSenderNonce++; } const l1Receipts = await Promise.all(l1MessagesPromises); @@ -60,22 +53,6 @@ describe("Submission and finalization test suite", () => { return { l1Messages, l1Receipts }; }; - async function getFinalizedL2BlockNumber(lineaRollup: LineaRollup) { - let blockNumber = null; - - while (!blockNumber) { - try { - blockNumber = await lineaRollup.currentL2BlockNumber({ blockTag: "finalized" }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - console.log("No finalized block yet, retrying in 5 seconds..."); - await new Promise((resolve) => setTimeout(resolve, 5_000)); - } - } - - return blockNumber; - } - it.concurrent( "Check L2 anchoring", async () => { @@ -152,21 +129,20 @@ describe("Submission and finalization test suite", () => { it.concurrent( "Check L2 safe/finalized tag update on sequencer", async () => { - const lineaRollup = config.getLineaRollupContract(); const sequencerEndpoint = config.getSequencerEndpoint(); if (!sequencerEndpoint) { console.log('Skipped the "Check L2 safe/finalized tag update on sequencer" test'); return; } - const lastFinalizedL2BlockNumberOnL1 = (await getFinalizedL2BlockNumber(lineaRollup)).toString(); + const lastFinalizedL2BlockNumberOnL1 = 0; console.log(`lastFinalizedL2BlockNumberOnL1=${lastFinalizedL2BlockNumberOnL1}`); let safeL2BlockNumber = -1, finalizedL2BlockNumber = -1; while ( - safeL2BlockNumber < parseInt(lastFinalizedL2BlockNumberOnL1) || - finalizedL2BlockNumber < parseInt(lastFinalizedL2BlockNumberOnL1) + safeL2BlockNumber < lastFinalizedL2BlockNumberOnL1 || + finalizedL2BlockNumber < lastFinalizedL2BlockNumberOnL1 ) { safeL2BlockNumber = (await getBlockByNumberOrBlockTag(sequencerEndpoint, "safe"))?.number || safeL2BlockNumber; finalizedL2BlockNumber = @@ -176,8 +152,8 @@ describe("Submission and finalization test suite", () => { console.log(`safeL2BlockNumber=${safeL2BlockNumber} finalizedL2BlockNumber=${finalizedL2BlockNumber}`); - expect(safeL2BlockNumber).toBeGreaterThanOrEqual(parseInt(lastFinalizedL2BlockNumberOnL1)); - expect(finalizedL2BlockNumber).toBeGreaterThanOrEqual(parseInt(lastFinalizedL2BlockNumberOnL1)); + expect(safeL2BlockNumber).toBeGreaterThanOrEqual(lastFinalizedL2BlockNumberOnL1); + expect(finalizedL2BlockNumber).toBeGreaterThanOrEqual(lastFinalizedL2BlockNumberOnL1); console.log("L2 safe/finalized tag update on sequencer done."); }, diff --git a/e2e/src/transaction-exclusion.spec.ts b/e2e/src/transaction-exclusion.spec.ts index 15fd857f..d3f75ef3 100644 --- a/e2e/src/transaction-exclusion.spec.ts +++ b/e2e/src/transaction-exclusion.spec.ts @@ -9,12 +9,13 @@ describe("Transaction exclusion test suite", () => { it.concurrent( "Should get the status of the rejected transaction reported from Besu RPC node", async () => { - expect(config.getTransactionExclusionEndpoint()).toBeDefined(); + const transactionExclusionEndpoint = config.getTransactionExclusionEndpoint(); + expect(transactionExclusionEndpoint).toBeDefined(); - const transactionExclusionClient = new TransactionExclusionClient(config.getTransactionExclusionEndpoint()!!); + const transactionExclusionClient = new TransactionExclusionClient(transactionExclusionEndpoint!); const l2Account = await l2AccountManager.generateAccount(); - const l2AccountLocal = getWallet(l2Account.privateKey, config.getL2BesuNodeProvider()!!); - const testContract = config.getL2TestContract(l2AccountLocal)!!; + const l2AccountLocal = getWallet(l2Account.privateKey, config.getL2BesuNodeProvider()!); + const testContract = config.getL2TestContract(l2AccountLocal)!; // This shall be rejected by the Besu node due to traces module limit overflow let rejectedTxHash; @@ -51,13 +52,13 @@ describe("Transaction exclusion test suite", () => { it.skip("Should get the status of the rejected transaction reported from Besu SEQUENCER node", async () => { expect(config.getTransactionExclusionEndpoint()).toBeDefined(); - const transactionExclusionClient = new TransactionExclusionClient(config.getTransactionExclusionEndpoint()!!); + const transactionExclusionClient = new TransactionExclusionClient(config.getTransactionExclusionEndpoint()!); const l2Account = await l2AccountManager.generateAccount(); - const l2AccountLocal = getWallet(l2Account.privateKey, config.getL2SequencerProvider()!!); + const l2AccountLocal = getWallet(l2Account.privateKey, config.getL2SequencerProvider()!); const testContract = config.getL2TestContract(l2AccountLocal); // This shall be rejected by sequencer due to traces module limit overflow - const tx = await testContract!!.connect(l2AccountLocal).testAddmod(13000, 31); + const tx = await testContract!.connect(l2AccountLocal).testAddmod(13000, 31); const rejectedTxHash = tx.hash; console.log(`rejectedTxHash (SEQUENCER): ${rejectedTxHash}`); diff --git a/package.json b/package.json index 658ddb57..81bd5e4d 100644 --- a/package.json +++ b/package.json @@ -28,5 +28,5 @@ "ts-node": "10.9.2", "typescript": "5.4.5" }, - "packageManager": "pnpm@9.1.1" + "packageManager": "pnpm@9.12.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14547a86..d9f4a559 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,7 +58,7 @@ importers: version: 2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)) '@web3modal/wagmi': specifier: 5.1.11 - version: 5.1.11(@types/react@18.3.11)(@wagmi/connectors@5.1.15(@types/react@18.3.11)(@wagmi/core@2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(@wagmi/core@2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(wagmi@2.12.17(@tanstack/query-core@5.59.0)(@tanstack/react-query@5.59.3(react@18.3.1))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)) + version: 5.1.11(goutzk3gneusg236sjtqizfusi) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -179,7 +179,7 @@ importers: version: 1.0.10(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(chai@4.1.1)(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.20)(@types/mocha@10.0.9)(@types/node@20.12.7)(chai@4.1.1)(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))(solidity-coverage@0.8.13(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(jyfxkil3vfakgnenb4mg6e5zke) '@nomicfoundation/hardhat-verify': specifier: 1.1.1 version: 1.1.1(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) @@ -267,6 +267,9 @@ importers: '@types/jest': specifier: 29.5.13 version: 29.5.13 + async-mutex: + specifier: ^0.5.0 + version: 0.5.0 child_process: specifier: 1.0.2 version: 1.0.2 @@ -555,14 +558,18 @@ packages: resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.7': - resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.25.7': resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.7': resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} @@ -575,8 +582,8 @@ packages: resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.25.7': - resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} '@babel/parser@7.25.7': @@ -3691,6 +3698,9 @@ packages: async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} @@ -9687,7 +9697,7 @@ snapshots: '@babel/code-frame@7.25.7': dependencies: - '@babel/highlight': 7.25.7 + '@babel/highlight': 7.25.9 picocolors: 1.1.0 '@babel/compat-data@7.25.7': {} @@ -9831,10 +9841,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.25.7': {} '@babel/helper-wrap-function@7.25.7': @@ -9850,9 +9862,9 @@ snapshots: '@babel/template': 7.25.7 '@babel/types': 7.25.7 - '@babel/highlight@7.25.7': + '@babel/highlight@7.25.9': dependencies: - '@babel/helper-validator-identifier': 7.25.7 + '@babel/helper-validator-identifier': 7.25.9 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.0 @@ -10606,7 +10618,7 @@ snapshots: '@babel/types@7.25.7': dependencies: - '@babel/helper-string-parser': 7.25.7 + '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 @@ -11877,8 +11889,8 @@ snapshots: ethereumjs-util: 7.1.5 hardhat: 2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10) - ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(chai@4.1.1)(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.20)(@types/mocha@10.0.9)(@types/node@20.12.7)(chai@4.1.1)(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10))(solidity-coverage@0.8.13(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' - : dependencies: + '@nomicfoundation/hardhat-toolbox@4.0.0(jyfxkil3vfakgnenb4mg6e5zke)': + dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)))(chai@4.1.1)(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.10(bufferutil@4.0.8)(c-kzg@2.1.2)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) @@ -14029,8 +14041,8 @@ snapshots: lit: 3.1.0 qrcode: 1.5.3 - ? '@web3modal/wagmi@5.1.11(@types/react@18.3.11)(@wagmi/connectors@5.1.15(@types/react@18.3.11)(@wagmi/core@2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))(@wagmi/core@2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(wagmi@2.12.17(@tanstack/query-core@5.59.0)(@tanstack/react-query@5.59.3(react@18.3.1))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4))' - : dependencies: + '@web3modal/wagmi@5.1.11(goutzk3gneusg236sjtqizfusi)': + dependencies: '@wagmi/connectors': 5.1.15(@types/react@18.3.11)(@wagmi/core@2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.4.5)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@wagmi/core': 2.13.8(@tanstack/query-core@5.59.0)(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.19(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.22.4)) '@walletconnect/ethereum-provider': 2.16.1(@types/react@18.3.11)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10) @@ -14329,6 +14341,10 @@ snapshots: dependencies: tslib: 2.7.0 + async-mutex@0.5.0: + dependencies: + tslib: 2.7.0 + async-retry@1.3.3: dependencies: retry: 0.13.1 @@ -15798,7 +15814,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -15811,7 +15827,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -15833,7 +15849,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 diff --git a/state-recover/clients/blobscan-client/build.gradle b/state-recover/clients/blobscan-client/build.gradle index 85641b92..1db52da1 100644 --- a/state-recover/clients/blobscan-client/build.gradle +++ b/state-recover/clients/blobscan-client/build.gradle @@ -47,7 +47,6 @@ task integrationTest(type: Test) { testClassesDirs = sourceSets.integrationTest.output.classesDirs dependsOn(":localStackComposeUp") - dependsOn(rootProject.tasks.compileContracts) testLogging { events TestLogEvent.FAILED,