From 65bd38951c654fae669b9aa14c40449ca69149ff Mon Sep 17 00:00:00 2001 From: Joe Pegler Date: Mon, 26 Aug 2024 12:13:55 +0100 Subject: [PATCH] chore: tidy --- .github/workflows/playground.yml | 2 - bun.lockb | Bin 344271 -> 351841 bytes package.json | 10 +- scripts/fetch:deployment.ts | 63 ++-- src/{contracts => __contracts}/README.md | 2 +- .../abi/EntryPointABI.ts | 0 .../abi/K1ValidatorAbi.ts | 0 .../abi/K1ValidatorFactoryAbi.ts | 8 +- .../abi/NexusAbi.ts | 37 +- src/{contracts => __contracts}/abi/index.ts | 1 - src/__contracts/addresses.ts | 7 + src/__contracts/index.ts | 36 ++ src/account/BaseSmartContractAccount.ts | 8 +- src/account/NexusSmartAccount.ts | 29 +- src/account/utils/Types.ts | 3 - src/bundler/Bundler.ts | 4 +- src/contracts/abi/MockExecutorAbi.ts | 309 ---------------- src/contracts/addresses.ts | 18 - src/contracts/index.ts | 42 --- src/modules/base/BaseModule.ts | 4 +- tests/README.md | 12 +- tests/{contracts => __contracts}/README.md | 0 .../abi/BiconomyMetaFactoryAbi.ts | 0 .../abi/BootstrapAbi.ts | 23 +- .../abi/BootstrapLibAbi.ts | 0 .../abi/MockRegistryAbi.ts | 0 tests/__contracts/abi/index.ts | 4 + tests/__contracts/addresses.ts | 8 + tests/__contracts/deployment.json | 23 ++ tests/contracts/abi/CounterAbi.ts | 36 -- tests/contracts/abi/K1ValidatorAbi.ts | 244 ------------- tests/contracts/abi/MockExecutorAbi.ts | 309 ---------------- tests/contracts/abi/MockHandlerAbi.ts | 227 ------------ tests/contracts/abi/MockHookAbi.ts | 133 ------- tests/contracts/abi/MockTokenAbi.ts | 344 ------------------ tests/contracts/abi/MockValidatorAbi.ts | 228 ------------ tests/contracts/abi/NexusAccountFactoryAbi.ts | 323 ---------------- tests/contracts/abi/StakeableAbi.ts | 211 ----------- tests/contracts/abi/index.ts | 11 - tests/contracts/deployment.json | 62 ---- tests/deploy.nexus.ts | 10 + tests/instances/account.test.ts | 79 ++-- tests/instances/bundler.test.ts | 77 ++-- tests/instances/hook.module.test.ts | 117 ------ tests/instances/modules.test.ts | 116 ------ tests/test.utils.ts | 247 ++----------- 46 files changed, 322 insertions(+), 3105 deletions(-) rename src/{contracts => __contracts}/README.md (54%) rename src/{contracts => __contracts}/abi/EntryPointABI.ts (100%) rename src/{contracts => __contracts}/abi/K1ValidatorAbi.ts (100%) rename src/{contracts => __contracts}/abi/K1ValidatorFactoryAbi.ts (98%) rename src/{contracts => __contracts}/abi/NexusAbi.ts (97%) rename src/{contracts => __contracts}/abi/index.ts (79%) create mode 100644 src/__contracts/addresses.ts create mode 100644 src/__contracts/index.ts delete mode 100644 src/contracts/abi/MockExecutorAbi.ts delete mode 100644 src/contracts/addresses.ts delete mode 100644 src/contracts/index.ts rename tests/{contracts => __contracts}/README.md (100%) rename tests/{contracts => __contracts}/abi/BiconomyMetaFactoryAbi.ts (100%) rename tests/{contracts => __contracts}/abi/BootstrapAbi.ts (97%) rename tests/{contracts => __contracts}/abi/BootstrapLibAbi.ts (100%) rename tests/{contracts => __contracts}/abi/MockRegistryAbi.ts (100%) create mode 100644 tests/__contracts/abi/index.ts create mode 100644 tests/__contracts/addresses.ts create mode 100644 tests/__contracts/deployment.json delete mode 100644 tests/contracts/abi/CounterAbi.ts delete mode 100644 tests/contracts/abi/K1ValidatorAbi.ts delete mode 100644 tests/contracts/abi/MockExecutorAbi.ts delete mode 100644 tests/contracts/abi/MockHandlerAbi.ts delete mode 100644 tests/contracts/abi/MockHookAbi.ts delete mode 100644 tests/contracts/abi/MockTokenAbi.ts delete mode 100644 tests/contracts/abi/MockValidatorAbi.ts delete mode 100644 tests/contracts/abi/NexusAccountFactoryAbi.ts delete mode 100644 tests/contracts/abi/StakeableAbi.ts delete mode 100644 tests/contracts/abi/index.ts delete mode 100644 tests/contracts/deployment.json create mode 100644 tests/deploy.nexus.ts delete mode 100644 tests/instances/hook.module.test.ts delete mode 100644 tests/instances/modules.test.ts diff --git a/.github/workflows/playground.yml b/.github/workflows/playground.yml index dd3e1845..58987fb7 100644 --- a/.github/workflows/playground.yml +++ b/.github/workflows/playground.yml @@ -1,8 +1,6 @@ name: playground on: workflow_dispatch: - pull_request: - types: [opened, reopened, synchronize, ready_for_review] jobs: playground: name: playground diff --git a/bun.lockb b/bun.lockb index e06d9aadb1e778a39136dab0de70f8034b2c8434..9e7dcd78bc3de101d1e3ca1b0bdfaa85307abc4a 100755 GIT binary patch delta 74358 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
    R;saj`kJ9<2khVw?Cy%5gA$fR&@QA_ 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 W!_Y(L;Vo{@FhnOjPB8qm?*9QceXrR7 diff --git a/package.json b/package.json index 02f69c9c..f1cb1320 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "sideEffects": false, "name": "@biconomy/sdk", "author": "Biconomy", - "version": "0.1.0", + "version": "0.0.1", "description": "SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.", "keywords": [ "erc-7579", @@ -92,18 +92,20 @@ "buffer": "^6.0.3", "concurrently": "^8.2.2", "dotenv": "^16.4.5", - "ethers": "^6.12.0", + "ethers": "^6.13.2", + "execa": "^9.3.1", "get-port": "^7.1.0", "gh-pages": "^6.1.1", + "nexus": "github:bcnmy/nexus#f08ec9f2d6cd2cf0044b901cc4c4a1cb5c527273", "prool": "^0.0.16", "rimraf": "^5.0.5", "simple-git-hooks": "^2.9.0", "size-limit": "^11", + "ts-node": "^10.9.2", "tsc-alias": "^1.8.8", "tslib": "^2.6.3", "typedoc": "^0.25.9", - "vitest": "^1.3.1", - "yargs": "^17.7.2" + "vitest": "^1.3.1" }, "peerDependencies": { "typescript": "^5", diff --git a/scripts/fetch:deployment.ts b/scripts/fetch:deployment.ts index c917f35c..b07a0556 100644 --- a/scripts/fetch:deployment.ts +++ b/scripts/fetch:deployment.ts @@ -1,20 +1,16 @@ -const fs = require("node:fs") -import yargs from "yargs" -import { hideBin } from "yargs/helpers" +import fs from "node:fs" -const { - pathToDeployment = "../../nexus/deployments", - deploymentChainName = "localhost", - abisInSrc = ["K1ValidatorFactory", "Nexus", "MockExecutor", "K1Validator"] -} = yargs(hideBin(process.argv)).argv +const pathToDeployment = "../../nexus/deployments" +const deploymentChainName = "anvil-55000" +const abisInSrc = ["K1ValidatorFactory", "Nexus", "K1Validator"] + +const relativePath = `${__dirname}/${pathToDeployment}/${deploymentChainName}` type DeployedContract = { address: string - bytecode: string } export const getDeployments = async () => { - const relativePath = `${__dirname}/${pathToDeployment}/${deploymentChainName}` const files = fs.readdirSync(relativePath) const deployedContracts: Record = {} @@ -29,7 +25,7 @@ export const getDeployments = async () => { `${relativePath}/${jsonFileNameWithExtension}`, "utf8" ) - const { address, abi, bytecode } = JSON.parse(contents) + const { address, abi } = JSON.parse(contents) const isForCore = abisInSrc.includes(name) if (isForCore) { @@ -45,14 +41,13 @@ export const getDeployments = async () => { )} as const;\n` const tsAbiPath = isForCore - ? `${__dirname}/../src/contracts/abi/${name}Abi.ts` - : `${__dirname}/../tests/contracts/abi/${name}Abi.ts` + ? `${__dirname}/../src/__contracts/abi/${name}Abi.ts` + : `${__dirname}/../tests/__contracts/abi/${name}Abi.ts` fs.writeFileSync(tsAbiPath, tsAbiContent) deployedContracts[name] = { - address, - bytecode + address } } } @@ -68,28 +63,40 @@ export const getDeployments = async () => { .join("\n")}` // Write the ABIs - const abiIndexPath = `${__dirname}/../src/contracts/abi/index.ts` + const abiIndexPath = `${__dirname}/../src/__contracts/abi/index.ts` fs.writeFileSync(abiIndexPath, abiIndexContent) - const testAbiIndexPath = `${__dirname}/../tests/contracts/abi/index.ts` + const testAbiIndexPath = `${__dirname}/../tests/__contracts/abi/index.ts` fs.writeFileSync(testAbiIndexPath, testAbiIndexContent) - // Write deployemts to tests folder - const writePath = `${__dirname}/../tests/contracts/deployment.json` - fs.writeFileSync(writePath, JSON.stringify(deployedContracts, null, 2)) - // Write addresses to src folder - const writeAddressesPath = `${__dirname}/../src/contracts/addresses.ts` - const addressesContent = `import type { Hex } from "viem"\nexport const deployedContracts: Record = ${JSON.stringify( - Object.keys(deployedContracts).reduce((acc, key) => { - acc[key] = deployedContracts[key].address - return acc - }, {}), + const writeAddressesPath = `${__dirname}/../src/__contracts/addresses.ts` + const writeAddressesPathTest = `${__dirname}/../tests/__contracts/addresses.ts` + + const addressesContent = `import type { Hex } from "viem"\nexport const addresses: Record = ${JSON.stringify( + Object.keys(deployedContracts) + .filter((key) => coreFiles.includes(key)) + .reduce((acc, key) => { + acc[key] = deployedContracts[key].address + return acc + }, {}), + null, + 2 + )} as const;\nexport default addresses\n` + + const testAddressesContent = `import type { Hex } from "viem"\nexport const addresses: Record = ${JSON.stringify( + Object.keys(deployedContracts) + .filter((key) => testFiles.includes(key)) + .reduce((acc, key) => { + acc[key] = deployedContracts[key].address + return acc + }, {}), null, 2 - )}\n` + )} as const;\nexport default addresses\n` fs.writeFileSync(writeAddressesPath, addressesContent) + fs.writeFileSync(writeAddressesPathTest, testAddressesContent) } // We recommend this pattern to be able to use async/await everywhere diff --git a/src/contracts/README.md b/src/__contracts/README.md similarity index 54% rename from src/contracts/README.md rename to src/__contracts/README.md index 08252073..d3a553ab 100644 --- a/src/contracts/README.md +++ b/src/__contracts/README.md @@ -1 +1 @@ -## The contents of this folder is auto-generated. Please do not edit as your changes are likely to become overwritten \ No newline at end of file +## The contents of this folder is auto-generated. Please do not edit as your changes are likely to be overwritten \ No newline at end of file diff --git a/src/contracts/abi/EntryPointABI.ts b/src/__contracts/abi/EntryPointABI.ts similarity index 100% rename from src/contracts/abi/EntryPointABI.ts rename to src/__contracts/abi/EntryPointABI.ts diff --git a/src/contracts/abi/K1ValidatorAbi.ts b/src/__contracts/abi/K1ValidatorAbi.ts similarity index 100% rename from src/contracts/abi/K1ValidatorAbi.ts rename to src/__contracts/abi/K1ValidatorAbi.ts diff --git a/src/contracts/abi/K1ValidatorFactoryAbi.ts b/src/__contracts/abi/K1ValidatorFactoryAbi.ts similarity index 98% rename from src/contracts/abi/K1ValidatorFactoryAbi.ts rename to src/__contracts/abi/K1ValidatorFactoryAbi.ts index cb64008e..f501b0a0 100644 --- a/src/contracts/abi/K1ValidatorFactoryAbi.ts +++ b/src/__contracts/abi/K1ValidatorFactoryAbi.ts @@ -229,22 +229,22 @@ export const K1ValidatorFactoryAbi = [ inputs: [ { internalType: "address", - name: "", + name: "eoaOwner", type: "address" }, { internalType: "uint256", - name: "", + name: "index", type: "uint256" }, { internalType: "address[]", - name: "", + name: "attesters", type: "address[]" }, { internalType: "uint8", - name: "", + name: "threshold", type: "uint8" } ], diff --git a/src/contracts/abi/NexusAbi.ts b/src/__contracts/abi/NexusAbi.ts similarity index 97% rename from src/contracts/abi/NexusAbi.ts rename to src/__contracts/abi/NexusAbi.ts index 49e298e3..5acc0e95 100644 --- a/src/contracts/abi/NexusAbi.ts +++ b/src/__contracts/abi/NexusAbi.ts @@ -17,7 +17,7 @@ export const NexusAbi = [ }, { inputs: [], - name: "CannotRemoveLastValidator", + name: "CanNotRemoveLastValidator", type: "error" }, { @@ -46,6 +46,11 @@ export const NexusAbi = [ name: "FallbackAlreadyInstalledForSelector", type: "error" }, + { + inputs: [], + name: "FallbackCallTypeInvalid", + type: "error" + }, { inputs: [], name: "FallbackHandlerUninstallFailed", @@ -221,6 +226,11 @@ export const NexusAbi = [ name: "NexusInitializationFailed", type: "error" }, + { + inputs: [], + name: "NoValidatorInstalled", + type: "error" + }, { inputs: [], name: "UnauthorizedCallContext", @@ -275,6 +285,17 @@ export const NexusAbi = [ name: "UpgradeFailed", type: "error" }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address" + } + ], + name: "ValidatorNotInstalled", + type: "error" + }, { anonymous: false, inputs: [ @@ -397,9 +418,9 @@ export const NexusAbi = [ inputs: [ { indexed: false, - internalType: "uint256", - name: "batchExecutionindex", - type: "uint256" + internalType: "bytes", + name: "callData", + type: "bytes" }, { indexed: false, @@ -416,9 +437,9 @@ export const NexusAbi = [ inputs: [ { indexed: false, - internalType: "uint256", - name: "batchExecutionindex", - type: "uint256" + internalType: "bytes", + name: "callData", + type: "bytes" }, { indexed: false, @@ -937,7 +958,7 @@ export const NexusAbi = [ ], name: "setRegistry", outputs: [], - stateMutability: "nonpayable", + stateMutability: "payable", type: "function" }, { diff --git a/src/contracts/abi/index.ts b/src/__contracts/abi/index.ts similarity index 79% rename from src/contracts/abi/index.ts rename to src/__contracts/abi/index.ts index 06577294..d0c8f155 100644 --- a/src/contracts/abi/index.ts +++ b/src/__contracts/abi/index.ts @@ -2,4 +2,3 @@ export * from "./EntryPointABI" export * from "./NexusAbi" export * from "./K1ValidatorAbi" export * from "./K1ValidatorFactoryAbi" -export * from "./MockExecutorAbi" diff --git a/src/__contracts/addresses.ts b/src/__contracts/addresses.ts new file mode 100644 index 00000000..d1e1edca --- /dev/null +++ b/src/__contracts/addresses.ts @@ -0,0 +1,7 @@ +import type { Hex } from "viem" +export const addresses: Record = { + Nexus: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + K1Validator: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + K1ValidatorFactory: "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" +} as const +export default addresses diff --git a/src/__contracts/index.ts b/src/__contracts/index.ts new file mode 100644 index 00000000..eae2c5a6 --- /dev/null +++ b/src/__contracts/index.ts @@ -0,0 +1,36 @@ +import type { Hex } from "viem" +import { EntrypointAbi, K1ValidatorAbi, K1ValidatorFactoryAbi } from "./abi" +import addresses from "./addresses" + +export const ENTRYPOINT_SIMULATIONS: Hex = + "0x74Cb5e4eE81b86e70f9045036a1C5477de69eE87" +export const ENTRYPOINT_ADDRESS: Hex = + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + +const entryPoint = { + address: ENTRYPOINT_ADDRESS, + abi: EntrypointAbi +} as const + +const entryPointSimulations = { + address: ENTRYPOINT_SIMULATIONS +} as const + +const k1ValidatorFactory = { + address: addresses.K1ValidatorFactory, + abi: K1ValidatorFactoryAbi +} as const + +const k1Validator = { + address: addresses.K1Validator, + abi: K1ValidatorAbi +} as const + +export const contracts = { + entryPoint, + entryPointSimulations, + k1ValidatorFactory, + k1Validator +} as const + +export default contracts diff --git a/src/account/BaseSmartContractAccount.ts b/src/account/BaseSmartContractAccount.ts index f3db2866..ee116552 100644 --- a/src/account/BaseSmartContractAccount.ts +++ b/src/account/BaseSmartContractAccount.ts @@ -9,8 +9,8 @@ import { getContract, trim } from "viem" -import contracts from "../contracts" -import { EntrypointAbi } from "../contracts/abi/EntryPointABI.js" +import { EntrypointAbi } from "../__contracts/abi/EntryPointABI.js" +import contracts from "../__contracts/index.js" import { Logger, type SmartAccountSigner } from "./index.js" import type { MODE_MODULE_ENABLE, MODE_VALIDATION } from "./utils/Constants.js" import type { @@ -43,7 +43,7 @@ export abstract class BaseSmartContractAccount< protected signer: TSigner protected entryPoint: GetContractReturnType< - typeof contracts.EntryPoint.abi, + typeof contracts.entryPoint.abi, PublicClient > @@ -53,7 +53,7 @@ export abstract class BaseSmartContractAccount< constructor(params: BaseSmartContractAccountProps) { this.entryPointAddress = - params.entryPointAddress ?? contracts.EntryPoint.address + params.entryPointAddress ?? contracts.entryPoint.address this.publicClient = createPublicClient({ chain: params.chain, diff --git a/src/account/NexusSmartAccount.ts b/src/account/NexusSmartAccount.ts index 0e5461f8..b941a919 100644 --- a/src/account/NexusSmartAccount.ts +++ b/src/account/NexusSmartAccount.ts @@ -20,6 +20,8 @@ import { parseAbiParameters, toBytes } from "viem" +import contracts from "../__contracts" +import { NexusAbi } from "../__contracts/abi" import { Bundler, Executions, @@ -29,8 +31,6 @@ import { } from "../bundler/index.js" import type { IBundler } from "../bundler/interfaces/IBundler.js" import { EXECUTE_BATCH, EXECUTE_SINGLE } from "../bundler/utils/Constants.js" -import contracts from "../contracts" -import { NexusAbi } from "../contracts/abi" import type { BaseExecutionModule } from "../modules/base/BaseExecutionModule.js" import { BaseValidationModule } from "../modules/base/BaseValidationModule.js" import { @@ -126,7 +126,7 @@ export class NexusSmartAccount extends BaseSmartContractAccount { ) { const resolvedEntryPointAddress = (nexusSmartAccountConfig.entryPointAddress as Hex) ?? - contracts.EntryPoint.address + contracts.entryPoint.address super({ ...nexusSmartAccountConfig, @@ -223,7 +223,7 @@ export class NexusSmartAccount extends BaseSmartContractAccount { const defaultedEntryPointAddress = (nexusSmartAccountConfig.entryPointAddress ?? - contracts.EntryPoint.address) as Hex + contracts.entryPoint.address) as Hex // Signer needs to be initialised here before defaultValidationModule is set if (nexusSmartAccountConfig.signer) { @@ -247,10 +247,10 @@ export class NexusSmartAccount extends BaseSmartContractAccount { const k1ValidatorAddress = nexusSmartAccountConfig.k1ValidatorAddress ?? - (contracts.K1Validator.address as Hex) + (contracts.k1Validator.address as Hex) const factoryAddress = nexusSmartAccountConfig.factoryAddress ?? - (contracts.K1ValidatorFactory.address as Hex) + (contracts.k1ValidatorFactory.address as Hex) if (!defaultValidationModule) { const newModule = await createK1ValidatorModule( @@ -289,7 +289,7 @@ export class NexusSmartAccount extends BaseSmartContractAccount { const index = params?.index ?? this.index this.accountAddress = (await this.publicClient.readContract({ address: this.factoryAddress, - abi: contracts.K1ValidatorFactory.abi, + abi: contracts.k1ValidatorFactory.abi, functionName: "computeAccountAddress", args: [signerAddress, index, [], 0] })) as Hex @@ -1421,14 +1421,11 @@ export class NexusSmartAccount extends BaseSmartContractAccount { userOp.signature = dummySignature - if (!buildUseropDto?.skipBundler) { - const gasFeeValues: GetUserOperationGasPriceReturnType | undefined = - await this.bundler?.getGasFeeValues() + const gasFeeValues: GetUserOperationGasPriceReturnType | undefined = + await this.bundler?.getGasFeeValues() - userOp.maxFeePerGas = gasFeeValues?.fast.maxFeePerGas ?? 0n - userOp.maxPriorityFeePerGas = - gasFeeValues?.fast.maxPriorityFeePerGas ?? 0n - } + userOp.maxFeePerGas = gasFeeValues?.fast.maxFeePerGas ?? 0n + userOp.maxPriorityFeePerGas = gasFeeValues?.fast.maxPriorityFeePerGas ?? 0n userOp = await this.estimateUserOpGas(userOp) @@ -1648,7 +1645,7 @@ export class NexusSmartAccount extends BaseSmartContractAccount { return this.sendTransaction( { to: accountAddress, - data: "0x" + value: 1n }, { ...buildUseropDto, useEmptyDeployCallData } ) @@ -1661,7 +1658,7 @@ export class NexusSmartAccount extends BaseSmartContractAccount { const signerAddress = await this.signer.getAddress() return encodeFunctionData({ - abi: contracts.K1ValidatorFactory.abi, + abi: contracts.k1ValidatorFactory.abi, functionName: "createAccount", args: [signerAddress, this.index, [], 0] }) diff --git a/src/account/utils/Types.ts b/src/account/utils/Types.ts index c5b6fe05..725eb7ec 100644 --- a/src/account/utils/Types.ts +++ b/src/account/utils/Types.ts @@ -209,7 +209,6 @@ export type BuildUserOpOptions = { dummyPndOverride?: BytesLike useEmptyDeployCallData?: boolean useExecutor?: boolean - skipBundler?: boolean } export type NonceOptions = { @@ -285,8 +284,6 @@ export type InitializeV2Data = { export type EstimateUserOpGasParams = { userOp: Partial - /** Currrently has no effect */ - // skipBundlerGasEstimation?: boolean; /** paymasterServiceData: Options specific to transactions that involve a paymaster */ paymasterServiceData?: SponsorUserOperationDto } diff --git a/src/bundler/Bundler.ts b/src/bundler/Bundler.ts index aad24e18..0d312652 100644 --- a/src/bundler/Bundler.ts +++ b/src/bundler/Bundler.ts @@ -1,7 +1,7 @@ import { http, type Hash, type PublicClient, createPublicClient } from "viem" +import contracts from "../__contracts/index.js" import type { UserOperationStruct } from "../account" import { HttpMethod, isNullOrUndefined, sendRequest } from "../account" -import contracts from "../contracts" import type { IBundler } from "./interfaces/IBundler.js" import { UserOpReceiptIntervals, @@ -79,7 +79,7 @@ export class Bundler implements IBundler { } this.bundlerConfig.entryPointAddress = - bundlerConfig.entryPointAddress || contracts.EntryPoint.address + bundlerConfig.entryPointAddress || contracts.entryPoint.address } public getBundlerUrl(): string { diff --git a/src/contracts/abi/MockExecutorAbi.ts b/src/contracts/abi/MockExecutorAbi.ts deleted file mode 100644 index ec9f7ba1..00000000 --- a/src/contracts/abi/MockExecutorAbi.ts +++ /dev/null @@ -1,309 +0,0 @@ -export const MockExecutorAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "bytes32", - name: "dataFirstWord", - type: "bytes32" - } - ], - name: "ExecutorOnInstallCalled", - type: "event" - }, - { - inputs: [ - { - internalType: "ExecutionMode", - name: "mode", - type: "bytes32" - }, - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "customExecuteViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "execDelegatecall", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - components: [ - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - internalType: "struct Execution[]", - name: "execs", - type: "tuple[]" - } - ], - name: "executeBatchViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "executeViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "getModuleTypes", - outputs: [ - { - internalType: "EncodedModuleTypes", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "isInitialized", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "uint256", - name: "moduleTypeId", - type: "uint256" - } - ], - name: "isModuleType", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onInstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onUninstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - components: [ - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - internalType: "struct Execution[]", - name: "execs", - type: "tuple[]" - } - ], - name: "tryExecuteBatchViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "tryExecuteViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - stateMutability: "payable", - type: "receive" - } -] as const diff --git a/src/contracts/addresses.ts b/src/contracts/addresses.ts deleted file mode 100644 index a1a798b6..00000000 --- a/src/contracts/addresses.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Hex } from "viem" -export const deployedContracts: Record = { - MockHook: "0xfef96a7D100FC9b4B389C1ECdFB2cA46a56aE0a1", - Stakeable: "0xc60F4C65a698C0FE5eddACfB71661B580D15BDaa", - Nexus: "0x84Dbc7E4D1d1743150550af447ADe0e31A52eb5f", - NexusAccountFactory: "0x7cebAEd7eA3A205AD3353C2FB945f1AFeC22CCe5", - BiconomyMetaFactory: "0x98C8792cf50A93900d575842eDAFf3Ccc2C2902b", - K1Validator: "0x2A5a15Ab95576c3a2aFfA1bE0f7447a079f184B9", - Counter: "0x36023f0abe27eC68fD2c6a489A3e21772A08E120", - K1ValidatorFactory: "0x85ffeEbDac4C8f6CC4D49f0CA1Cf63800F981b35", - MockValidator: "0xD30576213Ab84900E937481683D63FE8F3021799", - MockToken: "0x56623d18E54cBbCae340EC449E3c5D1DC0bF60cd", - BootstrapLib: "0x8F7560b30A1E2825005a0C69bccd2a70065d98Dd", - MockRegistry: "0x25D55884BFA6380B0fCDc9E924c495C44Aa46415", - MockHandler: "0xD981Bfa82Da48CC620892A4D927B47EB5384F2ef", - Bootstrap: "0xad8b572bFB1b4d5F258c65910D1C266a1284E448", - MockExecutor: "0x07be4ED2b8659807fd130bC7C761C50F81183e5c" -} diff --git a/src/contracts/index.ts b/src/contracts/index.ts deleted file mode 100644 index 451bc3ce..00000000 --- a/src/contracts/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { K1ValidatorAbi, MockExecutorAbi } from "./abi" -import { EntrypointAbi } from "./abi/EntryPointABI" -import { K1ValidatorFactoryAbi } from "./abi/K1ValidatorFactoryAbi" -import { deployedContracts } from "./addresses" - -export const ENTRYPOINT_SIMULATIONS = - "0x74Cb5e4eE81b86e70f9045036a1C5477de69eE87" -export const ENTRYPOINT_ADDRESS = "0x0000000071727De22E5E9d8BAf0edAc6f37da032" - -const EntryPoint = { - address: ENTRYPOINT_ADDRESS, - abi: EntrypointAbi -} as const - -const EntryPointSimulations = { - address: ENTRYPOINT_SIMULATIONS -} - -const K1ValidatorFactory = { - address: deployedContracts.K1ValidatorFactory, - abi: K1ValidatorFactoryAbi -} - -const MockExecutor = { - address: deployedContracts.MockExecutor, - abi: MockExecutorAbi -} - -const K1Validator = { - address: deployedContracts.K1Validator, - abi: K1ValidatorAbi -} - -export const contracts = { - EntryPoint, - EntryPointSimulations, - K1ValidatorFactory, - MockExecutor, - K1Validator -} as const - -export default contracts diff --git a/src/modules/base/BaseModule.ts b/src/modules/base/BaseModule.ts index f87b2f79..20eb272f 100644 --- a/src/modules/base/BaseModule.ts +++ b/src/modules/base/BaseModule.ts @@ -1,6 +1,6 @@ import { type Address, type Hex, encodeFunctionData, parseAbi } from "viem" +import contracts from "../../__contracts/index.js" import type { SmartAccountSigner } from "../../account/index.js" -import { ENTRYPOINT_ADDRESS } from "../../contracts/index.js" import { type Module, type ModuleType, @@ -15,7 +15,7 @@ export abstract class BaseModule { type: ModuleType hook?: Address version: ModuleVersion = "1.0.0-beta" - entryPoint: Address = ENTRYPOINT_ADDRESS + entryPoint: Address = contracts.entryPoint.address signer: SmartAccountSigner constructor(module: Module, signer: SmartAccountSigner) { diff --git a/tests/README.md b/tests/README.md index 542bdcf8..ddf6f3a3 100644 --- a/tests/README.md +++ b/tests/README.md @@ -2,6 +2,9 @@ ## Testing Setup +> **Note**: +> - Tests now must be run with node version >= v22 + ### Network Agnostic Tests - Tests are executed against locally deployed ephemeral Anvil chains (chain ID: 31337) with relevant contracts pre-deployed for each test. - Bundlers for testing are instantiated using [prool](https://github.com/wevm/prool), currently utilizing alto instances. We plan to switch to Biconomy's bundlers when they become available via `prool`. @@ -10,9 +13,9 @@ A custom script `bun run fetch:deployment` is provided to search for the bytecode of deployed contracts from a customizable location (default: `../../nexus/deployments`). This folder is **auto-generated** in Nexus whenever a new Hardhat deployment is made, ensuring that the SDK remains up-to-date with the latest contract changes. The script performs the following: -- **ABIs**: Moved to `./src/contracts/{name}Abi.ts` +- **ABIs**: Moved to `./src/__contracts/{name}Abi.ts` - **Addresses**: Moved to `./src/addresses.ts` -- **Additional Fixtures**: Copied to `tests/contracts` +- **Additional Fixtures**: Copied to `tests__/contracts` > **Note**: > - Do not edit these files manually; they will be overridden if/when a new Nexus deployment occurs. @@ -23,7 +26,7 @@ The script performs the following: To prevent tests from conflicting with one another, networks can be scoped at three levels: ### Global Scope -- Use by setting `const NETWORK_TYPE: TestFileNetworkType = "GLOBAL"` at the top of the test file. +- Use by setting `const NETWORK_TYPE: TestFileNetworkType = "LOCAL"` at the top of the test file. - Suitable when you're sure that tests in the file will **not** conflict with other tests using the global network. ### Local Scope @@ -56,3 +59,6 @@ scopedTest("should be used in the following way", async({ config: { bundlerUrl, ## Debugging and Client Issues It is recommended to use the playground for debugging issues with clients. Please refer to the following guidelines for escalation and handover: [Debugging Client Issues](https://www.notion.so/biconomy/Debugging-Client-Issues-cc01c1cab0224c87b37a4d283370165b) +## Testing Helpers +A [testClient](https://viem.sh/docs/clients/test#extending-with-public--wallet-actions) is available (funded and extended with walletActions and publicActions) during testing. Please use it as a master Client for all things network related. + diff --git a/tests/contracts/README.md b/tests/__contracts/README.md similarity index 100% rename from tests/contracts/README.md rename to tests/__contracts/README.md diff --git a/tests/contracts/abi/BiconomyMetaFactoryAbi.ts b/tests/__contracts/abi/BiconomyMetaFactoryAbi.ts similarity index 100% rename from tests/contracts/abi/BiconomyMetaFactoryAbi.ts rename to tests/__contracts/abi/BiconomyMetaFactoryAbi.ts diff --git a/tests/contracts/abi/BootstrapAbi.ts b/tests/__contracts/abi/BootstrapAbi.ts similarity index 97% rename from tests/contracts/abi/BootstrapAbi.ts rename to tests/__contracts/abi/BootstrapAbi.ts index 86d355ae..42f6c45a 100644 --- a/tests/contracts/abi/BootstrapAbi.ts +++ b/tests/__contracts/abi/BootstrapAbi.ts @@ -1,7 +1,7 @@ export const BootstrapAbi = [ { inputs: [], - name: "CannotRemoveLastValidator", + name: "CanNotRemoveLastValidator", type: "error" }, { @@ -20,6 +20,11 @@ export const BootstrapAbi = [ name: "FallbackAlreadyInstalledForSelector", type: "error" }, + { + inputs: [], + name: "FallbackCallTypeInvalid", + type: "error" + }, { inputs: [], name: "FallbackHandlerUninstallFailed", @@ -170,6 +175,11 @@ export const BootstrapAbi = [ name: "ModuleNotInstalled", type: "error" }, + { + inputs: [], + name: "NoValidatorInstalled", + type: "error" + }, { inputs: [ { @@ -181,6 +191,17 @@ export const BootstrapAbi = [ name: "UnauthorizedOperation", type: "error" }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address" + } + ], + name: "ValidatorNotInstalled", + type: "error" + }, { anonymous: false, inputs: [ diff --git a/tests/contracts/abi/BootstrapLibAbi.ts b/tests/__contracts/abi/BootstrapLibAbi.ts similarity index 100% rename from tests/contracts/abi/BootstrapLibAbi.ts rename to tests/__contracts/abi/BootstrapLibAbi.ts diff --git a/tests/contracts/abi/MockRegistryAbi.ts b/tests/__contracts/abi/MockRegistryAbi.ts similarity index 100% rename from tests/contracts/abi/MockRegistryAbi.ts rename to tests/__contracts/abi/MockRegistryAbi.ts diff --git a/tests/__contracts/abi/index.ts b/tests/__contracts/abi/index.ts new file mode 100644 index 00000000..011ff2d1 --- /dev/null +++ b/tests/__contracts/abi/index.ts @@ -0,0 +1,4 @@ +export * from "./BiconomyMetaFactoryAbi" +export * from "./BootstrapLibAbi" +export * from "./MockRegistryAbi" +export * from "./BootstrapAbi" diff --git a/tests/__contracts/addresses.ts b/tests/__contracts/addresses.ts new file mode 100644 index 00000000..6299bad4 --- /dev/null +++ b/tests/__contracts/addresses.ts @@ -0,0 +1,8 @@ +import type { Hex } from "viem" +export const addresses: Record = { + BiconomyMetaFactory: "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + BootstrapLib: "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", + MockRegistry: "0x0165878A594ca255338adfa4d48449f69242Eb8F", + Bootstrap: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +} as const +export default addresses diff --git a/tests/__contracts/deployment.json b/tests/__contracts/deployment.json new file mode 100644 index 00000000..15474835 --- /dev/null +++ b/tests/__contracts/deployment.json @@ -0,0 +1,23 @@ +{ + "Nexus": { + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" + }, + "BiconomyMetaFactory": { + "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" + }, + "K1Validator": { + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" + }, + "K1ValidatorFactory": { + "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" + }, + "BootstrapLib": { + "address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707" + }, + "MockRegistry": { + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F" + }, + "Bootstrap": { + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" + } +} diff --git a/tests/contracts/abi/CounterAbi.ts b/tests/contracts/abi/CounterAbi.ts deleted file mode 100644 index 93c3650e..00000000 --- a/tests/contracts/abi/CounterAbi.ts +++ /dev/null @@ -1,36 +0,0 @@ -export const CounterAbi = [ - { - inputs: [], - name: "decrementNumber", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "getNumber", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "incrementNumber", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "revertOperation", - outputs: [], - stateMutability: "pure", - type: "function" - } -] as const diff --git a/tests/contracts/abi/K1ValidatorAbi.ts b/tests/contracts/abi/K1ValidatorAbi.ts deleted file mode 100644 index bcbbcfb9..00000000 --- a/tests/contracts/abi/K1ValidatorAbi.ts +++ /dev/null @@ -1,244 +0,0 @@ -export const K1ValidatorAbi = [ - { - inputs: [], - name: "ModuleAlreadyInitialized", - type: "error" - }, - { - inputs: [], - name: "NewOwnerIsContract", - type: "error" - }, - { - inputs: [], - name: "NoOwnerProvided", - type: "error" - }, - { - inputs: [], - name: "ZeroAddressNotAllowed", - type: "error" - }, - { - inputs: [ - { - internalType: "address", - name: "smartAccount", - type: "address" - } - ], - name: "isInitialized", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "uint256", - name: "typeID", - type: "uint256" - } - ], - name: "isModuleType", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - }, - { - internalType: "bytes32", - name: "hash", - type: "bytes32" - }, - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "isValidSignatureWithSender", - outputs: [ - { - internalType: "bytes4", - name: "", - type: "bytes4" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "name", - outputs: [ - { - internalType: "string", - name: "", - type: "string" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onInstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "", - type: "bytes" - } - ], - name: "onUninstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "smartAccountOwners", - outputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "newOwner", - type: "address" - } - ], - name: "transferOwnership", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - components: [ - { - internalType: "address", - name: "sender", - type: "address" - }, - { - internalType: "uint256", - name: "nonce", - type: "uint256" - }, - { - internalType: "bytes", - name: "initCode", - type: "bytes" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - }, - { - internalType: "bytes32", - name: "accountGasLimits", - type: "bytes32" - }, - { - internalType: "uint256", - name: "preVerificationGas", - type: "uint256" - }, - { - internalType: "bytes32", - name: "gasFees", - type: "bytes32" - }, - { - internalType: "bytes", - name: "paymasterAndData", - type: "bytes" - }, - { - internalType: "bytes", - name: "signature", - type: "bytes" - } - ], - internalType: "struct PackedUserOperation", - name: "userOp", - type: "tuple" - }, - { - internalType: "bytes32", - name: "userOpHash", - type: "bytes32" - } - ], - name: "validateUserOp", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "version", - outputs: [ - { - internalType: "string", - name: "", - type: "string" - } - ], - stateMutability: "pure", - type: "function" - } -] as const diff --git a/tests/contracts/abi/MockExecutorAbi.ts b/tests/contracts/abi/MockExecutorAbi.ts deleted file mode 100644 index ec9f7ba1..00000000 --- a/tests/contracts/abi/MockExecutorAbi.ts +++ /dev/null @@ -1,309 +0,0 @@ -export const MockExecutorAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "bytes32", - name: "dataFirstWord", - type: "bytes32" - } - ], - name: "ExecutorOnInstallCalled", - type: "event" - }, - { - inputs: [ - { - internalType: "ExecutionMode", - name: "mode", - type: "bytes32" - }, - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "customExecuteViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "execDelegatecall", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - components: [ - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - internalType: "struct Execution[]", - name: "execs", - type: "tuple[]" - } - ], - name: "executeBatchViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "executeViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "getModuleTypes", - outputs: [ - { - internalType: "EncodedModuleTypes", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "isInitialized", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "uint256", - name: "moduleTypeId", - type: "uint256" - } - ], - name: "isModuleType", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onInstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onUninstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - components: [ - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - internalType: "struct Execution[]", - name: "execs", - type: "tuple[]" - } - ], - name: "tryExecuteBatchViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "contract INexus", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "target", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - } - ], - name: "tryExecuteViaAccount", - outputs: [ - { - internalType: "bytes[]", - name: "returnData", - type: "bytes[]" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - stateMutability: "payable", - type: "receive" - } -] as const diff --git a/tests/contracts/abi/MockHandlerAbi.ts b/tests/contracts/abi/MockHandlerAbi.ts deleted file mode 100644 index 0daeaab6..00000000 --- a/tests/contracts/abi/MockHandlerAbi.ts +++ /dev/null @@ -1,227 +0,0 @@ -export const MockHandlerAbi = [ - { - inputs: [ - { - internalType: "bytes4", - name: "selector", - type: "bytes4" - } - ], - name: "NonExistingMethodCalled", - type: "error" - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "sender", - type: "address" - }, - { - indexed: false, - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - indexed: false, - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "GenericFallbackCalled", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "bytes32", - name: "dataFirstWord", - type: "bytes32" - } - ], - name: "HandlerOnInstallCalled", - type: "event" - }, - { - stateMutability: "nonpayable", - type: "fallback" - }, - { - inputs: [], - name: "NAME", - outputs: [ - { - internalType: "string", - name: "", - type: "string" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "VERSION", - outputs: [ - { - internalType: "string", - name: "", - type: "string" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "count", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "getState", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "isInitialized", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "uint256", - name: "moduleTypeId", - type: "uint256" - } - ], - name: "isModuleType", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "sender", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - }, - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onGenericFallback", - outputs: [ - { - internalType: "bytes4", - name: "", - type: "bytes4" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onInstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onUninstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "revertingFunction", - outputs: [], - stateMutability: "pure", - type: "function" - }, - { - inputs: [], - name: "stateChangingFunction", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "successFunction", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32" - } - ], - stateMutability: "pure", - type: "function" - } -] as const diff --git a/tests/contracts/abi/MockHookAbi.ts b/tests/contracts/abi/MockHookAbi.ts deleted file mode 100644 index 11b57fab..00000000 --- a/tests/contracts/abi/MockHookAbi.ts +++ /dev/null @@ -1,133 +0,0 @@ -export const MockHookAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "bytes32", - name: "dataFirstWord", - type: "bytes32" - } - ], - name: "HookOnInstallCalled", - type: "event" - }, - { - anonymous: false, - inputs: [], - name: "PostCheckCalled", - type: "event" - }, - { - anonymous: false, - inputs: [], - name: "PreCheckCalled", - type: "event" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "isInitialized", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "uint256", - name: "moduleTypeId", - type: "uint256" - } - ], - name: "isModuleType", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onInstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "", - type: "bytes" - } - ], - name: "onUninstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "hookData", - type: "bytes" - } - ], - name: "postCheck", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - }, - { - internalType: "uint256", - name: "", - type: "uint256" - }, - { - internalType: "bytes", - name: "", - type: "bytes" - } - ], - name: "preCheck", - outputs: [ - { - internalType: "bytes", - name: "", - type: "bytes" - } - ], - stateMutability: "nonpayable", - type: "function" - } -] as const diff --git a/tests/contracts/abi/MockTokenAbi.ts b/tests/contracts/abi/MockTokenAbi.ts deleted file mode 100644 index 213ee0cf..00000000 --- a/tests/contracts/abi/MockTokenAbi.ts +++ /dev/null @@ -1,344 +0,0 @@ -export const MockTokenAbi = [ - { - inputs: [ - { - internalType: "string", - name: "name", - type: "string" - }, - { - internalType: "string", - name: "symbol", - type: "string" - } - ], - stateMutability: "nonpayable", - type: "constructor" - }, - { - inputs: [ - { - internalType: "address", - name: "spender", - type: "address" - }, - { - internalType: "uint256", - name: "allowance", - type: "uint256" - }, - { - internalType: "uint256", - name: "needed", - type: "uint256" - } - ], - name: "ERC20InsufficientAllowance", - type: "error" - }, - { - inputs: [ - { - internalType: "address", - name: "sender", - type: "address" - }, - { - internalType: "uint256", - name: "balance", - type: "uint256" - }, - { - internalType: "uint256", - name: "needed", - type: "uint256" - } - ], - name: "ERC20InsufficientBalance", - type: "error" - }, - { - inputs: [ - { - internalType: "address", - name: "approver", - type: "address" - } - ], - name: "ERC20InvalidApprover", - type: "error" - }, - { - inputs: [ - { - internalType: "address", - name: "receiver", - type: "address" - } - ], - name: "ERC20InvalidReceiver", - type: "error" - }, - { - inputs: [ - { - internalType: "address", - name: "sender", - type: "address" - } - ], - name: "ERC20InvalidSender", - type: "error" - }, - { - inputs: [ - { - internalType: "address", - name: "spender", - type: "address" - } - ], - name: "ERC20InvalidSpender", - type: "error" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "owner", - type: "address" - }, - { - indexed: true, - internalType: "address", - name: "spender", - type: "address" - }, - { - indexed: false, - internalType: "uint256", - name: "value", - type: "uint256" - } - ], - name: "Approval", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "from", - type: "address" - }, - { - indexed: true, - internalType: "address", - name: "to", - type: "address" - }, - { - indexed: false, - internalType: "uint256", - name: "value", - type: "uint256" - } - ], - name: "Transfer", - type: "event" - }, - { - inputs: [ - { - internalType: "address", - name: "owner", - type: "address" - }, - { - internalType: "address", - name: "spender", - type: "address" - } - ], - name: "allowance", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "spender", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - } - ], - name: "approve", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "account", - type: "address" - } - ], - name: "balanceOf", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "decimals", - outputs: [ - { - internalType: "uint8", - name: "", - type: "uint8" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "sender", - type: "address" - }, - { - internalType: "uint256", - name: "amount", - type: "uint256" - } - ], - name: "mint", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [], - name: "name", - outputs: [ - { - internalType: "string", - name: "", - type: "string" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "symbol", - outputs: [ - { - internalType: "string", - name: "", - type: "string" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "totalSupply", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "to", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - } - ], - name: "transfer", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "from", - type: "address" - }, - { - internalType: "address", - name: "to", - type: "address" - }, - { - internalType: "uint256", - name: "value", - type: "uint256" - } - ], - name: "transferFrom", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "nonpayable", - type: "function" - } -] as const diff --git a/tests/contracts/abi/MockValidatorAbi.ts b/tests/contracts/abi/MockValidatorAbi.ts deleted file mode 100644 index d3ae3504..00000000 --- a/tests/contracts/abi/MockValidatorAbi.ts +++ /dev/null @@ -1,228 +0,0 @@ -export const MockValidatorAbi = [ - { - inputs: [ - { - internalType: "address", - name: "account", - type: "address" - } - ], - name: "getOwner", - outputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "isInitialized", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "uint256", - name: "moduleTypeId", - type: "uint256" - } - ], - name: "isModuleType", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "pure", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "account", - type: "address" - }, - { - internalType: "address", - name: "owner", - type: "address" - } - ], - name: "isOwner", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - }, - { - internalType: "bytes32", - name: "hash", - type: "bytes32" - }, - { - internalType: "bytes", - name: "signature", - type: "bytes" - } - ], - name: "isValidSignatureWithSender", - outputs: [ - { - internalType: "bytes4", - name: "", - type: "bytes4" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onInstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "data", - type: "bytes" - } - ], - name: "onUninstall", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - name: "smartAccountOwners", - outputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - components: [ - { - internalType: "address", - name: "sender", - type: "address" - }, - { - internalType: "uint256", - name: "nonce", - type: "uint256" - }, - { - internalType: "bytes", - name: "initCode", - type: "bytes" - }, - { - internalType: "bytes", - name: "callData", - type: "bytes" - }, - { - internalType: "bytes32", - name: "accountGasLimits", - type: "bytes32" - }, - { - internalType: "uint256", - name: "preVerificationGas", - type: "uint256" - }, - { - internalType: "bytes32", - name: "gasFees", - type: "bytes32" - }, - { - internalType: "bytes", - name: "paymasterAndData", - type: "bytes" - }, - { - internalType: "bytes", - name: "signature", - type: "bytes" - } - ], - internalType: "struct PackedUserOperation", - name: "userOp", - type: "tuple" - }, - { - internalType: "bytes32", - name: "userOpHash", - type: "bytes32" - } - ], - name: "validateUserOp", - outputs: [ - { - internalType: "uint256", - name: "validation", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - } -] as const diff --git a/tests/contracts/abi/NexusAccountFactoryAbi.ts b/tests/contracts/abi/NexusAccountFactoryAbi.ts deleted file mode 100644 index f5f1fc7d..00000000 --- a/tests/contracts/abi/NexusAccountFactoryAbi.ts +++ /dev/null @@ -1,323 +0,0 @@ -export const NexusAccountFactoryAbi = [ - { - inputs: [ - { - internalType: "address", - name: "implementation_", - type: "address" - }, - { - internalType: "address", - name: "owner_", - type: "address" - } - ], - stateMutability: "nonpayable", - type: "constructor" - }, - { - inputs: [ - { - internalType: "address", - name: "account", - type: "address" - } - ], - name: "AccountAlreadyDeployed", - type: "error" - }, - { - inputs: [], - name: "AlreadyInitialized", - type: "error" - }, - { - inputs: [], - name: "ImplementationAddressCanNotBeZero", - type: "error" - }, - { - inputs: [], - name: "InvalidEntryPointAddress", - type: "error" - }, - { - inputs: [], - name: "NewOwnerIsZeroAddress", - type: "error" - }, - { - inputs: [], - name: "NoHandoverRequest", - type: "error" - }, - { - inputs: [], - name: "Unauthorized", - type: "error" - }, - { - inputs: [], - name: "ZeroAddressNotAllowed", - type: "error" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "account", - type: "address" - }, - { - indexed: true, - internalType: "bytes", - name: "initData", - type: "bytes" - }, - { - indexed: true, - internalType: "bytes32", - name: "salt", - type: "bytes32" - } - ], - name: "AccountCreated", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "OwnershipHandoverCanceled", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "OwnershipHandoverRequested", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "oldOwner", - type: "address" - }, - { - indexed: true, - internalType: "address", - name: "newOwner", - type: "address" - } - ], - name: "OwnershipTransferred", - type: "event" - }, - { - inputs: [], - name: "ACCOUNT_IMPLEMENTATION", - outputs: [ - { - internalType: "address", - name: "", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "epAddress", - type: "address" - }, - { - internalType: "uint32", - name: "unstakeDelaySec", - type: "uint32" - } - ], - name: "addStake", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [], - name: "cancelOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "completeOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "", - type: "bytes" - }, - { - internalType: "bytes32", - name: "", - type: "bytes32" - } - ], - name: "computeAccountAddress", - outputs: [ - { - internalType: "address payable", - name: "expectedAddress", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "bytes", - name: "initData", - type: "bytes" - }, - { - internalType: "bytes32", - name: "salt", - type: "bytes32" - } - ], - name: "createAccount", - outputs: [ - { - internalType: "address payable", - name: "", - type: "address" - } - ], - stateMutability: "payable", - type: "function" - }, - { - inputs: [], - name: "owner", - outputs: [ - { - internalType: "address", - name: "result", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "ownershipHandoverExpiresAt", - outputs: [ - { - internalType: "uint256", - name: "result", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "renounceOwnership", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [], - name: "requestOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "newOwner", - type: "address" - } - ], - name: "transferOwnership", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "epAddress", - type: "address" - } - ], - name: "unlockStake", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "epAddress", - type: "address" - }, - { - internalType: "address payable", - name: "withdrawAddress", - type: "address" - } - ], - name: "withdrawStake", - outputs: [], - stateMutability: "nonpayable", - type: "function" - } -] as const diff --git a/tests/contracts/abi/StakeableAbi.ts b/tests/contracts/abi/StakeableAbi.ts deleted file mode 100644 index 9dc5da90..00000000 --- a/tests/contracts/abi/StakeableAbi.ts +++ /dev/null @@ -1,211 +0,0 @@ -export const StakeableAbi = [ - { - inputs: [ - { - internalType: "address", - name: "newOwner", - type: "address" - } - ], - stateMutability: "nonpayable", - type: "constructor" - }, - { - inputs: [], - name: "AlreadyInitialized", - type: "error" - }, - { - inputs: [], - name: "InvalidEntryPointAddress", - type: "error" - }, - { - inputs: [], - name: "NewOwnerIsZeroAddress", - type: "error" - }, - { - inputs: [], - name: "NoHandoverRequest", - type: "error" - }, - { - inputs: [], - name: "Unauthorized", - type: "error" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "OwnershipHandoverCanceled", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "OwnershipHandoverRequested", - type: "event" - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "oldOwner", - type: "address" - }, - { - indexed: true, - internalType: "address", - name: "newOwner", - type: "address" - } - ], - name: "OwnershipTransferred", - type: "event" - }, - { - inputs: [ - { - internalType: "address", - name: "epAddress", - type: "address" - }, - { - internalType: "uint32", - name: "unstakeDelaySec", - type: "uint32" - } - ], - name: "addStake", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [], - name: "cancelOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "completeOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [], - name: "owner", - outputs: [ - { - internalType: "address", - name: "result", - type: "address" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "pendingOwner", - type: "address" - } - ], - name: "ownershipHandoverExpiresAt", - outputs: [ - { - internalType: "uint256", - name: "result", - type: "uint256" - } - ], - stateMutability: "view", - type: "function" - }, - { - inputs: [], - name: "renounceOwnership", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [], - name: "requestOwnershipHandover", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "newOwner", - type: "address" - } - ], - name: "transferOwnership", - outputs: [], - stateMutability: "payable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "epAddress", - type: "address" - } - ], - name: "unlockStake", - outputs: [], - stateMutability: "nonpayable", - type: "function" - }, - { - inputs: [ - { - internalType: "address", - name: "epAddress", - type: "address" - }, - { - internalType: "address payable", - name: "withdrawAddress", - type: "address" - } - ], - name: "withdrawStake", - outputs: [], - stateMutability: "nonpayable", - type: "function" - } -] as const diff --git a/tests/contracts/abi/index.ts b/tests/contracts/abi/index.ts deleted file mode 100644 index 17426200..00000000 --- a/tests/contracts/abi/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from "./MockHookAbi" -export * from "./StakeableAbi" -export * from "./NexusAccountFactoryAbi" -export * from "./BiconomyMetaFactoryAbi" -export * from "./CounterAbi" -export * from "./MockValidatorAbi" -export * from "./MockTokenAbi" -export * from "./BootstrapLibAbi" -export * from "./MockRegistryAbi" -export * from "./MockHandlerAbi" -export * from "./BootstrapAbi" diff --git a/tests/contracts/deployment.json b/tests/contracts/deployment.json deleted file mode 100644 index ab70f550..00000000 --- a/tests/contracts/deployment.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "MockHook": { - "address": "0xfef96a7D100FC9b4B389C1ECdFB2cA46a56aE0a1", - "bytecode": "0x608080604052346015576103ad908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c908163173bf7da146102225781636d61fe701461029a575080638a91b0e314610222578063d60b347f146101df578063d68f6025146100a35763ecd059611461006157600080fd5b3461009e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009e57602060405160048035148152f35b600080fd5b3461009e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009e576100da610354565b5060443567ffffffffffffffff811161009e576100fb903690600401610326565b50506040517f9cfcecc93749ff1f68fdcbc9d06f1e4b649fe26c0f3b7eb28f812853952df89e600080a16020810181811067ffffffffffffffff8211176101b0576040526000815260405190602082528181519182602083015260005b8381106101985750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610158565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461009e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009e57610216610354565b50602060405160008152f35b3461009e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009e5760043567ffffffffffffffff811161009e57610271903690600401610326565b50507f4fe6b98bcb5f3f4e11f2cb49cfe134ffdd4a18546f6a3bdc15d6503645e144ac600080a1005b3461009e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009e5760043567ffffffffffffffff811161009e576102e9903690600401610326565b60208110156102f457005b60201161009e577f14e90641f423866d7177454e587228d86b9edce2f3a3323e7b2c70598df176b191602091358152a1005b9181601f8401121561009e5782359167ffffffffffffffff831161009e576020838186019501011161009e57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361009e5756fea2646970667358221220a7632c3d3ba5674614ce11a9ed6c206d5b0f888f2915437c2f2afcedfb5a91d864736f6c634300081a0033" - }, - "Stakeable": { - "address": "0xc60F4C65a698C0FE5eddACfB71661B580D15BDaa", - "bytecode": "0x608034609057601f61087738819003918201601f19168301916001600160401b03831184841017609557808492602094604052833981010312609057516001600160a01b0381169081900360905780638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d819556040516107cb90816100ac8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c806325692962146105da57806345171159146104db5780634a1ce5991461043557806354d1f13d146103d1578063715018a6146103325780638da5cb5b146102c1578063b36f9705146101a7578063f04e283e1461013b578063f2fde38b146100de5763fee81cf41461008b57600080fd5b346100db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db576100c2610643565b9063389a75e1600c5252602080600c2054604051908152f35b80fd5b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db57610111610643565b6101196106db565b8060601b1561012e5761012b90610713565b80f35b637448fbae82526004601cfd5b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db5761016e610643565b6101766106db565b63389a75e1600c528082526020600c208054421161019a57908261012b9255610713565b636f5e881883526004601cfd5b50346100db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db576101df610643565b906024359173ffffffffffffffffffffffffffffffffffffffff83168093036102bd5773ffffffffffffffffffffffffffffffffffffffff906102206106db565b168015610295578192813b156102915782916024839260405194859384927fc23a5cea00000000000000000000000000000000000000000000000000000000845260048401525af18015610286576102755750f35b8161027f9161066b565b6100db5780f35b6040513d84823e3d90fd5b5050fd5b6004827f91fdf191000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b50346100db57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db5760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b50807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db576103646106db565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275580f35b50807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b50346100db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db5773ffffffffffffffffffffffffffffffffffffffff610482610643565b61048a6106db565b168015610295578082913b156104d8578180916004604051809481937fbb9fe6bf0000000000000000000000000000000000000000000000000000000083525af18015610286576102755750f35b50fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db5761050e610643565b6024359063ffffffff82168092036105d65773ffffffffffffffffffffffffffffffffffffffff9061053e6106db565b169081156105ae578290823b156102bd5781906024604051809581937f0396cb60000000000000000000000000000000000000000000000000000000008352600483015234905af180156105a1576105935780f35b61059c9161066b565b388180f35b50604051903d90823e3d90fd5b6004837f91fdf191000000000000000000000000000000000000000000000000000000008152fd5b8280fd5b50807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100db5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361066657565b600080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106ac57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361070557565b6382b429006000526004601cfd5b73ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275556fea264697066735822122065db8b72f59184aea7b3fbbe6352c6cddbaf1f95250d3f7b695582df25592ec564736f6c634300081a0033" - }, - "Nexus": { - "address": "0x84Dbc7E4D1d1743150550af447ADe0e31A52eb5f", - "bytecode": "0x610180604052346102e157600061635c6020813803918261001f816102e6565b9384928339810103126102dd5751906001600160a01b038216908183036102da5760a0903060805246825261005460406102e6565b6005815260208101644e6578757360d81b815261007160406102e6565b90600a8252602082019269312e302e302d6265746160b01b845251902092505190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005230610140523061016052156102c9576101205260016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0160205260008051602061633c833981519152546001600160a01b03166102b8576001600081905260008051602061633c83398151915280546001600160a01b03191690911790557f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0060205260008051602061631c833981519152546001600160a01b03166102b857600160008190527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0060205260008051602061631c83398151915280546001600160a01b0319169091179055604051615ffa908161032282396080518181816106580152613aa3015260a0518181816106350152613a80015260c0518181816106ba0152613b17015260e0518181816106e00152613b3d0152610100518181816106130152613a5e01526101205181818161058e0152818161088101528181610a7001528181610b6c015281816112c40152818161140b015281816116ba015281816119120152818161197b01528181611e7501528181611f09015261325d015261014051818181610bd50152610d11015261016051815050f35b6329e42f3360e11b60005260046000fd5b6307e355bf60e31b60005260046000fd5b80fd5b5080fd5b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761030b57604052565b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001e575b361561001c5761001c6133a8565b005b60003560e01c80630a664dba146101fe578063112d3a7d146101f95780631626ba7e146101f457806319822f7c146101ef5780633644e515146101ea578063481ddd23146101e55780634a58db19146101e05780634b6a1419146101db5780634d44560d146101d65780634f1ef286146101d157806352d1902d146101cc5780635faac46b146101c75780636575f6aa146101c25780637b103999146101bd57806384b0196e146101b85780638dd7712f146101b35780639517e29f146101ae5780639cfd7cff146101a9578063a71763a8146101a4578063aaf10f421461019f578063b0d691fe1461019a578063c399ec8814610195578063d03c791414610190578063d620c85a1461018b578063d691c96414610186578063d86f2b3c14610181578063e9ae5c531461017c578063ea5f61d014610177578063eab77e17146101725763f2dc691d0361000e5761229b565b612204565b612089565b611ee8565b611dd2565b611c50565b611b2b565b6119ac565b611936565b6118c7565b611830565b611698565b61161b565b6113e8565b611260565b61116a565b6110b2565b61106e565b610dd1565b610cdf565b610afd565b610a33565b6108a9565b61084f565b610745565b6105e2565b610515565b610377565b610351565b610213565b600091031261020e57565b600080fd5b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57602073ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541673ffffffffffffffffffffffffffffffffffffffff60405191168152f35b73ffffffffffffffffffffffffffffffffffffffff81160361020e57565b35906102c38261029a565b565b9181601f8401121561020e5782359167ffffffffffffffff831161020e576020838186019501011161020e57565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261020e576004359160243561032d8161029a565b916044359067ffffffffffffffff821161020e5761034d916004016102c5565b9091565b3461020e57602061036d610364366102f3565b92919091613611565b6040519015158152f35b3461020e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760043560243567ffffffffffffffff811161020e576103c99036906004016102c5565b90918160141161020e578261044973ffffffffffffffffffffffffffffffffffffffff926104438560209661042b6104256104839a7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090351690565b60601c90565b9561043e87610439816143c8565b6123e7565b6122d7565b916136c5565b939091604051968795869485937ff551e2ee00000000000000000000000000000000000000000000000000000000855233600486016124fa565b0392165afa8015610501576104ce916000916104d2575b506040517fffffffff0000000000000000000000000000000000000000000000000000000090911681529081906020820190565b0390f35b6104f4915060203d6020116104fa575b6104ec8183612462565b8101906124a3565b3861049a565b503d6104e2565b61252c565b908161012091031261020e5790565b3461020e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760043567ffffffffffffffff811161020e576105676104ce913690600401610506565b602435906105ba6044359283926105b573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612538565b6129a6565b916105d1575b506040519081529081906020820190565b60009081803892335af150386105c0565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e577f0000000000000000000000000000000000000000000000000000000000000000467f000000000000000000000000000000000000000000000000000000000000000014307f000000000000000000000000000000000000000000000000000000000000000014161561068a575b602090604051908152f35b50602061071460a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f000000000000000000000000000000000000000000000000000000000000000060408201524660608201523060808201522090565b905061067f565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361020e57565b3461020e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e576107d46004356107838161071b565b7fffffffff00000000000000000000000000000000000000000000000000000000166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f02602052604060002090565b6040516040810181811067ffffffffffffffff82111761084a576040908152915473ffffffffffffffffffffffffffffffffffffffff811680835260589190911b7fff00000000000000000000000000000000000000000000000000000000000000166020928301819052835190815291820152f35b612433565b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e576000388180347f00000000000000000000000000000000000000000000000000000000000000005af11561020e57005b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760043567ffffffffffffffff811161020e576108f39036906004016102c5565b9060016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610a095760006109af819284600184527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0160205261099f6040852060017fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6109a7614de7565b810190612b3e565b9073ffffffffffffffffffffffffffffffffffffffff60208351930191165af46109d7612b75565b50156109df57005b7f315927c50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f53c85e660000000000000000000000000000000000000000000000000000000060005260046000fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e576000600435610a6b8161029a565b6024357f00000000000000000000000000000000000000000000000000000000000000009173ffffffffffffffffffffffffffffffffffffffff831633148015610af4575b610ab990612538565b6014526034526f205c28780000000000000000000000008252604460108338935af115610ae7576000603452005b3d60006040513e3d604051fd5b50333014610ab0565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57600435610b338161029a565b60243567ffffffffffffffff811161020e57610b539036906004016102c5565b909173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633148081159182610cd6575b610ba190612538565b73ffffffffffffffffffffffffffffffffffffffff831692610bc4841515612ba5565b610bd0813b1515612ba5565b3055307f000000000000000000000000000000000000000000000000000000000000000014610cc85790610cbf575b610c0890612538565b6352d1902d6001527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602060016004601d855afa5103610cb157807fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a281817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55610c9257005b816000926040519485378338925af415610ca857005b3d6000823e3d90fd5b6355299b496001526004601dfd5b50333014610bff565b639f03a0266000526004601cfd5b50333014610b98565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57307f000000000000000000000000000000000000000000000000000000000000000003610cc85760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b909291926040820160408352815180915260206060840192019060005b818110610da55750505073ffffffffffffffffffffffffffffffffffffffff6020919416910152565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101610d7c565b3461020e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57600435610e0c8161029a565b602435906000600173ffffffffffffffffffffffffffffffffffffffff8316141580611058575b611016578215610fee57610eaf610e95610e4e859495614ea8565b929473ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81168015159081610fe2575b5080610fd9575b15610f6057610f54610e9582610f0f610f5a94610ef489886147f7565b9073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604060002090565b93614f26565b92610eaf565b9083600173ffffffffffffffffffffffffffffffffffffffff8416141580610fd0575b610f99575b81526104ce60405192839283610d5f565b9150610fca610fb0610faa84614f58565b836147f7565b5173ffffffffffffffffffffffffffffffffffffffff1690565b91610f88565b50801515610f83565b50828410610ed7565b60019150141538610ed0565b807ff72508170000000000000000000000000000000000000000000000000000000060049252fd5b7f7c84ecfb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600452602490fd5b50611069611065836143c8565b1590565b610e33565b3461020e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760206110aa600435613a5c565b604051908152f35b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b60005b8381106111175750506000910152565b8181015183820152602001611107565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361116381518092818752878088019101611104565b0116010190565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e577fff0000000000000000000000000000000000000000000000000000000000000061121073ffffffffffffffffffffffffffffffffffffffff6112026111dd612bd6565b97946040999397919699949294519a8b9a168a5260e060208b015260e08a0190611127565b9088820360408a0152611127565b93606087015216608085015260a084015282810360c08401526020808351928381520192019060005b818110611247575050500390f35b8251845285945060209384019390920191600101611239565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760043567ffffffffffffffff811161020e576112aa903690600401610506565b6112eb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163314612538565b6112f860608201826126f4565b908160041161020e5760405161130f602082612462565b60008152917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8101611372575b6040517fd3fddfd1276d1cc278f10907710a44474a32f917b2fcfa198f46ca7689215e2f908061136d868883612c75565b0390a1005b60009250816004611387928594019101612b3e565b906020825192019073ffffffffffffffffffffffffffffffffffffffff3491165af16113b1612b75565b90156113be57388061133c565b7fb7c2b7060000000000000000000000000000000000000000000000000000000060005260046000fd5b6113f1366102f3565b73ffffffffffffffffffffffffffffffffffffffff9391937f00000000000000000000000000000000000000000000000000000000000000001633148015611612575b61143d90612538565b73ffffffffffffffffffffffffffffffffffffffff61149073ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541690565b16806114f257506114c4907fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123948484613cc1565b6040805191825273ffffffffffffffffffffffffffffffffffffffff9092166020820152908190810161136d565b90604051947fd68f60250000000000000000000000000000000000000000000000000000000086526000868061152d36343360048501612d97565b038183875af1958615610501576000966115e7575b509061154f918585613cc1565b803b1561020e576115946000949185926040519687809481937f173bf7da00000000000000000000000000000000000000000000000000000000835260048301612dcb565b03925af1928315610501577fd21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123936115cc575b506114c4565b806115db60006115e193612462565b80610203565b386115c6565b61154f9291965061160a903d806000833e6116028183612462565b810190612d38565b959091611542565b50333014611434565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e576104ce604080519061165c8183612462565b601982527f6269636f6e6f6d792e6e657875732e312e302e302d6265746100000000000000602083015251918291602083526020830190611127565b6116a1366102f3565b919273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633148015611827575b6116ec90612538565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526004810182905260208160248173ffffffffffffffffffffffffffffffffffffffff89165afa908115610501576117539183916000916117f8575b50612cb2565b611769848261176486868484613611565b612ce7565b6040805182815273ffffffffffffffffffffffffffffffffffffffff861660208201527f341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e9190a1600181036117c2575061001c92614294565b600281036117d4575061001c92613fa0565b600381036117e6575061001c92613e75565b6004146117ef57005b61001c92613da7565b61181a915060203d602011611820575b6118128183612462565b810190612c9a565b3861174d565b503d611808565b503330146116e3565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff8116156118bf575b60209073ffffffffffffffffffffffffffffffffffffffff60405191168152f35b50305461189e565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57306020526370a08231600052602080806024601c7f00000000000000000000000000000000000000000000000000000000000000005afa601f3d1116815102604051908152f35b3461020e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e576104ce6004358060081b7fff00000000000000000000000000000000000000000000000000000000000000821615918215611adf575b8215611ab2575b5081611a32575b5060405190151581529081906020820190565b7fff0000000000000000000000000000000000000000000000000000000000000081161591508115611a66575b5038611a1f565b7fff00000000000000000000000000000000000000000000000000000000000000167f010000000000000000000000000000000000000000000000000000000000000014905038611a5f565b7fff0000000000000000000000000000000000000000000000000000000000000090811614915038611a18565b7fff0000000000000000000000000000000000000000000000000000000000000081167f0100000000000000000000000000000000000000000000000000000000000000149250611a11565b3461020e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760206040517fd620c85a000000000000000000000000000000000000000000000000000000008152f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261020e57600435916024359067ffffffffffffffff821161020e5761034d916004016102c5565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310611c0557505050505090565b9091929394602080611c41837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528951611127565b97019301930191939290611bf6565b611c5936611b84565b91611c673361043933614437565b600073ffffffffffffffffffffffffffffffffffffffff611cbc73ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541690565b1680611cde57505091611cd2916104ce93612ddc565b60405191829182611bd2565b919390926040517fd68f6025000000000000000000000000000000000000000000000000000000008152848180611d1a36343360048501612d97565b038183885af1948515610501578095611db0575b5050611d3b929394612ddc565b90803b1561020e57611d816000939184926040519586809481937f173bf7da00000000000000000000000000000000000000000000000000000000835260048301612dcb565b03925af1918215610501576104ce92611d9b575b50611cd2565b806115db6000611daa93612462565b38611d95565b611d3b94955090611dca913d8091833e6116028183612462565b939238611d2e565b3461020e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760043577ffffffffffffffffffffffffffffffffffffffffffffffff811680910361020e57604051907f35567e1a000000000000000000000000000000000000000000000000000000008252306004830152602482015260208160448173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610501576104ce91600091611eb957506040519081529081906020820190565b611edb915060203d602011611ee1575b611ed38183612462565b810190612745565b386105c0565b503d611ec9565b611ef136611b84565b9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633148015612080575b611f3b90612538565b73ffffffffffffffffffffffffffffffffffffffff611f8e73ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541690565b1680611f9e575061001c92613045565b9091604051927fd68f602500000000000000000000000000000000000000000000000000000000845260008480611fda36343360048501612d97565b038183875af19384156105015760009461205f575b50611ffb929394613045565b803b1561020e576120406000929183926040519485809481937f173bf7da00000000000000000000000000000000000000000000000000000000835260048301612dcb565b03925af180156105015761205057005b806115db600061001c93612462565b611ffb939450612079903d806000833e6116028183612462565b9392611fef565b50333014611f32565b3461020e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e576004356120c48161029a565b602435906000600173ffffffffffffffffffffffffffffffffffffffff83161415806121f2575b611016578215610fee5761214d610e95612106859495614ea8565b929473ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811680151590816121e6575b50806121dd575b15610f6057610f54610e95826121926121d794610ef489886147f7565b73ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052604060002090565b9261214d565b50828410612175565b6001915014153861216e565b506121ff61106583614437565b6120eb565b3461020e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e5760043561223f8161029a565b6024359067ffffffffffffffff821161020e573660238301121561020e57816004013567ffffffffffffffff811161020e573660248260051b8501011161020e576044359160ff8316830361020e57602461001c940190613241565b3461020e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020e57602061036d600435613362565b909291928360141161020e57831161020e57601401917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec0190565b9060041161020e5790600490565b9060141161020e5790601490565b909291928360051161020e57831161020e57600501917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0190565b9093929384831161020e57841161020e578101920390565b919091357fffffffffffffffffffffffffffffffffffffffff000000000000000000000000811692601481106123b5575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b156123ef5750565b73ffffffffffffffffffffffffffffffffffffffff907fb927fe5e000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761084a57604052565b9081602091031261020e57516124b88161071b565b90565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b6124b8949273ffffffffffffffffffffffffffffffffffffffff606093168252602082015281604082015201916124bb565b6040513d6000823e3d90fd5b1561253f57565b7fac52ccbe0000000000000000000000000000000000000000000000000000000060005260046000fd5b604051906102c361012083612462565b604051906102c3604083612462565b67ffffffffffffffff811161084a57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926125ce82612588565b916125dc6040519384612462565b82948184528183011161020e578281602093846000960137010152565b9080601f8301121561020e578160206124b8933591016125c2565b9190916101208184031261020e5761262a612569565b92612634826102b8565b845260208201356020850152604082013567ffffffffffffffff811161020e57816126609184016125f9565b6040850152606082013567ffffffffffffffff811161020e57816126859184016125f9565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e082013567ffffffffffffffff811161020e57816126c89184016125f9565b60e085015261010082013567ffffffffffffffff811161020e576126ec92016125f9565b610100830152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561020e570180359067ffffffffffffffff821161020e5760200191813603831361020e57565b9081602091031261020e575190565b92919061286a6020916040865261278460408701825173ffffffffffffffffffffffffffffffffffffffff169052565b8281015160608701526101006128376127e56127b1604085015161012060808c01526101608b0190611127565b60608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08b83030160a08c0152611127565b608084015160c08a015260a084015160e08a015260c0840151838a015260e08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a8303016101208b0152611127565b9101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087830301610140880152611127565b930152565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561020e57016020813591019167ffffffffffffffff821161020e57813603831361020e57565b6124b8916128ea816128d0846102b8565b73ffffffffffffffffffffffffffffffffffffffff169052565b6020820135602082015261298061297461293b61292061290d604087018761286f565b61012060408801526101208701916124bb565b61292d606087018761286f565b9086830360608801526124bb565b6080850135608085015260a085013560a085015260c085013560c085015261296660e086018661286f565b9085830360e08701526124bb565b9261010081019061286f565b916101008185039101526124bb565b92919061286a6020916040865260408601906128bf565b602081013591612a18611065604085901c73ffffffffffffffffffffffffffffffffffffffff169460181b7fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000001490565b15612ab857612a29611065846143c8565b612ab057612a8092602092600073ffffffffffffffffffffffffffffffffffffffff6040518097819682957f970032030000000000000000000000000000000000000000000000000000000084526004840161298f565b0393165af190811561050157600091612a97575090565b6124b8915060203d602011611ee157611ed38183612462565b505050600190565b612a8092602092612aec612ae5612ade612ad23685612614565b936101008101906126f4565b9085613995565b36916125c2565b610100820152600073ffffffffffffffffffffffffffffffffffffffff6040518097819682957f9700320300000000000000000000000000000000000000000000000000000000845260048401612754565b91909160408184031261020e578035612b568161029a565b92602082013567ffffffffffffffff811161020e576124b892016125f9565b3d15612ba0573d90612b8682612588565b91612b946040519384612462565b82523d6000602084013e565b606090565b15612bac57565b7fc970156c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0f00000000000000000000000000000000000000000000000000000000000000906040805190612c078183612462565b600582527f4e657875730000000000000000000000000000000000000000000000000000006020830152612c3d81519182612462565b600a81527f312e302e302d62657461000000000000000000000000000000000000000000006020820152909146903090600090606090565b9091612c8c6124b8936040845260408401906128bf565b916020818403910152611127565b9081602091031261020e5751801515810361020e5790565b15612cba5750565b7fd393448a0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b15612cf0575050565b73ffffffffffffffffffffffffffffffffffffffff92507fbe601672000000000000000000000000000000000000000000000000000000006000526004521660245260446000fd5b60208183031261020e5780519067ffffffffffffffff821161020e570181601f8201121561020e578051612d6b81612588565b92612d796040519485612462565b8184526020828401011161020e576124b89160208085019101611104565b6124b8939273ffffffffffffffffffffffffffffffffffffffff6060931682526020820152816040820152019060006124bb565b9060206124b8928181520190611127565b9291612de7336144a6565b600884901b9160007fff000000000000000000000000000000000000000000000000000000000000008616612e2257506124b89394506148c3565b7fff0000000000000000000000000000000000000000000000000000000000000086167f010000000000000000000000000000000000000000000000000000000000000003612e7757506124b8939450614823565b939291907fff0000000000000000000000000000000000000000000000000000000000000080871603612ff757612eb19293949550615976565b91612eba6146f6565b937fff000000000000000000000000000000000000000000000000000000000000008116612f065750612eef939495506159d5565b612ef8826147e5565b52612f02816147e5565b5090565b7fff0000000000000000000000000000000000000000000000000000000000000081167f010000000000000000000000000000000000000000000000000000000000000003612faa5750612f5c939495506159ae565b612f65836147e5565b526124b8577f11578eed8e46b1423d3f7c61bdf7a0481d929e5f3c6e2e1e97d7f3ab138c6019612fa4612f97836147e5565b516040519182918261480b565b0390a190565b7f1187dc060000000000000000000000000000000000000000000000000000000087527fff0000000000000000000000000000000000000000000000000000000000000016600452602486fd5b6024857fff00000000000000000000000000000000000000000000000000000000000000887fb96fcfe400000000000000000000000000000000000000000000000000000000835216600452fd5b9291908360081b93613077817fff00000000000000000000000000000000000000000000000000000000000000161590565b156130895750906102c3929391614a7d565b7fff0000000000000000000000000000000000000000000000000000000000000081167f0100000000000000000000000000000000000000000000000000000000000000036130df5750906102c3929391614a0b565b7fff00000000000000000000000000000000000000000000000000000000000000808216036131f157509061311391615976565b917fff000000000000000000000000000000000000000000000000000000000000008516613149576131469394506159d5565b50565b7fff0000000000000000000000000000000000000000000000000000000000000085167f0100000000000000000000000000000000000000000000000000000000000000036131a15761319d9394506159ae565b5050565b7fff00000000000000000000000000000000000000000000000000000000000000857f1187dc06000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b7fff00000000000000000000000000000000000000000000000000000000000000907fb96fcfe4000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff90939193817f00000000000000000000000000000000000000000000000000000000000000001633148015613359575b61328f90612538565b1692837fffffffffffffffffffffffff00000000000000000000000000000000000000006000541617600055836132eb575b5050507ff98c8404c5b1bfef2e6ba9233c6e88845aedfd36eea8b192725d8c199571cf32600080a2565b833b1561020e5760009161332c60405194859384937ff05c04e100000000000000000000000000000000000000000000000000000000855260048501614b25565b038183865af1801561050157613344575b80806132c1565b806115db600061335393612462565b3861333d565b50333014613286565b600181036133705750600190565b6002810361337e5750600190565b6003810361338c5750600190565b6004810361339a5750600190565b6133a357600190565b600090565b6000358060e01c63bc197c81811463f23a6e6182141763150b7a0282141761354a57507fffffffff000000000000000000000000000000000000000000000000000000001660008181527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0260205260409020549061348161346273ffffffffffffffffffffffffffffffffffffffff84169360581b7fff000000000000000000000000000000000000000000000000000000000000001690565b9173ffffffffffffffffffffffffffffffffffffffff84161515613553565b7fff0000000000000000000000000000000000000000000000000000000000000081167ffe0000000000000000000000000000000000000000000000000000000000000014613525577fff0000000000000000000000000000000000000000000000000000000000000016156134f45750565b60008091368280373360601b365281601436019134905af11561351b573d6000803e3d6000f35b3d6000803e3d6000fd5b60008083368280373360601b36528160143601915afa1561351b573d6000803e3d6000f35b6020526020603cf35b1561355b5750565b7fffffffff00000000000000000000000000000000000000000000000000000000907f08c63e27000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b919091357fffffffff00000000000000000000000000000000000000000000000000000000811692600481106135df575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b929091600184036136285750506124b891506143c8565b6002840361363c5750506124b89150614437565b60038403613672576124b8935060048210613669576136649161365e91612312565b906135ab565b614b85565b50506000614b85565b5050906004146000146136bf577f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f035473ffffffffffffffffffffffffffffffffffffffff91821691161490565b50600090565b919261ffff6060511904616492027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858401013514613980575b60009161370a614bf8565b91604051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878401013561ffff16958660420194871597600e850199600e8287010198828203948589019b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe8d019a60408c602037611901600052841017816042601e2018176139415750505097967f5479706564446174615369676e28000000000000000000000000000000000000855260287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8b99019a8a8c82375160001a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f8183149101601a111791525b875160001a8060281461383b5790651201000000016001921c17970196613819565b509498978498976040607f9498836101209895979b7f20636f6e74656e74732c627974657331206669656c64732c737472696e67206e85527f616d652c737472696e672076657273696f6e2c75696e7432353620636861696e60208601527f49642c6164647265737320766572696679696e67436f6e74726163742c627974848601527f657333322073616c742c75696e743235365b5d20657874656e73696f6e73290060608601528785013786370103018620815220604052600116604201601e20907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe60019101935b6040521561393357929190565b61393c90613a5c565b929190565b969850969a50985050505093507f983e65e5148e570cd828ead231ee759a8d7958721a768f93bc4483ba005c32de600052602052604060002091613926565b925060408101350191602083359301906136ff565b6102c39093919293602084013560e01c90602485019082860195613a566139d0602489013560e01c9960046024858d8d010301018185612369565b99909998613a516139e23689896125c2565b6020815191012060286040519360208501927f9f34cc46003dee27a148c367555bac140aa3fbfc713cf44b3842f343fc2a4e7b845273ffffffffffffffffffffffffffffffffffffffff8a166040870152606086015260608552613a47608086612462565b0192519020613a5c565b614c6f565b35613b76565b7f0000000000000000000000000000000000000000000000000000000000000000467f000000000000000000000000000000000000000000000000000000000000000014307f0000000000000000000000000000000000000000000000000000000000000000141615613ae9575b671901000000000000600052601a52603a526042601820906000603a52565b50613b7160a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f000000000000000000000000000000000000000000000000000000000000000060408201524660608201523060808201522090565b613aca565b92919073ffffffffffffffffffffffffffffffffffffffff613bcc73ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541690565b1680613bdc57506102c393613cc1565b91604093919351937fd68f602500000000000000000000000000000000000000000000000000000000855260008580613c1a36343360048501612d97565b038183885af194851561050157600095613ca0575b50613c3b939495613cc1565b803b1561020e57613c806000929183926040519485809481937f173bf7da00000000000000000000000000000000000000000000000000000000835260048301612dcb565b03925af1801561050157613c915750565b806115db60006102c393612462565b613c3b949550613cba903d806000833e6116028183612462565b9493613c2f565b9392919073ffffffffffffffffffffffffffffffffffffffff811615613d6c5760018503613cf4576102c393945061561b565b60028503613d07576102c3939450615556565b60038503613d1a576102c3939450615254565b60048503613d2d576102c39394506150a3565b84613d3d576102c3939450614fac565b7f098312d200000000000000000000000000000000000000000000000000000000600052600485905260246000fd5b7f5316c18d0000000000000000000000000000000000000000000000000000000060005260046000fd5b9160206124b89381815201916124bb565b7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0380547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560009273ffffffffffffffffffffffffffffffffffffffff90911690813b15613e7157918391613e5593836040518096819582947f8a91b0e300000000000000000000000000000000000000000000000000000000845260206004850181815201916124bb565b03925af1801561050157613e67575050565b8161314691612462565b8380fd5b73ffffffffffffffffffffffffffffffffffffffff90929192613f26604051613e9f604082612462565b6000815260006020820152613eba61078361365e8789612312565b8151815460209093015174ff000000000000000000000000000000000000000060589190911c167fffffffffffffffffffffff00000000000000000000000000000000000000000090931673ffffffffffffffffffffffffffffffffffffffff90911617919091179055565b1691600082600411613f9d5750600401907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01823b1561020e57613c8092600092836040518096819582947f8a91b0e300000000000000000000000000000000000000000000000000000000845260048401613d96565b80fd5b9173ffffffffffffffffffffffffffffffffffffffff91613fc391810190612b3e565b91169060009273ffffffffffffffffffffffffffffffffffffffff81169283158015614259575b61422e578373ffffffffffffffffffffffffffffffffffffffff61404e837f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416036141ec578161413761417d926140f76140b0610e956141a5977f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b917f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b813b156141e857613e55839283926040519485809481937f8a91b0e300000000000000000000000000000000000000000000000000000000835260048301612dcb565b8280fd5b7f7c84ecfb00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff8216600452602485fd5b7f7c84ecfb000000000000000000000000000000000000000000000000000000008552600452602484fd5b5060018414613fea565b1561426a57565b7fb118263c0000000000000000000000000000000000000000000000000000000060005260046000fd5b906142b79073ffffffffffffffffffffffffffffffffffffffff93810190612b3e565b92166001811480614333575b8273ffffffffffffffffffffffffffffffffffffffff93926142e86142ed9315614263565b615779565b16803b1561020e57613c806000929183926040519485809481937f8a91b0e300000000000000000000000000000000000000000000000000000000835260048301612dcb565b50600073ffffffffffffffffffffffffffffffffffffffff8316801561439c5781527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604090205473ffffffffffffffffffffffffffffffffffffffff166001146142c3565b602492507f7c84ecfb000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16806001141590816143ed575090565b90506000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0060205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b73ffffffffffffffffffffffffffffffffffffffff168060011415908161445c575090565b90506000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0160205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b60009073ffffffffffffffffffffffffffffffffffffffff82541690816144cc57505050565b813b156141e85773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600260248301525afa801561050157613e67575050565b60009073ffffffffffffffffffffffffffffffffffffffff825416908161455a57505050565b813b156141e85773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600460248301525afa801561050157613e67575050565b60009073ffffffffffffffffffffffffffffffffffffffff82541690816145e857505050565b813b156141e85773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600360248301525afa801561050157613e67575050565b60009073ffffffffffffffffffffffffffffffffffffffff825416908161467657505050565b813b156141e85773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600160248301525afa801561050157613e67575050565b67ffffffffffffffff811161084a5760051b60200190565b604080519091906147078382612462565b60018152917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018260005b82811061473e57505050565b806060602080938501015201614732565b90614759826146de565b6147666040519182612462565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061479482946146de565b019060005b8281106147a557505050565b806060602080938501015201614799565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156147f25760200190565b6147b6565b80518210156147f25760209160051b010190565b9060406124b892600081528160208201520190611127565b7fff0000000000000000000000000000000000000000000000000000000000000090921692918035018035915060200183614863576124b8929350615b06565b7f01000000000000000000000000000000000000000000000000000000000000008403614895576124b8929350615a4b565b837f1187dc060000000000000000000000000000000000000000000000000000000060005260045260246000fd5b906148d091939293615b75565b916148dc9493946146f6565b947fff0000000000000000000000000000000000000000000000000000000000000087166149235761491094959650615be4565b614919836147e5565b52613146826147e5565b7fff0000000000000000000000000000000000000000000000000000000000000087167f0100000000000000000000000000000000000000000000000000000000000000036149bb5761497894959650615bbb565b614981846147e5565b521561498957565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76149b6612f97846147e5565b0390a1565b7fff00000000000000000000000000000000000000000000000000000000000000877f1187dc06000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b7fff0000000000000000000000000000000000000000000000000000000000000090921692918035018035915060200183614a4b57613146929350615b06565b7f0100000000000000000000000000000000000000000000000000000000000000840361489557613146929350615a4b565b7fff0000000000000000000000000000000000000000000000000000000000000091614aab91949394615b75565b9390929516948515600014614ac557613146949550615be4565b7f01000000000000000000000000000000000000000000000000000000000000008603614af75761319d949550615bbb565b857f1187dc060000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60ff909116815260406020820181905281018390526060019160005b818110614b4e5750505090565b90919260208060019273ffffffffffffffffffffffffffffffffffffffff8735614b778161029a565b168152019401929101614b41565b73ffffffffffffffffffffffffffffffffffffffff614bf081927fffffffff00000000000000000000000000000000000000000000000000000000166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f02602052604060002090565b541691161490565b73ffffffffffffffffffffffffffffffffffffffff90614c16612bd6565b9597939094604093929351986101208a0160405260001a60f81b60408a015260208151910120606089015260208151910120608088015260a08701521660c085015260e08401526020815160051b910120610100830152565b9091614c87610425614c818386612320565b90612381565b92614c94611065856143c8565b614da35792602092614cbf8373ffffffffffffffffffffffffffffffffffffffff94614cf9976122d7565b939091604051968795869485937ff551e2ee00000000000000000000000000000000000000000000000000000000855230600486016124fa565b0392165afa908115610501577f1626ba7e00000000000000000000000000000000000000000000000000000000917fffffffff0000000000000000000000000000000000000000000000000000000091600091614d84575b501603614d5a57565b7f46fdc3330000000000000000000000000000000000000000000000000000000060005260046000fd5b614d9d915060203d6020116104fa576104ec8183612462565b38614d51565b7fb927fe5e0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff841660045260246000fd5b60016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f006020527ffe44ceacbf4f03c6ac19f86826dd265fa9ec25125e8b1766c207f24cd3bc73c75473ffffffffffffffffffffffffffffffffffffffff16610a095760016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f006020526102c3604060002060017fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b90614eb2826146de565b614ebf6040519182612462565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0614eed82946146de565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114614f535760010190565b614ef7565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211614f5357565b91908110156147f25760051b0190565b908210156147f25761034d9160051b8101906126f4565b9150614fce908035810191602083019235916020810135019060208201913590565b9293918084036150795760005b818110614fea57505050505050565b80614ff86001928489614f85565b3582810361501c575061501661500f828887614f95565b908761561b565b01614fdb565b6002810361503f575061503a615033828887614f95565b9087615556565b615016565b6003810361505d575061503a615056828887614f95565b9087615254565b60040361503a5761503a615072828887614f95565b90876150a3565b7fb4fa3fb30000000000000000000000000000000000000000000000000000000060005260046000fd5b916150ad83614534565b6040517fecd0596100000000000000000000000000000000000000000000000000000000815260048082015273ffffffffffffffffffffffffffffffffffffffff84169390602081602481885afa908115610501576000916151e9575b50156151bb576151779061517261515573ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541690565b73ffffffffffffffffffffffffffffffffffffffff811615615208565b6156e0565b823b1561020e57613c8092600092836040518096819582947f6d61fe7000000000000000000000000000000000000000000000000000000000845260048401613d96565b7fd393448a000000000000000000000000000000000000000000000000000000006000526004805260246000fd5b615202915060203d602011611820576118128183612462565b3861510a565b156152105750565b73ffffffffffffffffffffffffffffffffffffffff907f741cbe03000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b909161525f826145c2565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526003600482015273ffffffffffffffffffffffffffffffffffffffff83169290602081602481875afa9081156105015760009161549f575b501561547057613eba84610783615343612ae5868061533d6153186152f2836152ec61365e6154019e8c612312565b996154be565b357fff000000000000000000000000000000000000000000000000000000000000001690565b7fff000000000000000000000000000000000000000000000000000000000000001690565b9a61232e565b9661539c7fffffffff0000000000000000000000000000000000000000000000000000000084167f6d61fe70000000000000000000000000000000000000000000000000000000008114908115615446575b50156154cd565b6153b1836153ac61106582615c13565b6154fe565b6153d86153bc612579565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b7fff00000000000000000000000000000000000000000000000000000000000000166020850152565b803b1561020e57613c806000929183926040519485809481937f6d61fe7000000000000000000000000000000000000000000000000000000000835260048301612dcb565b7f8a91b0e30000000000000000000000000000000000000000000000000000000091501438615395565b7fd393448a00000000000000000000000000000000000000000000000000000000600052600360045260246000fd5b6154b8915060203d602011611820576118128183612462565b386152bd565b90600410156147f25760040190565b156154d457565b7fc001660b0000000000000000000000000000000000000000000000000000000060005260046000fd5b156155065750565b7fffffffff00000000000000000000000000000000000000000000000000000000907fa56a04dd000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91615560836144a6565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526002600482015273ffffffffffffffffffffffffffffffffffffffff84169390602081602481885afa908115610501576000916155fc575b50156155cd5761517790615c84565b7fd393448a00000000000000000000000000000000000000000000000000000000600052600260045260246000fd5b615615915060203d602011611820576118128183612462565b386155be565b9161562583614650565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff84169390602081602481885afa908115610501576000916156c1575b50156156925761517790615e5c565b7fd393448a00000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6156da915060203d602011611820576118128183612462565b38615683565b73ffffffffffffffffffffffffffffffffffffffff6102c3911673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000007f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f035416177f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0355565b73ffffffffffffffffffffffffffffffffffffffff82168015801561596c575b6159285773ffffffffffffffffffffffffffffffffffffffff82166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0060205273ffffffffffffffffffffffffffffffffffffffff60406000205416036158e4578161589e61417d926140f7615857610e956102c3977f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f009073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b917f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f009073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f009073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7f7c84ecfb0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff821660045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff827f7c84ecfb000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b5060018114615799565b918160141161020e57823560601c92601401917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec0190565b60009192806040519485378338925af4913d82523d6000602084013e60203d830101604052565b6000919392806040519586378438925af415615a01573d82523d6000602084013e60203d830101604052565b503d6000823e3d90fd5b91908110156147f25760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18136030182121561020e570190565b919091615a578361474f565b9260005b818110615a6757505050565b80615a9e615a786001938587615a0b565b8035615a838161029a565b615a9660208301359260408101906126f4565b929091615bbb565b615aa883896147f7565b5215615ab5575b01615a5b565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb7615afe615ae383896147f7565b51604051918291858352604060208401526040830190611127565b0390a1615aaf565b919091615b128361474f565b9260005b818110615b2257505050565b80615b59615b336001938587615a0b565b8035615b3e8161029a565b615b5160208301359260408101906126f4565b929091615be4565b615b6382886147f7565b52615b6e81876147f7565b5001615b16565b908060141161020e57813560601c926034821061020e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc603460148501359401920190565b906000928491604051958692833738935af1913d82523d6000602084013e60203d830101604052565b9092600092819594604051968792833738935af115615a01573d82523d6000602084013e60203d830101604052565b615c7d73ffffffffffffffffffffffffffffffffffffffff917fffffffff00000000000000000000000000000000000000000000000000000000166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f02602052604060002090565b5416151590565b73ffffffffffffffffffffffffffffffffffffffff811680158015615e52575b615e255760009081527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052604090205473ffffffffffffffffffffffffffffffffffffffff16615de25760016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f016020526102c390615d93615d497fbdfeb076d903611fa58576955630d640569633049bcf40ad9c22db9251b54a13610e95565b6140f7837f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f016020527fbdfeb076d903611fa58576955630d640569633049bcf40ad9c22db9251b54a136140f7565b7f40d3d1a40000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b7f7c84ecfb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b5060018114615ca4565b73ffffffffffffffffffffffffffffffffffffffff811680158015615fba575b615e255760009081527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604090205473ffffffffffffffffffffffffffffffffffffffff16615de25760016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f006020526102c390615f6b615f217ffe44ceacbf4f03c6ac19f86826dd265fa9ec25125e8b1766c207f24cd3bc73c7610e95565b6140f7837f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f009073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f006020527ffe44ceacbf4f03c6ac19f86826dd265fa9ec25125e8b1766c207f24cd3bc73c76140f7565b5060018114615e7c56fea26469706673582212206ff2d160d31283793bd1b9d31f450117a5da25feffcad8dd944b4634201d6cd264736f6c634300081a0033fe44ceacbf4f03c6ac19f86826dd265fa9ec25125e8b1766c207f24cd3bc73c7bdfeb076d903611fa58576955630d640569633049bcf40ad9c22db9251b54a13" - }, - "NexusAccountFactory": { - "address": "0x7cebAEd7eA3A205AD3353C2FB945f1AFeC22CCe5", - "bytecode": "0x60a0346100f257601f610ea538819003918201601f19168301916001600160401b038311848410176100f75780849260409485528339810103126100f2576100468161010d565b906001600160a01b039061005c9060200161010d565b1680638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d8198190556001600160a01b038216156100e157156100d057608052604051610d83908161012282396080518181816101b1015281816106a501526109b40152f35b6342bcdf7f60e11b60005260046000fd5b630abd577760e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100f25756fe6080604052600436101561001257600080fd5b60003560e01c806325692962146100e7578063290ab984146100e257806345171159146100dd5780634a1ce599146100d857806354d1f13d146100d3578063715018a6146100ce5780638da5cb5b146100c9578063b36f9705146100c4578063ea6d13ac146100bf578063f04e283e146100ba578063f2fde38b146100b5578063fafa2b42146100b05763fee81cf4146100ab57600080fd5b610a53565b6108fb565b61089d565b610829565b61063f565b6104f5565b610484565b6103e4565b61037e565b6102ce565b6101f3565b610166565b6100fc565b60009103126100f757565b600080fd5b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f75763389a75e1600c52336000526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a2005b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff8116036100f757565b600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102cb5760043561022b816101d5565b816024359163ffffffff83168093036102c75773ffffffffffffffffffffffffffffffffffffffff9061025c610bb0565b1691610269831515610aa8565b823b156102c7576024604051809481937f0396cb60000000000000000000000000000000000000000000000000000000008352600483015234905af180156102c25782906102b45780f35b6102bd91610ad9565b388180f35b610b49565b5080fd5b80fd5b346100f757600060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102cb578073ffffffffffffffffffffffffffffffffffffffff600435610321816101d5565b610329610bb0565b16610335811515610aa8565b803b1561037b5781906004604051809481937fbb9fe6bf0000000000000000000000000000000000000000000000000000000083525af180156102c25782906102b45780f35b50fd5b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f75763389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2005b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757610416610bb0565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755005b346100f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f75760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346100f757600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102cb57600435610532816101d5565b8173ffffffffffffffffffffffffffffffffffffffff60243592610555846101d5565b61055d610bb0565b169161056a831515610aa8565b823b156102c757602473ffffffffffffffffffffffffffffffffffffffff918360405195869485937fc23a5cea0000000000000000000000000000000000000000000000000000000085521660048401525af180156102c25782906102b45780f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126100f75760043567ffffffffffffffff81116100f757826023820112156100f75780600401359267ffffffffffffffff84116100f757602484830101116100f757602401919060243590565b610648366105cc565b6106ca6040939293517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc368201016040528160048237207f000000000000000000000000000000000000000000000000000000000000000034610c6a565b92906107c25773ffffffffffffffffffffffffffffffffffffffff831690813b156100f757604051947f4b6a141900000000000000000000000000000000000000000000000000000000865260008680610728848660048401610b55565b038183875af19182156102c25773ffffffffffffffffffffffffffffffffffffffff9661075a936107a7575b50610b9b565b907f47e5b5fc3bda028416e26dcf66ca5186488c0717e8ab55bb01806113f1839d58600080a45b604051911673ffffffffffffffffffffffffffffffffffffffff168152602090f35b0390f35b806107b660006107bc93610ad9565b806100ec565b38610754565b50509050346107e65773ffffffffffffffffffffffffffffffffffffffff90610781565b7fda85dd9c0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f75760043561085f816101d5565b610867610bb0565b63389a75e1600c52806000526020600c20908154421161088f57600061088d9255610be8565b005b636f5e88186000526004601cfd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f7576004356108d3816101d5565b6108db610bb0565b8060601b156108ed5761088d90610be8565b637448fbae6000526004601cfd5b346100f757610909366105cc565b5050506040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc368201016040528160048237206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212090604052600060605260ff6000536035523060601b6001526015526107a3610a2c6055600020600060355273ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b346100f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f757600435610a8e816101d5565b63389a75e1600c52600052602080600c2054604051908152f35b15610aaf57565b7f91fdf1910000000000000000000000000000000000000000000000000000000060005260046000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b1a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040513d6000823e3d90fd5b90601f836040947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093602086528160208701528686013760008582860101520116010190565b81604051928392833781016000815203902090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543303610bda57565b6382b429006000526004601cfd5b73ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755565b92906000604051917fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076604052616009602052601e5268603d3d8160223d3973600a52605f60212060358301523060581b825260ff82538360158301526055822093843b15610d2f5750506001938015610d295760009081803892875af115610d1b575b6040526000606052565b63b12d13eb6000526004601cfd5b50610d11565b919350936021605f91f59182610d115763301164256000526004601cfdfea26469706673582212208def3a710ab8c8e4042da133ad5733ad6ee8659c4dc50c6dd9e19cafb314d3da64736f6c634300081a0033" - }, - "BiconomyMetaFactory": { - "address": "0x98C8792cf50A93900d575842eDAFf3Ccc2C2902b", - "bytecode": "0x60803460a657601f610c7e38819003918201601f19168301916001600160401b0383118484101760ab5780849260209460405283398101031260a657516001600160a01b0381169081900360a65780638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380638b78c6d8195515609557604051610bbc90816100c28239f35b6342bcdf7f60e11b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063160777991461010257806325692962146100fd57806343a0fcc4146100cb57806345171159146100f85780634a1ce599146100f357806354d1f13d146100ee578063715018a6146100e9578063759cf602146100e45780638da5cb5b146100df578063b36f9705146100da578063c513b4a4146100d5578063f04e283e146100d0578063f2b9c6e3146100cb578063f2fde38b146100c65763fee81cf4146100c157600080fd5b6108b1565b610853565b610243565b6107df565b61071b565b610644565b6105d3565b610542565b6104a2565b61043c565b61038c565b6102b1565b6101d9565b61012a565b73ffffffffffffffffffffffffffffffffffffffff81160361012557565b600080fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043561016081610107565b60243567ffffffffffffffff8111610125573660238201121561012557806004013567ffffffffffffffff8111610125573660248284010111610125576101d59260246101ae9301906109ac565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255763389a75e1600c52336000526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a2005b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255773ffffffffffffffffffffffffffffffffffffffff60043561029381610107565b166000526000602052602060ff604060002054166040519015158152f35b600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610389576004356102e981610107565b816024359163ffffffff83168093036103855773ffffffffffffffffffffffffffffffffffffffff9061031a610acc565b1691610327831515610a8f565b823b15610385576024604051809481937f0396cb60000000000000000000000000000000000000000000000000000000008352600483015234905af180156103805782906103725780f35b61037b91610935565b388180f35b610ac0565b5080fd5b80fd5b3461012557600060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610389578073ffffffffffffffffffffffffffffffffffffffff6004356103df81610107565b6103e7610acc565b166103f3811515610a8f565b803b156104395781906004604051809481937fbb9fe6bf0000000000000000000000000000000000000000000000000000000083525af180156103805782906103725780f35b50fd5b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255763389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2005b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610125576104d4610acc565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755005b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255773ffffffffffffffffffffffffffffffffffffffff60043561059281610107565b61059a610acc565b16600052600060205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055600080f35b346101255760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461012557600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103895760043561068181610107565b8173ffffffffffffffffffffffffffffffffffffffff602435926106a484610107565b6106ac610acc565b16916106b9831515610a8f565b823b1561038557602473ffffffffffffffffffffffffffffffffffffffff918360405195869485937fc23a5cea0000000000000000000000000000000000000000000000000000000085521660048401525af180156103805782906103725780f35b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255773ffffffffffffffffffffffffffffffffffffffff60043561076b81610107565b610773610acc565b1680156107b5576000526000602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055600080f35b7f5c7bfbe90000000000000000000000000000000000000000000000000000000060005260046000fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043561081581610107565b61081d610acc565b63389a75e1600c52806000526020600c2090815442116108455760006108439255610b04565b005b636f5e88186000526004601cfd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043561088981610107565b610891610acc565b8060601b156108a35761084390610b04565b637448fbae6000526004601cfd5b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610125576004356108ec81610107565b63389a75e1600c52600052602080600c2054604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761097657604052565b610906565b1561098257565b7fb4c974080000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff8116600052600060205260ff6040600020541615610a65578260009392849360405192839283378101848152039134905af13d15610a57573d67ffffffffffffffff811161097657610a5260209260405192610a44857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160185610935565b83523d60008585013e61097b565b015190565b602090610a5260609161097b565b7f8de0e0da0000000000000000000000000000000000000000000000000000000060005260046000fd5b15610a9657565b7f91fdf1910000000000000000000000000000000000000000000000000000000060005260046000fd5b6040513d6000823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543303610af657565b6382b429006000526004601cfd5b73ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275556fea2646970667358221220b5b4239f95581993f6923be5c2c6198dde7f4d8d718b6373429a2cbfaa553e3764736f6c634300081a0033" - }, - "K1Validator": { - "address": "0x2A5a15Ab95576c3a2aFfA1bE0f7447a079f184B9", - "bytecode": "0x60808060405234601557610d55908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806306fdde03146106935780632e5b63a61461061857806354fd4d50146105a25780636d61fe70146103f25780638a91b0e31461036857806397003203146102e0578063d60b347f1461025b578063ecd059611461021d578063f2fde38b1461011f5763f551e2ee1461008a57600080fd5b3461011a5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a576100c1610769565b5060443567ffffffffffffffff811161011a576100f06100e7602092369060040161078c565b906024356109ac565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b600080fd5b3461011a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a57610156610769565b73ffffffffffffffffffffffffffffffffffffffff8116156101f357803b6101c95733600052600060205273ffffffffffffffffffffffffffffffffffffffff604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7f83e6a1cb0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461011a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a5760206040516001600435148152f35b3461011a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a5760206102d6610297610769565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b6040519015158152f35b3461011a5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a5760043567ffffffffffffffff811161011a576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261011a57610360602091602435906004016108de565b604051908152f35b3461011a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a5760043567ffffffffffffffff811161011a576103b790369060040161078c565b505033600052600060205260406000207fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055600080f35b3461011a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a5760043567ffffffffffffffff811161011a5761044190369060040161078c565b9081156105785761048b3373ffffffffffffffffffffffffffffffffffffffff16600052600060205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b61054e57357fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169160148110610519575b505060601c803b6101c95733600052600060205273ffffffffffffffffffffffffffffffffffffffff604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009250829060140360031b1b161681806104bd565b7fe72ce85e0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1f2a381c0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461011a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a576106146105de60406107ba565b600a81527f312e302e302d6265746100000000000000000000000000000000000000000000602082015260405191829182610701565b0390f35b3461011a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a5773ffffffffffffffffffffffffffffffffffffffff610664610769565b166000526000602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b3461011a5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011a576106146106cf60406107ba565b600b81527f4b3156616c696461746f720000000000000000000000000000000000000000006020820152604051918291825b9190916020815282519283602083015260005b8481106107535750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610714565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361011a57565b9181601f8401121561011a5782359167ffffffffffffffff831161011a576020838186019501011161011a57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff8211176107fe57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561011a570180359067ffffffffffffffff821161011a5760200191813603831361011a57565b92919267ffffffffffffffff82116107fe576108c160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116016107ba565b938285528282011161011a57816000926020928387013784010152565b90813573ffffffffffffffffffffffffffffffffffffffff811680910361011a57600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020541690806020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042061097161010085019161096a610963848861082d565b369161087e565b9085610a8d565b93841561098b575b5050505061098657600190565b600090565b6109a3945061099d916109639161082d565b91610a8d565b38808080610979565b919033600052600060205273ffffffffffffffffffffffffffffffffffffffff604060002054166109df83838684610bcc565b610a6557610a19937f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090610bcc565b610a41577fffffffff0000000000000000000000000000000000000000000000000000000090565b7f1626ba7e0000000000000000000000000000000000000000000000000000000090565b505050507f1626ba7e0000000000000000000000000000000000000000000000000000000090565b929173ffffffffffffffffffffffffffffffffffffffff6000941680610ab257505050565b9091929350604051928060005260208301516040526040835114610b73575b6041835114610b3b575b916020917f1626ba7e000000000000000000000000000000000000000000000000000000009360006060528560405284865260048601526024850194859260408452805185019081604484019160045afa5060443d01915afa9151141690565b606083015160001a60205260408301516060526020600160806000825afa5182183d1517610adb575050600060605250604052600190565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040840151601b8160ff1c01602052166060526020600160806000825afa5182183d1517610ad1575050600060605250604052600190565b9392919073ffffffffffffffffffffffffffffffffffffffff600095169081610bf6575b50505050565b909192939450604051908060005260408514610cb7575b60418514610c78575b917f1626ba7e000000000000000000000000000000000000000000000000000000009391602093600060605281604052858252600482015260648660248301978895604087528160448601528385013701915afa915114169038808080610bf0565b604084013560001a60205260408481376020600160806000825afa5183183d1517610c1657509392505050600191600060605260405238808080610bf0565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020850135601b8160ff1c016020528535604052166060526020600160806000825afa5183183d1517610c0d57509392505050600191600060605260405238808080610bf056fea2646970667358221220753a9cb79cb966afdc626f57c4d75e1a96edf2baba29048e2860a08d558bb05664736f6c634300081a0033" - }, - "Counter": { - "address": "0x36023f0abe27eC68fD2c6a489A3e21772A08E120", - "bytecode": "0x6080806040523460155761023c908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c908163124674341461017b57508063273ea3e31461011a578063871cc9d41461008c5763f2c9ecd81461004b57600080fd5b346100875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610087576020600054604051908152f35b600080fd5b346100875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100875760005480156100eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346100875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610087576000547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146100eb57600101600055005b346100875760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008757807f08c379a0000000000000000000000000000000000000000000000000000000006064925260206004820152601960248201527f436f756e7465723a20526576657274206f7065726174696f6e000000000000006044820152fdfea264697066735822122028ccc17c16892193fa61b6b40560661ecad119585145a90af7b0bfedd6ac039864736f6c634300081a0033" - }, - "K1ValidatorFactory": { - "address": "0x85ffeEbDac4C8f6CC4D49f0CA1Cf63800F981b35", - "bytecode": "0x6101003461018e57601f61146d38819003918201601f19168301916001600160401b038311848410176101935780849260a09460405283398101031261018e57610048816101a9565b90610055602082016101a9565b91610062604083016101a9565b6060830151929091906001600160a01b0384169081850361018e5760800151946001600160a01b0386169081870361018e5760018060a01b031680638b78c6d819547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d819556001600160a01b0383161591821561017c575b8215610173575b50811561016a575b506101595760805260a05260c05260e0526040516112af90816101be82396080518181816102c1015281816106760152610755015260a0518181816103800152610c82015260c0518181816104460152610a2b015260e05181818161017701526104040152f35b6342bcdf7f60e11b60005260046000fd5b905015386100f2565b159150386100ea565b6001600160a01b0385161592506100e3565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361018e5756fe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146101175780630d51f0b714610112578063256929621461010d578063290ab98414610108578063322cc8ca1461010357806345171159146100fe5780634a1ce599146100f957806354d1f13d146100f457806367d2d1c9146100ef578063715018a6146100ea5780638da5cb5b146100e5578063b36f9705146100e0578063d0733b3b146100db578063f04e283e146100d6578063f2fde38b146100d15763fee81cf4146100cc57600080fd5b610d78565b610d1a565b610ca6565b610c37565b610b60565b610aef565b610a4f565b6109e0565b61097a565b6108ca565b6107f4565b61069a565b61062b565b6105c1565b610255565b61012c565b600091031261012757565b600080fd5b346101275760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff81160361012757565b359060ff8216820361012757565b9060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610127576004356101fe8161019b565b916024359160443567ffffffffffffffff811161012757826023820112156101275780600401359267ffffffffffffffff84116101275760248460051b8301011161012757602401919061025260646101b9565b90565b61025e366101c7565b6103a86102e66040969396959495517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc368201016040528160048237207f0000000000000000000000000000000000000000000000000000000000000000346110dc565b95909260006040516103548161032889602083017fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060149260601b1681520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610dfc565b604051809581927f8491599f0000000000000000000000000000000000000000000000000000000083527f000000000000000000000000000000000000000000000000000000000000000060048401610f90565b0381738F7560b30A1E2825005a0C69bccd2a70065d98Dd5af490811561056f576000938492610599575b5061042d90604051998a9485947f837b892e0000000000000000000000000000000000000000000000000000000086527f00000000000000000000000000000000000000000000000000000000000000009060048701610fef565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa94851561056f57600095610574575b50156104a3575b60405173ffffffffffffffffffffffffffffffffffffffff84168152602090f35b0390f35b73ffffffffffffffffffffffffffffffffffffffff831690813b156101275760006104fb95604051809781927f4b6a14190000000000000000000000000000000000000000000000000000000083526004830161109a565b038183865af190811561056f5773ffffffffffffffffffffffffffffffffffffffff958692610554575b5016907f33310a89c32d8cc00057ad6ef6274d2f8fe22389a992cf89983e09fc84f6cfff600080a4388061047e565b80610563600061056993610dfc565b8061011c565b38610525565b610fbd565b6105929195503d806000833e61058a8183610dfc565b810190610fc9565b9338610477565b61042d9192506105ba903d8087833e6105b28183610dfc565b810190610ed5565b91906103d2565b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275763389a75e1600c52336000526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a2005b346101275760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610127576106a8366101c7565b50505050506040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc368201016040528160048237206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212090604052600060605260ff6000536035523060601b60015260155261049f6107cd6055600020600060355273ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126108c75760043561082c8161019b565b816024359163ffffffff83168093036108c35773ffffffffffffffffffffffffffffffffffffffff9061085d6111bf565b169161086a8315156110ab565b823b156108c3576024604051809481937f0396cb60000000000000000000000000000000000000000000000000000000008352600483015234905af1801561056f5782906108b55780f35b6108be91610dfc565b388180f35b5080fd5b80fd5b3461012757600060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126108c7578073ffffffffffffffffffffffffffffffffffffffff60043561091d8161019b565b6109256111bf565b166109318115156110ab565b803b156109775781906004604051809481937fbb9fe6bf0000000000000000000000000000000000000000000000000000000083525af1801561056f5782906108b55780f35b50fd5b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275763389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2005b346101275760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757610a816111bf565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755005b346101275760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101275760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b3461012757600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126108c757600435610b9d8161019b565b8173ffffffffffffffffffffffffffffffffffffffff60243592610bc08461019b565b610bc86111bf565b1691610bd58315156110ab565b823b156108c357602473ffffffffffffffffffffffffffffffffffffffff918360405195869485937fc23a5cea0000000000000000000000000000000000000000000000000000000085521660048401525af1801561056f5782906108b55780f35b346101275760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757600435610cdc8161019b565b610ce46111bf565b63389a75e1600c52806000526020600c209081544211610d0c576000610d0a92556111f7565b005b636f5e88186000526004601cfd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757600435610d508161019b565b610d586111bf565b8060601b15610d6a57610d0a906111f7565b637448fbae6000526004601cfd5b346101275760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012757600435610db38161019b565b63389a75e1600c52600052602080600c2054604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610e3d57604052565b610dcd565b60005b838110610e555750506000910152565b8181015183820152602001610e45565b81601f8201121561012757805167ffffffffffffffff8111610e3d5760405192610eb760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160185610dfc565b81845260208284010111610127576102529160208085019101610e42565b6020818303126101275780519067ffffffffffffffff8211610127570160408183031261012757604051916040830183811067ffffffffffffffff821117610e3d576040528151610f258161019b565b8352602082015167ffffffffffffffff811161012757610f459201610e65565b602082015290565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093610f8981518092818752878088019101610e42565b0116010190565b60409073ffffffffffffffffffffffffffffffffffffffff61025294931681528160208201520190610f4d565b6040513d6000823e3d90fd5b9060208282031261012757815167ffffffffffffffff8111610127576102529201610e65565b9594939173ffffffffffffffffffffffffffffffffffffffff61102f6020809460808b528381511660808c01520151604060a08b015260c08a0190610f4d565b911682880152868103604088015282815201919060005b818110611063575050509060606110619294019060ff169052565b565b90919260208060019273ffffffffffffffffffffffffffffffffffffffff873561108c8161019b565b168152019401929101611046565b906020610252928181520190610f4d565b156110b257565b7f91fdf1910000000000000000000000000000000000000000000000000000000060005260046000fd5b92906000604051917fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076604052616009602052601e5268603d3d8160223d3973600a52605f60212060358301523060581b825260ff82538360158301526055822093843b156111a1575050600193801561119b5760009081803892875af11561118d575b6040526000606052565b63b12d13eb6000526004601cfd5b50611183565b919350936021605f91f591826111835763301164256000526004601cfd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433036111e957565b6382b429006000526004601cfd5b73ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275556fea2646970667358221220701fe73ec6d3e8dbf9db9afe5582decbd4eab6c2c1c47b780eabd16b47465ccc64736f6c634300081a0033" - }, - "MockValidator": { - "address": "0xD30576213Ab84900E937481683D63FE8F3021799", - "bytecode": "0x60808060405234601557610ba2908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081632e5b63a614610783575080636d61fe701461060e5780637ddc02d4146105715780638a91b0e3146104495780639700320314610213578063d60b347f146101d0578063ecd0596114610192578063f551e2ee146101025763fa5441611461008257600080fd5b346100fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd5773ffffffffffffffffffffffffffffffffffffffff6100ce6107fa565b166000526000602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100fd5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576101396107fa565b5060443567ffffffffffffffff81116100fd5761016861015f602092369060040161081d565b90602435610938565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b346100fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd5760206040516001600435148152f35b346100fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576102076107fa565b50602060405160008152f35b346100fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd5760043567ffffffffffffffff81116100fd578036036101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100fd577f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052602435601c52603c600020917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd61010482013592018212156100fd570190600482013567ffffffffffffffff81116100fd57602483019281360384136100fd5760009384926040519161034160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116018461084b565b81835260208301936020600484369301010111610445578185926020928637830101526001916040519484525160405260408151146104055760418151146103e757505060016080826020935b5afa513d156103da5791602092816060528260405233825281845273ffffffffffffffffffffffffffffffffffffffff806040842054169116146000146103d3578152f35b5060018152f35b638baa579f83526004601cfd5b60209260019260408360606080950151841a8752015160605261038e565b6020926001927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60406080940151601b8160ff1c0187521660605261038e565b8480fd5b346100fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd5760043567ffffffffffffffff81116100fd5761049890369060040161081d565b50506040517f112d3a7d000000000000000000000000000000000000000000000000000000008152600160048201523060248201526060604482015260006064820152602081608481335afa8015610565576104fd91600091610536575b50156108d3565b33600052600060205260406000207fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055600080f35b610558915060203d60201161055e575b610550818361084b565b8101906108bb565b826104f6565b503d610546565b6040513d6000823e3d90fd5b346100fd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd576105a86107fa565b60243573ffffffffffffffffffffffffffffffffffffffff81168091036100fd5773ffffffffffffffffffffffffffffffffffffffff602092166000526000825273ffffffffffffffffffffffffffffffffffffffff6040600020541614604051908152f35b346100fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd5760043567ffffffffffffffff81116100fd5761065d90369060040161081d565b6040517f112d3a7d000000000000000000000000000000000000000000000000000000008152600160048201523060248201526060604482015260006064820152909190602081608481335afa8015610565576106c291600091610764575b506108d3565b357fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116916014811061072f575b8233600052600060205260406000209060601c7fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009250829060140360031b1b161681806106f0565b61077d915060203d60201161055e57610550818361084b565b846106bc565b346100fd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fd5760209073ffffffffffffffffffffffffffffffffffffffff6107d26107fa565b166000526000825273ffffffffffffffffffffffffffffffffffffffff604060002054168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100fd57565b9181601f840112156100fd5782359167ffffffffffffffff83116100fd57602083818601950101116100fd57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761088c57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b908160209103126100fd575180151581036100fd5790565b156108da57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f56616c696461746f72206973207374696c6c20696e7374616c6c6564000000006044820152fd5b919033600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020541661096b83838684610a19565b6109f1576109a5937f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090610a19565b6109cd577fffffffff0000000000000000000000000000000000000000000000000000000090565b7f1626ba7e0000000000000000000000000000000000000000000000000000000090565b505050507f1626ba7e0000000000000000000000000000000000000000000000000000000090565b9392919073ffffffffffffffffffffffffffffffffffffffff600095169081610a43575b50505050565b909192939450604051908060005260408514610b04575b60418514610ac5575b917f1626ba7e000000000000000000000000000000000000000000000000000000009391602093600060605281604052858252600482015260648660248301978895604087528160448601528385013701915afa915114169038808080610a3d565b604084013560001a60205260408481376020600160806000825afa5183183d1517610a6357509392505050600191600060605260405238808080610a3d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020850135601b8160ff1c016020528535604052166060526020600160806000825afa5183183d1517610a5a57509392505050600191600060605260405238808080610a3d56fea26469706673582212200afb88b3e8240c2964e92585ac5dcc211660c088f462328e1bc883d03c6d583c64736f6c634300081a0033" - }, - "MockToken": { - "address": "0x56623d18E54cBbCae340EC449E3c5D1DC0bF60cd", - "bytecode": "0x6080604052346103c757610f1880380380610019816103cc565b9283398101906040818303126103c75780516001600160401b0381116103c757826100459183016103f1565b60208201519092906001600160401b0381116103c75761006592016103f1565b81516001600160401b0381116102d257600354600181811c911680156103bd575b60208210146102b257601f8111610358575b50602092601f82116001146102f357928192936000926102e8575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116102d257600454600181811c911680156102c8575b60208210146102b257601f811161024d575b50602091601f82116001146101e9579181926000926101de575b50508160011b916000199060031b1c1916176004555b33156101c8576002546a084595161401484a00000081018091116101b257600255600033815280602052604081206a084595161401484a0000008154019055604051906a084595161401484a00000082527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3604051610abb908161045d8239f35b634e487b7160e01b600052601160045260246000fd5b63ec442f0560e01b600052600060045260246000fd5b015190503880610116565b601f198216926004600052806000209160005b8581106102355750836001951061021c575b505050811b0160045561012c565b015160001960f88460031b161c1916905538808061020e565b919260206001819286850151815501940192016101fc565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106102a8575b601f0160051c01905b81811061029c57506100fc565b6000815560010161028f565b9091508190610286565b634e487b7160e01b600052602260045260246000fd5b90607f16906100ea565b634e487b7160e01b600052604160045260246000fd5b0151905038806100b3565b601f198216936003600052806000209160005b8681106103405750836001959610610327575b505050811b016003556100c9565b015160001960f88460031b161c19169055388080610319565b91926020600181928685015181550194019201610306565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106103b3575b601f0160051c01905b8181106103a75750610098565b6000815560010161039a565b9091508190610391565b90607f1690610086565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176102d257604052565b81601f820112156103c7578051906001600160401b0382116102d257610420601f8301601f19166020016103cc565b92828452602083830101116103c75760005b82811061044757505060206000918301015290565b8060208092840101518282870101520161043256fe608080604052600436101561001357600080fd5b60003560e01c90816306fdde03146107a557508063095ea7b3146106f457806318160ddd146106b857806323b872dd14610514578063313ce567146104da57806340c10f19146103d157806370a082311461036c57806395d89b4114610171578063a9059cbb146101225763dd62ed3e1461008d57600080fd5b3461011d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d576100c4610944565b73ffffffffffffffffffffffffffffffffffffffff6100e1610967565b9116600052600160205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b600080fd5b3461011d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d5761016661015c610944565b602435903361098a565b602060405160018152f35b3461011d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d57604051600090600454918260011c60018416938415610362575b60208210851461033557839482855290816000146102d5575060011461025a575b5003601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681019067ffffffffffffffff82118183101761022b57610227829182604052826108dc565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6004600090815291507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8183106102b957505081016020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101db565b6020919350806001915483858801015201910190918392610285565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208581019190915291151560051b840190910191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090506101db565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b90607f16906101ba565b3461011d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d5773ffffffffffffffffffffffffffffffffffffffff6103b8610944565b1660005260006020526020604060002054604051908152f35b3461011d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d57610408610944565b73ffffffffffffffffffffffffffffffffffffffff602435911680156104ab576002549180830180931161047c576020926002557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600093849284845283825260408420818154019055604051908152a380f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fec442f0500000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b3461011d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d57602060405160128152f35b3461011d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d5761054b610944565b610553610967565b6044359073ffffffffffffffffffffffffffffffffffffffff831692836000526001602052604060002073ffffffffffffffffffffffffffffffffffffffff33166000526020526040600020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81036105d3575b50610166935061098a565b83811061068257841561065357331561062457610166946000526001602052604060002073ffffffffffffffffffffffffffffffffffffffff331660005260205283604060002091039055846105c8565b7f94280d6200000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b7fe602df0500000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b83907ffb8f41b2000000000000000000000000000000000000000000000000000000006000523360045260245260445260646000fd5b3461011d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d576020600254604051908152f35b3461011d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d5761072b610944565b6024359033156106535773ffffffffffffffffffffffffffffffffffffffff1690811561062457336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461011d5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261011d57600090600354918260011c600184169384156108d2575b60208210851461033557839482855290816000146102d55750600114610857575003601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681019067ffffffffffffffff82118183101761022b57610227829182604052826108dc565b6003600090815291507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8183106108b657505081016020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06101db565b6020919350806001915483858801015201910190918392610882565b90607f16906107eb565b9190916020815282519283602083015260005b84811061092e5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016108ef565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361011d57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361011d57565b73ffffffffffffffffffffffffffffffffffffffff16908115610a565773ffffffffffffffffffffffffffffffffffffffff169182156104ab576000828152806020526040812054828110610a235791604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815280845220818154019055604051908152a3565b6064937fe450d38c0000000000000000000000000000000000000000000000000000000083949352600452602452604452fd5b7f96c6fd1e00000000000000000000000000000000000000000000000000000000600052600060045260246000fdfea2646970667358221220776ef503971e5a3b02cfda0d5a59bff3bff2e12eb1861d6c9d7f21399165e04764736f6c634300081a0033" - }, - "BootstrapLib": { - "address": "0x8F7560b30A1E2825005a0C69bccd2a70065d98Dd", - "bytecode": "0x608080604052346019576106e2908161001f823930815050f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80631d184bb31461016157806375dc30101461008757638491599f1461003d57600080fd5b610083610049366105ee565b73ffffffffffffffffffffffffffffffffffffffff6100666103f8565b9216825260208201526040519182916020835260208301906104e5565b0390f35b610090366105ee565b60409061009c82610418565b60018152917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0019260005b8481106101115750610083935073ffffffffffffffffffffffffffffffffffffffff6100f28461065c565b519116905260206101028361065c565b51015260405191829182610570565b60209061011c6103f8565b60008152606083820152828287010152016100c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103c65760043567ffffffffffffffff81116103c657366023820112156103c65780600401356101be6101b98261045c565b610418565b916024602084848152019260051b820101903682116103c657602401915b8183106103cb576024358467ffffffffffffffff82116103c657366023830112156103c65781600401356102126101b98261045c565b926024602085848152019260051b820101903682116103c65760248101925b8284106103965785858051825103610338578051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061027f6102766101b98661045c565b9480865261045c565b0160005b81811061031757505060005b8251811015610309578073ffffffffffffffffffffffffffffffffffffffff6102ba60019386610698565b51166102c68285610698565b5173ffffffffffffffffffffffffffffffffffffffff6102e46103f8565b9216825260208201526102f78287610698565b526103028186610698565b500161028f565b604051806100838682610570565b6020906103226103f8565b6000815260608382015282828801015201610283565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f426f6f7473747261704c69623a206c656e677468206d69736d617463680000006044820152fd5b833567ffffffffffffffff81116103c6576020916103bb839260243691870101610474565b815201930192610231565b600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681036103c6578152602092830192016101dc565b604051906040820182811067ffffffffffffffff82111761013257604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761013257604052565b67ffffffffffffffff81116101325760051b60200190565b81601f820112156103c65780359067ffffffffffffffff8211610132576104c260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610418565b92828452602083830101116103c657816000926020809301838601378301015290565b60209092919273ffffffffffffffffffffffffffffffffffffffff81511684520151916040602082015282519283604083015260005b84811061055a5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006060809697860101520116010190565b806020809284010151606082860101520161051b565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106105a357505050505090565b90919293946020806105df837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516104e5565b97019301930191939290610594565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103c65760043573ffffffffffffffffffffffffffffffffffffffff811681036103c657916024359067ffffffffffffffff82116103c65761065991600401610474565b90565b8051156106695760200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80518210156106695760209160051b01019056fea264697066735822122060d6e041e28ea380368628e9c24ac42967e7231da2b9c251384e786abba1e47764736f6c634300081a0033" - }, - "MockRegistry": { - "address": "0x25D55884BFA6380B0fCDc9E924c495C44Aa46415", - "bytecode": "0x6080806040523460155761035f908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c80630bb30abc1461025a5780632ed94467146102025780634c13560c146101cb578063529562a11461018b57806396fb721714610154578063c23697a81461011b5763f05c04e11461006a57600080fd5b346101165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101165760043560ff8116036101165760243567ffffffffffffffff8111610116577fb8a00d6d8ca1be30bfec34d8f97e55f0f0fd9eeb7fb46e030516363d4cfe1ad6916100e960209236906004016102f8565b5050338152a17fb6d9a72244037f5f1de04d8ff74cd328f1574efc59a02163d0fec05548719746600080a1005b600080fd5b346101165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610116576101526102b2565b005b346101165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610116576101526102b2565b346101165760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610116576101c26102b2565b506101526102d5565b346101165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610116576101c26102b2565b346101165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610116576102396102b2565b5060443567ffffffffffffffff8111610116576101529036906004016102f8565b346101165760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610116576102916102b2565b5060243567ffffffffffffffff8111610116576101529036906004016102f8565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361011657565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361011657565b9181601f840112156101165782359167ffffffffffffffff8311610116576020808501948460051b0101116101165756fea2646970667358221220570a018609c9de38f179f6ed43501da562ce3f9bd8c43c0418b649cbae71073064736f6c634300081a0033" - }, - "MockHandler": { - "address": "0xD981Bfa82Da48CC620892A4D927B47EB5384F2ef", - "bytecode": "0x6080806040523460155761078b908161001b8239f35b600080fdfe608080604052600436101561006c575b5034610067577f62390046000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000006000351660045260246000fd5b600080fd5b60003560e01c90816306661abd14610663575080631865c57d14610627578063671bd39d146105ce5780636d61fe701461053f5780638a91b0e3146104ee578063a3f4df7e14610467578063c214267a146103d7578063c84f59b41461034a578063cb5baf0f14610238578063d60b347f146101f5578063ecd05961146101b75763ffa1ad74146100fd573861000f565b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261006757604051604081019080821067ffffffffffffffff8311176101885761018491604052600581527f312e302e300000000000000000000000000000000000000000000000000000006020820152604051918291826106ca565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346100675760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675760206040516003600435148152f35b346100675760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675761022c610732565b50602060405160008152f35b346100675760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675761026f610732565b6044359067ffffffffffffffff821161006757608073ffffffffffffffffffffffffffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6102ec7f55ab15748247cb8144eef0ae68299026fbac7516b53ac596f1c767b9e61c0d3596369060040161069c565b809160405197889616865260243560208701526060604087015281606087015286860137600085828601015201168101030190a160206040517fcb5baf0f000000000000000000000000000000000000000000000000000000008152f35b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f52455645525400000000000000000000000000000000000000000000000000006044820152fd5b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610067576000547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461043857600101600055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261006757604051604081019080821067ffffffffffffffff8311176101885761018491604052600f81527f44656661756c742048616e646c657200000000000000000000000000000000006020820152604051918291826106ca565b346100675760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675760043567ffffffffffffffff81116100675761053d90369060040161069c565b005b346100675760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675760043567ffffffffffffffff81116100675761058e90369060040161069c565b602081101561059957005b6020116100675760207fc238a57f4049d38354151e09931543bd1e6b91ac24f1155d597ebeb207232d5c9160405190358152a1005b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100675760206040517f39bf027dd97f3bae0cf8cfb909695ec63313a9bd61ad52fc7f52cf565b141da88152f35b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610067576020600054604051908152f35b346100675760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610067576020906000548152f35b9181601f840112156100675782359167ffffffffffffffff8311610067576020838186019501011161006757565b9190916020815282519283602083015260005b84811061071c5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b80602080928401015160408286010152016106dd565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100675756fea2646970667358221220e432cdd52ed8203b9bce18a566b0f446141e54a5991a62cdac0d819e966265be64736f6c634300081a0033" - }, - "Bootstrap": { - "address": "0xad8b572bFB1b4d5F258c65910D1C266a1284E448", - "bytecode": "0x6101206040523461012957306080524660a052604080519060009082016001600160401b0381118382101761011557604052600982526020820191680426f6f7473747261760bc1b8352604051604081019381851060018060401b038611176101015760a094604052600a8252602082019269312e302e302d6265746160b01b845251902092505190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201524660608201523060808201522061010052604051612b67908161012f823960805181505060a05181505060c05181505060e05181505061010051815050f35b634e487b7160e01b84526041600452602484fd5b634e487b7160e01b82526041600452602482fd5b600080fdfe6080604052600436101561001e575b361561001c5761001c6117bd565b005b60003560e01c806301fe9ff2146100de5780630a664dba146100d9578063481ddd23146100d457806355470cf1146100cf5780635faac46b146100ca5780637b103999146100c5578063837b892e146100c057806384b0196e146100bb57806385a924cc146100b65780639e2533ed146100b1578063d6fe71f1146100ac5763ea5f61d00361000e57611238565b6110ea565b610f1b565b610d80565b610c43565b610a83565b6109be565b610751565b6104b5565b6102cb565b610244565b61017f565b73ffffffffffffffffffffffffffffffffffffffff81160361010157565b600080fd5b60443590610113826100e3565b565b3590610113826100e3565b9181601f840112156101015782359167ffffffffffffffff8311610101576020808501948460051b01011161010157565b6084359060ff8216820361010157565b6064359060ff8216820361010157565b359060ff8216820361010157565b346101015760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610101576004356101ba816100e3565b60243567ffffffffffffffff8111610101573660238201121561010157806004013567ffffffffffffffff8111610101573660248284010111610101576101ff610106565b926064359367ffffffffffffffff85116101015761022461001c953690600401610120565b9390926024610231610151565b960190611383565b600091031261010157565b346101015760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010157602073ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541673ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346101015760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610101576004357fffffffff00000000000000000000000000000000000000000000000000000000811681036101015761037b907fffffffff00000000000000000000000000000000000000000000000000000000166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f02602052604060002090565b60405190604082019082821067ffffffffffffffff8311176103f75760409182525473ffffffffffffffffffffffffffffffffffffffff811680845260589190911b7fff0000000000000000000000000000000000000000000000000000000000000016602093840181905282519081529283015290f35b0390f35b611489565b908160409103126101015790565b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101015760043567ffffffffffffffff8111610101578161045391600401610120565b9290929160243567ffffffffffffffff81116101015781610476916004016103fc565b91604435610483816100e3565b916064359067ffffffffffffffff8211610101576104a391600401610120565b909160843560ff811681036101015790565b34610101576104d26104c63661040a565b929693969190916119cc565b60005b818110610523578373ffffffffffffffffffffffffffffffffffffffff6104fb8261157c565b1661050257005b8061051d61051261001c9361157c565b916020810190611586565b91611b84565b61052e818385611537565b3590610539826100e3565b610551610547828587611537565b6020810190611586565b61055a84612310565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff85169490602081602481895afa90811561064057600091610674575b5015610645576105c790612559565b833b156101015761060b93600092836040518097819582947f6d61fe7000000000000000000000000000000000000000000000000000000000845260048401611b73565b03925af191821561064057600192610625575b50016104d5565b80610634600061063a936114b8565b80610239565b3861061e565b6119c0565b7fd393448a00000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b610695915060203d811161069b575b61068d81836114b8565b810190611b5b565b386105b8565b503d610683565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112610101576004356106d8816100e3565b9060243590565b909291926040820160408352815180915260206060840192019060005b8181106107255750505073ffffffffffffffffffffffffffffffffffffffff6020919416910152565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016106fc565b346101015761075f366106a2565b906000600173ffffffffffffffffffffffffffffffffffffffff83161415806109a8575b61096657821561093e576107ff6107e561079e8594956128f1565b929473ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81168015159081610932575b5080610929575b156108b0576108a46107e58261085f6108aa946108448988612940565b9073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604060002090565b93612983565b926107ff565b9083600173ffffffffffffffffffffffffffffffffffffffff8416141580610920575b6108e9575b81526103f3604051928392836106df565b915061091a6109006108fa846129b5565b83612940565b5173ffffffffffffffffffffffffffffffffffffffff1690565b916108d8565b508015156108d3565b50828410610827565b60019150141538610820565b807ff72508170000000000000000000000000000000000000000000000000000000060049252fd5b7f7c84ecfb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600452602490fd5b506109b96109b583612a53565b1590565b610783565b346101015760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010157602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b919082519283825260005b848110610a5a5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610a1b565b906020610a80928181520190610a10565b90565b346101015760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101015760043567ffffffffffffffff811161010157610ad29036906004016103fc565b602435610ade816100e3565b60443567ffffffffffffffff8111610101577f01fe9ff200000000000000000000000000000000000000000000000000000000610bfb60206103f39560ff610bc8610c0b97610b34610c37983690600401610120565b9073ffffffffffffffffffffffffffffffffffffffff610b92610b55610161565b9782610b6f823592610b66846100e3565b8c810190611586565b9190926040519e8f9d8e01521660248c015260a060448c015260c48b01916115d7565b931660648801527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc878403016084880152611616565b911660a4830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826114b8565b6040519283913060208401611667565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826114b8565b60405191829182610a6f565b346101015760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261010157610d206040610d2d815191610c8781846114b8565b600983527f426f6f747374726170000000000000000000000000000000000000000000000060208401528051610cbd82826114b8565b600a81527f312e302e302d6265746100000000000000000000000000000000000000000000602082015281519485947f0f00000000000000000000000000000000000000000000000000000000000000865260e0602087015260e0860190610a10565b9184830390850152610a10565b466060830152306080830152600060a083015281810360c0830152602060605191828152019060809060005b818110610d67575050500390f35b8251845285945060209384019390920191600101610d59565b34610101576103f3610c0b610c3760a0610bfb602473ffffffffffffffffffffffffffffffffffffffff60ff610bc8610b92610e02610dbe3661040a565b9a946040989493989792969197519e8f9d8e7f55470cf1000000000000000000000000000000000000000000000000000000006020820152015260c48d019161171b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8b83030160448c0152611694565b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101015760043567ffffffffffffffff81116101015781610e7b91600401610120565b9290929160243567ffffffffffffffff81116101015781610e9e91600401610120565b9290929160443567ffffffffffffffff81116101015781610ec1916004016103fc565b9160643567ffffffffffffffff81116101015782610ee191600401610120565b92909291610eef6084610115565b9160a4359067ffffffffffffffff821161010157610f0f91600401610120565b9091610a8060c4610171565b3461010157610f2936610e32565b97909493929591966040519a8b9a60208c017fd6fe71f100000000000000000000000000000000000000000000000000000000905260248c0160e090526101048c0190610f759261171b565b908a82037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc0160448c0152610fa99261171b565b8881037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc0160648a0152610fdc91611694565b908782037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc0160848901526110109261171b565b9173ffffffffffffffffffffffffffffffffffffffff1660a48601528482037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc0160c486015261105f92611616565b9060ff1660e4830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101825261109890826114b8565b6040519081906110ac903060208401611667565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810182526110dc90826114b8565b6040516103f3819282610a6f565b346101015761110c6110fb36610e32565b929a9399949a9895989190916119cc565b60005b82811061120a5750505060005b8181106111c15750505061114b6111328261157c565b73ffffffffffffffffffffffffffffffffffffffff1690565b6111ab575b5060005b81811061115d57005b806111766111326111716001948688611537565b61157c565b156111a6576111a061118c611171838688611537565b61119a610547848789611537565b91611e30565b01611154565b6111a0565b8061051d6105126111bb9361157c565b38611150565b806111d56111326111716001948688611537565b15611205576111ff6111eb611171838688611537565b6111f9610547848789611537565b91611d6b565b0161111c565b6111ff565b8061123261121e6111716001948787611537565b61122c610547848888611537565b91611ac5565b0161110f565b3461010157611246366106a2565b906000600173ffffffffffffffffffffffffffffffffffffffff8316141580611371575b61096657821561093e576112cc6107e56112858594956128f1565b929473ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff81168015159081611365575b508061135c575b156108b0576108a46107e582611311611356946108448988612940565b73ffffffffffffffffffffffffffffffffffffffff166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052604060002090565b926112cc565b508284106112f4565b600191501415386112ed565b5061137e6109b583612ac2565b61126a565b929473ffffffffffffffffffffffffffffffffffffffff946113a7939792966119cc565b16916113b283612310565b6040517fecd0596100000000000000000000000000000000000000000000000000000000815260016004820152602081602481875afa9081156106405760009161146a575b50156106455761140683612559565b823b156101015761144a92600092836040518096819582947f6d61fe7000000000000000000000000000000000000000000000000000000000845260048401611b73565b03925af180156106405761145b5750565b806106346000610113936114b8565b611483915060203d60201161069b5761068d81836114b8565b386113f7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103f757604052565b604051906101136040836114b8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115775760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610101570190565b611508565b35610a80816100e3565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610101570180359067ffffffffffffffff82116101015760200191813603831361010157565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9160209082815201919060005b8181106116305750505090565b90919260208060019273ffffffffffffffffffffffffffffffffffffffff8735611659816100e3565b168152019401929101611623565b60409073ffffffffffffffffffffffffffffffffffffffff610a8094931681528160208201520190610a10565b73ffffffffffffffffffffffffffffffffffffffff81356116b4816100e3565b16825260208101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561010157016020813591019067ffffffffffffffff811161010157803603821361010157604083816020610a8096015201916115d7565b90602083828152019060208160051b85010193836000915b8383106117435750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301865286357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1843603018112156101015760206117af60019386839401611694565b980196019493019190611733565b6000358060e01c63bc197c81811463f23a6e6182141763150b7a0282141761195f57507fffffffff000000000000000000000000000000000000000000000000000000001660008181527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0260205260409020549061189661187773ffffffffffffffffffffffffffffffffffffffff84169360581b7fff000000000000000000000000000000000000000000000000000000000000001690565b9173ffffffffffffffffffffffffffffffffffffffff84161515611968565b7fff0000000000000000000000000000000000000000000000000000000000000081167ffe000000000000000000000000000000000000000000000000000000000000001461193a577fff0000000000000000000000000000000000000000000000000000000000000016156119095750565b60008091368280373360601b365281601436019134905af115611930573d6000803e3d6000f35b3d6000803e3d6000fd5b60008083368280373360601b36528160143601915afa15611930573d6000803e3d6000f35b6020526020603cf35b156119705750565b7fffffffff00000000000000000000000000000000000000000000000000000000907f08c63e27000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff909391931692837fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005583611a41575b5050507ff98c8404c5b1bfef2e6ba9233c6e88845aedfd36eea8b192725d8c199571cf32600080a2565b833b1561010157600091611a9360ff9260405195869485947ff05c04e1000000000000000000000000000000000000000000000000000000008652166004850152604060248501526044840191611616565b038183865af1801561064057611aab575b8080611a17565b80611ab8600080936114b8565b8003126101015738611aa4565b91611acf83612310565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff84169390602081602481885afa90811561064057600091611b3c575b50156106455761140690612559565b611b55915060203d60201161069b5761068d81836114b8565b38611b2d565b90816020910312610101575180151581036101015790565b916020610a809381815201916115d7565b91611b8e836123af565b6040517fecd0596100000000000000000000000000000000000000000000000000000000815260048082015273ffffffffffffffffffffffffffffffffffffffff84169390602081602481885afa90811561064057600091611d00575b5015611cd25761140690611c53611c3673ffffffffffffffffffffffffffffffffffffffff7f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f03541690565b73ffffffffffffffffffffffffffffffffffffffff811615611d1f565b73ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000007f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f035416177f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0355565b7fd393448a000000000000000000000000000000000000000000000000000000006000526004805260246000fd5b611d19915060203d60201161069b5761068d81836114b8565b38611beb565b15611d275750565b73ffffffffffffffffffffffffffffffffffffffff907f741cbe03000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b91611d758361243d565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526002600482015273ffffffffffffffffffffffffffffffffffffffff84169390602081602481885afa90811561064057600091611e11575b5015611de25761140690612771565b7fd393448a00000000000000000000000000000000000000000000000000000000600052600260045260246000fd5b611e2a915060203d60201161069b5761068d81836114b8565b38611dd3565b9091611e3b826124cb565b6040517fecd059610000000000000000000000000000000000000000000000000000000081526003600482015273ffffffffffffffffffffffffffffffffffffffff83169290602081602481875afa90811561064057600091612145575b50156121165761203b84611fea611f2c611f258680611f1f611efa611ed483611ece611ec86120a79e8c612164565b906121ad565b99612213565b357fff000000000000000000000000000000000000000000000000000000000000001690565b7fff000000000000000000000000000000000000000000000000000000000000001690565b9a612172565b3691612222565b96611f857fffffffff0000000000000000000000000000000000000000000000000000000084167f6d61fe700000000000000000000000000000000000000000000000000000000081149081156120ec575b5015612287565b611f9a83611f956109b5826129e2565b6122b8565b611fc1611fa56114f9565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b7fff00000000000000000000000000000000000000000000000000000000000000166020850152565b7fffffffff00000000000000000000000000000000000000000000000000000000166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f02602052604060002090565b8151815460209093015174ff000000000000000000000000000000000000000060589190911c167fffffffffffffffffffffff00000000000000000000000000000000000000000090931673ffffffffffffffffffffffffffffffffffffffff90911617919091179055565b803b156101015761144a6000929183926040519485809481937f6d61fe7000000000000000000000000000000000000000000000000000000000835260048301610a6f565b7f8a91b0e30000000000000000000000000000000000000000000000000000000091501438611f7e565b7fd393448a00000000000000000000000000000000000000000000000000000000600052600360045260246000fd5b61215e915060203d60201161069b5761068d81836114b8565b38611e99565b906004116101015790600490565b909291928360051161010157831161010157600501917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0190565b919091357fffffffff00000000000000000000000000000000000000000000000000000000811692600481106121e1575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b90600410156115775760040190565b92919267ffffffffffffffff82116103f7576040519161226a601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846114b8565b829481845281830111610101578281602093846000960137010152565b1561228e57565b7fc001660b0000000000000000000000000000000000000000000000000000000060005260046000fd5b156122c05750565b7fffffffff00000000000000000000000000000000000000000000000000000000907fa56a04dd000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b60009073ffffffffffffffffffffffffffffffffffffffff825416908161233657505050565b813b156123ab5773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600160248301525afa80156106405761239e575050565b816123a8916114b8565b50565b8280fd5b60009073ffffffffffffffffffffffffffffffffffffffff82541690816123d557505050565b813b156123ab5773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600460248301525afa80156106405761239e575050565b60009073ffffffffffffffffffffffffffffffffffffffff825416908161246357505050565b813b156123ab5773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600260248301525afa80156106405761239e575050565b60009073ffffffffffffffffffffffffffffffffffffffff82541690816124f157505050565b813b156123ab5773ffffffffffffffffffffffffffffffffffffffff6044849260405194859384927f96fb7217000000000000000000000000000000000000000000000000000000008452166004830152600360248301525afa80156106405761239e575050565b73ffffffffffffffffffffffffffffffffffffffff811680158015612767575b61273a5760009081527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052604090205473ffffffffffffffffffffffffffffffffffffffff166126f75760016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f00602052610113906126a861261e7ffe44ceacbf4f03c6ac19f86826dd265fa9ec25125e8b1766c207f24cd3bc73c76107e5565b612668837f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f009073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f006020527ffe44ceacbf4f03c6ac19f86826dd265fa9ec25125e8b1766c207f24cd3bc73c7612668565b7f40d3d1a40000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff1660045260246000fd5b7f7c84ecfb0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b5060018114612579565b73ffffffffffffffffffffffffffffffffffffffff8116801580156128cf575b61273a5760009081527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052604090205473ffffffffffffffffffffffffffffffffffffffff166126f75760016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f01602052610113906128806128367fbdfeb076d903611fa58576955630d640569633049bcf40ad9c22db9251b54a136107e5565b612668837f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b60016000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f016020527fbdfeb076d903611fa58576955630d640569633049bcf40ad9c22db9251b54a13612668565b5060018114612791565b67ffffffffffffffff81116103f75760051b60200190565b906128fb826128d9565b61290860405191826114b8565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061293682946128d9565b0190602036910137565b80518210156115775760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146129b05760010190565b612954565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116129b057565b612a4c73ffffffffffffffffffffffffffffffffffffffff917fffffffff00000000000000000000000000000000000000000000000000000000166000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f02602052604060002090565b5416151590565b73ffffffffffffffffffffffffffffffffffffffff1680600114159081612a78575090565b90506000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0060205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b73ffffffffffffffffffffffffffffffffffffffff1680600114159081612ae7575090565b90506000527f0bb70095b32b9671358306b0339b4c06e7cbd8cb82505941fba30d1eb5b82f0160205273ffffffffffffffffffffffffffffffffffffffff6040600020541615159056fea2646970667358221220ed70c95fb16d016ca6b5227e6b3b5835f749aa1a8bdc4088985a8026734adc7c64736f6c634300081a0033" - }, - "MockExecutor": { - "address": "0x07be4ED2b8659807fd130bC7C761C50F81183e5c", - "bytecode": "0x6080806040523460155761105b908161001b8239f35b600080fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80631262b0ee146108a75780633006a1071461085d5780634bcfa24b1461079a5780635873f200146105ff578063628cd4a9146104cd5780636d61fe701461043e5780637b378abf146101a85780638a91b0e314610159578063d60b347f14610116578063d6cc1aa4146100dc5763ecd059610361000e57346100d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d75760206040516002600435148152f35b600080fd5b346100d75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d757602060405160008152f35b346100d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d75761014d61094b565b50602060405160008152f35b346100d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d75760043567ffffffffffffffff81116100d757610019903690600401610ae4565b346100d75760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d7576004356024359073ffffffffffffffffffffffffffffffffffffffff82168092036100d7576044359173ffffffffffffffffffffffffffffffffffffffff8316928381036100d75760643560843567ffffffffffffffff81116100d757610242903690600401610ae4565b60007fff000000000000000000000000000000000000000000000000000000000000008716806103325750506102dc96509161029f6000969594926102a59461029661028f368385610c84565b8587610fa6565b505b3691610c84565b91610fa6565b91836040518096819582947fd691c96400000000000000000000000000000000000000000000000000000000845260048401610e6e565b03925af18015610326576102ff91600091610303575b5060405191829182610a66565b0390f35b61032091503d806000833e6103188183610bf1565b810190610d96565b826102f2565b6040513d6000823e3d90fd5b7f010000000000000000000000000000000000000000000000000000000000000014610372575b506102dc96509161029f6000969594926102a594610298565b6040978851916103828a84610bf1565b600183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a01815b8181106104155750509261040761029f9360009a999896938c6102a599976102dc9e51926103d884610ba6565b835260208301526103ea368688610c84565b908201526103f782610e88565b5261040181610e88565b50610ec4565b509294509294959650610359565b6020908c606081519161042783610ba6565b8683528685840152820152828288010152016103ab565b346100d75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d75760043567ffffffffffffffff81116100d75761048d903690600401610ae4565b602081101561049857005b6020116100d75760207f7d5cb0984bb7d1f4bd4b5173bf72bc11bee784a856f3fe474cba8d93aa9e3baa9160405190358152a1005b346100d7576105a560006104e036610b12565b939185939160405160208101958087527f0100000000000000000000000000000000000000000000000000000000000000602183015280602283015280602683015280602a83015260208252610537604083610bf1565b5051945194602081106105c8575b5061029f9085966105599596503691610c84565b918373ffffffffffffffffffffffffffffffffffffffff6040518097819682957fd691c96400000000000000000000000000000000000000000000000000000000845260048401610e6e565b0393165af18015610326576102ff91600091610303575060405191829182610a66565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b9094169361029f610545565b346100d75760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100d75761063661094b565b60243567ffffffffffffffff81116100d7576106586000913690600401610ae4565b9283918373ffffffffffffffffffffffffffffffffffffffff60648260405160208101917fff00000000000000000000000000000000000000000000000000000000000000835280602183015280602283015280602683015280602a830152602082526106c6604083610bf1565b50519051906020811061076a575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040519a8b998a9889957fd691c964000000000000000000000000000000000000000000000000000000008752600487015260406024870152816044870152868601378685828601015201168101030193165af18015610326576102ff91600091610303575060405191829182610a66565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b16896106d4565b346100d7576105a560006107ad3661096e565b9190839260405160208101947f0100000000000000000000000000000000000000000000000000000000000000865280602183015280602283015280602683015280602a83015260208252610803604083610bf1565b505193519360208110610826575b5061055991610821913691610cbb565b610ec4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b90931692610559610811565b346100d7576105a5600061087036610b12565b9391859391604051602081019580875280602183015280602283015280602683015280602a83015260208252610537604083610bf1565b346100d7576105a560006108ba3661096e565b91906040519260208401937f010000000000000000000000000000000000000000000000000000000000000085527f0100000000000000000000000000000000000000000000000000000000000000602182015285602282015285602682015285602a8201526020815261092f604082610bf1565b5193519360208110610826575061055991610821913691610cbb565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100d757565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100d75760043573ffffffffffffffffffffffffffffffffffffffff811681036100d7579160243567ffffffffffffffff81116100d757826023820112156100d75780600401359267ffffffffffffffff84116100d75760248460051b830101116100d7576024019190565b60005b838110610a135750506000910152565b8181015183820152602001610a03565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093610a5f81518092818752878088019101610a00565b0116010190565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610a9957505050505090565b9091929394602080610ad5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528951610a23565b97019301930191939290610a8a565b9181601f840112156100d75782359167ffffffffffffffff83116100d757602083818601950101116100d757565b9060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126100d75760043573ffffffffffffffffffffffffffffffffffffffff811681036100d7579160243573ffffffffffffffffffffffffffffffffffffffff811681036100d75791604435916064359067ffffffffffffffff82116100d757610ba291600401610ae4565b9091565b6060810190811067ffffffffffffffff821117610bc257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610bc257604052565b67ffffffffffffffff8111610bc25760051b60200190565b67ffffffffffffffff8111610bc257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192610c9082610c4a565b91610c9e6040519384610bf1565b8294818452818301116100d7578281602093846000960137010152565b929192610cc782610c32565b93610cd56040519586610bf1565b602085848152019260051b8201918183116100d75780935b838510610cfb575050505050565b843567ffffffffffffffff81116100d7578201906060828503126100d75760405191610d2683610ba6565b803573ffffffffffffffffffffffffffffffffffffffff811681036100d75783526020810135602084015260408101359067ffffffffffffffff82116100d757019084601f830112156100d757602092610d868684868096359101610c84565b6040820152815201940193610ced565b6020818303126100d75780519067ffffffffffffffff82116100d7570181601f820112156100d757805190610dca82610c32565b92610dd86040519485610bf1565b82845260208085019360051b830101918183116100d75760208101935b838510610e0457505050505090565b845167ffffffffffffffff81116100d75782019083603f830112156100d757602082015190610e3282610c4a565b610e3f6040519182610bf1565b82815260408484010186106100d757610e6360209493859460408685019101610a00565b815201940193610df5565b604090610e85939281528160208201520190610a23565b90565b805115610e955760200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6040519081604081019160208083015280518093526060820192602060608260051b8501019201936000905b828210610f2b57505050610e859250037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610bf1565b91936020610f96857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa083946001969803018652606060408a5173ffffffffffffffffffffffffffffffffffffffff815116845285810151868501520151918160408201520190610a23565b9601920192018593919492610ef0565b6054907fffffffffffffffffffffffffffffffffffffffff00000000000000000000000093610e859360405195869360601b1660208401526034830152610ff68151809260208686019101610a00565b810103017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610bf156fea2646970667358221220654856a16b975974e83b84f624ebaa4854128669c7d3111882a257eec28843a264736f6c634300081a0033" - } -} diff --git a/tests/deploy.nexus.ts b/tests/deploy.nexus.ts new file mode 100644 index 00000000..7b62c175 --- /dev/null +++ b/tests/deploy.nexus.ts @@ -0,0 +1,10 @@ +import { execa } from "execa" + +export const deployProcess = async (rpcPort: number) => { + await execa({ + cwd: "./node_modules/nexus" + })`rm -rf ./deployments` + return await execa({ + cwd: "./node_modules/nexus" + })`yarn deploy:hardhat --network anvil-${rpcPort}` +} diff --git a/tests/instances/account.test.ts b/tests/instances/account.test.ts index a112a692..cb42e133 100644 --- a/tests/instances/account.test.ts +++ b/tests/instances/account.test.ts @@ -7,15 +7,18 @@ import { createWalletClient } from "viem" import { afterAll, beforeAll, describe, expect, test } from "vitest" +import contracts from "../../src/__contracts" import { type NexusSmartAccount, + type Transaction, createSmartAccountClient } from "../../src/account" import { - fundAndDeploy, getTestAccount, killNetwork, - toTestClient + toTestClient, + topUp, + writeToFile } from "../test.utils" import type { MasterClient, NetworkConfig } from "../test.utils" import { type TestFileNetworkType, toNetwork } from "../testSetup" @@ -36,21 +39,16 @@ describe("account", () => { let testClient: MasterClient let account: Account let recipientAccount: Account - let recipientWalletClient: WalletClient let smartAccount: NexusSmartAccount - let recipientSmartAccount: NexusSmartAccount let smartAccountAddress: Hex - let recipientSmartAccountAddress: Hex beforeAll(async () => { network = await toNetwork(NETWORK_TYPE) - factoryAddress = network.deployment.k1FactoryAddress - k1ValidatorAddress = network.deployment.k1ValidatorAddress chain = network.chain bundlerUrl = network.bundlerUrl - account = getTestAccount(2) + account = getTestAccount(0) recipientAccount = getTestAccount(3) walletClient = createWalletClient({ @@ -59,51 +57,62 @@ describe("account", () => { transport: http() }) - recipientWalletClient = createWalletClient({ - account: recipientAccount, - chain, - transport: http() - }) - - testClient = toTestClient(chain, getTestAccount()) + testClient = toTestClient(chain, getTestAccount(0)) smartAccount = await createSmartAccountClient({ signer: walletClient, bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress - }) - - recipientSmartAccount = await createSmartAccountClient({ - signer: recipientWalletClient, - bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress + chain }) smartAccountAddress = await smartAccount.getAddress() - recipientSmartAccountAddress = await recipientSmartAccount.getAddress() - await fundAndDeploy(testClient, [smartAccount, recipientSmartAccount]) + // await fundAndDeploy(testClient, smartAccount) }) afterAll(async () => { await killNetwork([network.rpcPort, network.bundlerPort]) }) + test("byteCodes", async () => { + const byteCodes = await Promise.all([ + testClient.getBytecode({ address: contracts.k1ValidatorFactory.address }), + testClient.getBytecode({ address: contracts.k1Validator.address }) + ]) + const [k1ValidatorFactory, k1Validator] = byteCodes + writeToFile("byteCodes.json", { k1ValidatorFactory, k1Validator }) + expect(byteCodes.every(Boolean)).toBe(true) + }) + + test("topUp", async () => { + const total = await testClient.getBalance({ + address: testClient.account.address + }) + await topUp(testClient, smartAccountAddress) + const [balance] = await smartAccount.getBalances() + expect(balance.amount > 0) + }) + test("should have account addresses", async () => { const addresses = await Promise.all([ account.address, - smartAccount.getAddress(), - recipientAccount.address, - recipientSmartAccount.getAddress() + smartAccount.getAddress() ]) expect(addresses.every(Boolean)).to.be.true expect(addresses).toStrictEqual([ - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - "0x2915317448Dd00158361dcBB47eacF26f774DdA8", // Sender smart account - "0x90F79bf6EB2c4f870365E785982E1f101E93b906", - "0x89028E0fD7Af7F864878e0209118DF6A9229A9Ce" // Recipient smart account + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x473AecE3DE762252a9d47F5032133282c9615e28" // Sender smart account ]) }) + + test("send eth", async () => { + const tx: Transaction = { + to: account.address, + value: 1n + } + + const { wait } = await smartAccount.sendTransaction(tx) + + const { success, receipt } = await wait() + + expect(success).toBe(true) + }) }) diff --git a/tests/instances/bundler.test.ts b/tests/instances/bundler.test.ts index af3a2ae5..55c18fe9 100644 --- a/tests/instances/bundler.test.ts +++ b/tests/instances/bundler.test.ts @@ -9,16 +9,10 @@ import { import { afterAll, beforeAll, describe, expect, test } from "vitest" import { type NexusSmartAccount, - type NexusSmartAccountConfig, + type Transaction, createSmartAccountClient } from "../../src/account" -import { - fundAndDeploy, - getTestAccount, - initNetwork, - killNetwork, - toTestClient -} from "../test.utils" +import { getTestAccount, killNetwork, toTestClient, topUp } from "../test.utils" import type { MasterClient, NetworkConfig } from "../test.utils" import { type TestFileNetworkType, toNetwork } from "../testSetup" @@ -30,30 +24,21 @@ describe("bundler", () => { // Nexus Config let chain: Chain let bundlerUrl: string - let factoryAddress: Hex - let k1ValidatorAddress: Hex let walletClient: WalletClient // Test utils let testClient: MasterClient let account: Account - let recipientAccount: Account - let recipientWalletClient: WalletClient let smartAccount: NexusSmartAccount - let recipientSmartAccount: NexusSmartAccount let smartAccountAddress: Hex - let recipientSmartAccountAddress: Hex beforeAll(async () => { network = await toNetwork(NETWORK_TYPE) - factoryAddress = network.deployment.k1FactoryAddress - k1ValidatorAddress = network.deployment.k1ValidatorAddress chain = network.chain bundlerUrl = network.bundlerUrl - account = getTestAccount(2) - recipientAccount = getTestAccount(3) + account = getTestAccount(0) walletClient = createWalletClient({ account, @@ -61,57 +46,51 @@ describe("bundler", () => { transport: http() }) - recipientWalletClient = createWalletClient({ - account: recipientAccount, - chain, - transport: http() - }) - - testClient = toTestClient(chain, getTestAccount()) + testClient = toTestClient(chain, getTestAccount(0)) smartAccount = await createSmartAccountClient({ signer: walletClient, bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress - }) - - recipientSmartAccount = await createSmartAccountClient({ - signer: recipientWalletClient, - bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress + chain }) smartAccountAddress = await smartAccount.getAddress() - recipientSmartAccountAddress = await recipientSmartAccount.getAddress() - await fundAndDeploy(testClient, [smartAccount, recipientSmartAccount]) }) afterAll(async () => { await killNetwork([network.rpcPort, network.bundlerPort]) }) + test("topUp", async () => { + const total = await testClient.getBalance({ + address: testClient.account.address + }) + await topUp(testClient, smartAccountAddress) + const [balance] = await smartAccount.getBalances() + expect(balance.amount > 0) + }) + test("should have account addresses", async () => { const addresses = await Promise.all([ account.address, - smartAccount.getAddress(), - recipientAccount.address, - recipientSmartAccount.getAddress() + smartAccount.getAddress() ]) expect(addresses.every(Boolean)).to.be.true expect(addresses).toStrictEqual([ - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - "0x2915317448Dd00158361dcBB47eacF26f774DdA8", // Sender smart account - "0x90F79bf6EB2c4f870365E785982E1f101E93b906", - "0x89028E0fD7Af7F864878e0209118DF6A9229A9Ce" // Recipient smart account + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x473AecE3DE762252a9d47F5032133282c9615e28" // Sender smart account ]) }) - test("should check bytecode at Counter contract", async () => { - const counterAddress = network.deployment.counterAddress - const byteCode = await testClient.getBytecode({ address: counterAddress }) - expect(byteCode).toBeTruthy() + test("should send eth", async () => { + const tx: Transaction = { + to: account.address, + value: 1n + } + + const { wait } = await smartAccount.sendTransaction(tx) + + const { success } = await wait() + + expect(success).toBe(true) }) }) diff --git a/tests/instances/hook.module.test.ts b/tests/instances/hook.module.test.ts deleted file mode 100644 index d2dcac56..00000000 --- a/tests/instances/hook.module.test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { - http, - type Account, - type Chain, - type Hex, - type WalletClient, - createWalletClient -} from "viem" -import { afterAll, beforeAll, describe, expect, test } from "vitest" -import { - type NexusSmartAccount, - type NexusSmartAccountConfig, - createSmartAccountClient -} from "../../src/account" -import { - fundAndDeploy, - getTestAccount, - initNetwork, - killNetwork, - toTestClient -} from "../test.utils" -import type { MasterClient, NetworkConfig } from "../test.utils" -import { type TestFileNetworkType, toNetwork } from "../testSetup" - -const NETWORK_TYPE: TestFileNetworkType = "GLOBAL" - -describe("hook.modules", () => { - let network: NetworkConfig - - // Nexus Config - let chain: Chain - let bundlerUrl: string - let factoryAddress: Hex - let k1ValidatorAddress: Hex - let walletClient: WalletClient - - // Test utils - let testClient: MasterClient - let account: Account - let recipientAccount: Account - let recipientWalletClient: WalletClient - let smartAccount: NexusSmartAccount - let recipientSmartAccount: NexusSmartAccount - let smartAccountAddress: Hex - let recipientSmartAccountAddress: Hex - - beforeAll(async () => { - network = await toNetwork(NETWORK_TYPE) - factoryAddress = network.deployment.k1FactoryAddress - k1ValidatorAddress = network.deployment.k1ValidatorAddress - - chain = network.chain - bundlerUrl = network.bundlerUrl - - account = getTestAccount(2) - recipientAccount = getTestAccount(3) - - walletClient = createWalletClient({ - account, - chain, - transport: http() - }) - - recipientWalletClient = createWalletClient({ - account: recipientAccount, - chain, - transport: http() - }) - - testClient = toTestClient(chain, getTestAccount()) - - smartAccount = await createSmartAccountClient({ - signer: walletClient, - bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress - }) - - recipientSmartAccount = await createSmartAccountClient({ - signer: recipientWalletClient, - bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress - }) - - smartAccountAddress = await smartAccount.getAddress() - recipientSmartAccountAddress = await recipientSmartAccount.getAddress() - await fundAndDeploy(testClient, [smartAccount, recipientSmartAccount]) - }) - afterAll(async () => { - await killNetwork([network.rpcPort, network.bundlerPort]) - }) - - test("should have account addresses", async () => { - const addresses = await Promise.all([ - account.address, - smartAccount.getAddress(), - recipientAccount.address, - recipientSmartAccount.getAddress() - ]) - expect(addresses.every(Boolean)).to.be.true - expect(addresses).toStrictEqual([ - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - "0x2915317448Dd00158361dcBB47eacF26f774DdA8", // Sender smart account - "0x90F79bf6EB2c4f870365E785982E1f101E93b906", - "0x89028E0fD7Af7F864878e0209118DF6A9229A9Ce" // Recipient smart account - ]) - }) - - test("should check bytecode at Counter contract", async () => { - const counterAddress = network.deployment.counterAddress - const byteCode = await testClient.getBytecode({ address: counterAddress }) - expect(byteCode).toBeTruthy() - }) -}) diff --git a/tests/instances/modules.test.ts b/tests/instances/modules.test.ts deleted file mode 100644 index cbd297b3..00000000 --- a/tests/instances/modules.test.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { - http, - type Account, - type Chain, - type Hex, - type WalletClient, - createWalletClient -} from "viem" -import { afterAll, beforeAll, describe, expect, test } from "vitest" -import { - type NexusSmartAccount, - createSmartAccountClient -} from "../../src/account" -import { - fundAndDeploy, - getTestAccount, - killNetwork, - toTestClient -} from "../test.utils" -import type { MasterClient, NetworkConfig } from "../test.utils" - -import { type TestFileNetworkType, toNetwork } from "../testSetup" - -const NETWORK_TYPE: TestFileNetworkType = "GLOBAL" - -describe("modules", () => { - let network: NetworkConfig - - // Nexus Config - let chain: Chain - let bundlerUrl: string - let factoryAddress: Hex - let k1ValidatorAddress: Hex - let walletClient: WalletClient - - // Test utils - let testClient: MasterClient - let account: Account - let recipientAccount: Account - let recipientWalletClient: WalletClient - let smartAccount: NexusSmartAccount - let recipientSmartAccount: NexusSmartAccount - let smartAccountAddress: Hex - let recipientSmartAccountAddress: Hex - - beforeAll(async () => { - network = await toNetwork(NETWORK_TYPE) - factoryAddress = network.deployment.k1FactoryAddress - k1ValidatorAddress = network.deployment.k1ValidatorAddress - - chain = network.chain - bundlerUrl = network.bundlerUrl - - account = getTestAccount(2) - recipientAccount = getTestAccount(3) - - walletClient = createWalletClient({ - account, - chain, - transport: http() - }) - - recipientWalletClient = createWalletClient({ - account: recipientAccount, - chain, - transport: http() - }) - - testClient = toTestClient(chain, getTestAccount()) - - smartAccount = await createSmartAccountClient({ - signer: walletClient, - bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress - }) - - recipientSmartAccount = await createSmartAccountClient({ - signer: recipientWalletClient, - bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress - }) - - smartAccountAddress = await smartAccount.getAddress() - recipientSmartAccountAddress = await recipientSmartAccount.getAddress() - await fundAndDeploy(testClient, [smartAccount, recipientSmartAccount]) - }) - afterAll(async () => { - await killNetwork([network.rpcPort, network.bundlerPort]) - }) - - test("should have account addresses", async () => { - const addresses = await Promise.all([ - account.address, - smartAccount.getAddress(), - recipientAccount.address, - recipientSmartAccount.getAddress() - ]) - expect(addresses.every(Boolean)).to.be.true - expect(addresses).toStrictEqual([ - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - "0x2915317448Dd00158361dcBB47eacF26f774DdA8", // Sender smart account - "0x90F79bf6EB2c4f870365E785982E1f101E93b906", - "0x89028E0fD7Af7F864878e0209118DF6A9229A9Ce" // Recipient smart account - ]) - }) - - test("should check bytecode at Counter contract", async () => { - const counterAddress = network.deployment.counterAddress - const byteCode = await testClient.getBytecode({ address: counterAddress }) - expect(byteCode).toBeTruthy() - }) -}) diff --git a/tests/test.utils.ts b/tests/test.utils.ts index d619fcf8..d033fc52 100644 --- a/tests/test.utils.ts +++ b/tests/test.utils.ts @@ -1,3 +1,4 @@ +import fs from "node:fs" import getPort from "get-port" import { alto, anvil } from "prool/instances" import { @@ -7,7 +8,6 @@ import { type Address, type Chain, type Hex, - type SetCodeParameters, createTestClient, createWalletClient, encodeAbiParameters, @@ -17,36 +17,20 @@ import { walletActions } from "viem" import { mnemonicToAccount } from "viem/accounts" -import { anvil as anvilChain } from "viem/chains" import { type EIP712DomainReturn, type NexusSmartAccount, - type NexusSmartAccountConfig, createSmartAccountClient } from "../src" +import contracts from "../src/__contracts" import { getCustomChain } from "../src/account/utils" import { Logger } from "../src/account/utils/Logger" -import { ENTRYPOINT_ADDRESS, ENTRYPOINT_SIMULATIONS } from "../src/contracts" -import { K1ValidatorAbi, NexusAbi } from "../src/contracts/abi" -import { K1ValidatorFactoryAbi } from "../src/contracts/abi/K1ValidatorFactoryAbi" -import deployedContracts from "./contracts/deployment.json" import { ENTRY_POINT_SIMULATIONS_CREATECALL, ENTRY_POINT_V07_CREATECALL } from "./create.config" +import { deployProcess } from "./deploy.nexus" -import { - BiconomyMetaFactoryAbi, - BootstrapAbi, - BootstrapLibAbi, - MockRegistryAbi, - NexusAccountFactoryAbi -} from "./contracts/abi" - -type AnvilPayload = { - instance: AnvilInstance - deployment: Deployment -} type AnvilInstance = ReturnType type BundlerInstance = ReturnType type BundlerDto = { @@ -59,7 +43,6 @@ export type AnvilDto = { rpcPort: number chain: Chain instance: AnvilInstance - deployment: Deployment } export type NetworkConfigWithBundler = AnvilDto & BundlerDto export type NetworkConfig = Omit< @@ -128,10 +111,10 @@ export const toBundlerInstance = async ({ bundlerPort: number }): Promise => { const instance = alto({ - entrypoints: [ENTRYPOINT_ADDRESS], + entrypoints: [contracts.entryPoint.address], rpcUrl: rpcUrl, executorPrivateKeys: [pKey], - entrypointSimulationContract: ENTRYPOINT_SIMULATIONS, + entrypointSimulationContract: contracts.entryPointSimulations.address, safeMode: false, port: bundlerPort }) @@ -141,24 +124,27 @@ export const toBundlerInstance = async ({ export const toConfiguredAnvil = async ({ rpcPort -}: { rpcPort: number }): Promise => { +}: { rpcPort: number }): Promise => { const instance = anvil({ hardfork: "Paris", - chainId: anvilChain.id, - port: rpcPort + chainId: rpcPort, + port: rpcPort, + codeSizeLimit: 1000000000000 // forkUrl: "https://base-sepolia.gateway.tenderly.co/2oxlNZ7oiNCUpXzrWFuIHx" }) await instance.start() - const deployment = await deploy(rpcPort) - return { instance, deployment } + await deployContracts(rpcPort) + return instance } export const initAnvilPayload = async (): Promise => { - const rpcPort = await getPort() + const rpcPort = await getPort({ + port: [...Array.from({ length: 10 }, (_, i) => 55000 + i)] + }) const rpcUrl = `http://localhost:${rpcPort}` const chain = getTestChainFromPort(rpcPort) - const { instance, deployment } = await toConfiguredAnvil({ rpcPort }) - return { rpcUrl, chain, instance, deployment, rpcPort } + const instance = await toConfiguredAnvil({ rpcPort }) + return { rpcUrl, chain, instance, rpcPort } } export const initBundlerInstance = async ({ @@ -206,8 +192,6 @@ export type FundedTestClients = Awaited> export const toFundedTestClients = async ( network: NetworkConfigWithBundler ) => { - const factoryAddress = network.deployment.k1FactoryAddress - const k1ValidatorAddress = network.deployment.k1ValidatorAddress const chain = network.chain const bundlerUrl = network.bundlerUrl @@ -231,17 +215,13 @@ export const toFundedTestClients = async ( const smartAccount = await createSmartAccountClient({ signer: walletClient, bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress + chain }) const recipientSmartAccount = await createSmartAccountClient({ signer: recipientWalletClient, bundlerUrl, - chain, - factoryAddress, - k1ValidatorAddress + chain }) const smartAccountAddress = await smartAccount.getAddress() @@ -373,190 +353,33 @@ export const getBundlerUrl = (chainId: number) => `https://bundler.biconomy.io/api/v2/${chainId}/nJPK7B3ru.dd7f7861-190d-41bd-af80-6877f74b8f14` const getTestChainFromPort = (port: number): Chain => - getCustomChain(`Anvil-${port}`, anvilChain.id, `http://localhost:${port}`, "") - -type Deployment = { - bootrapAddress: Address - nexusAddress: Address - bootstrapLibAddress: Address - k1ValidatorAddress: Address - mockRegistryAddress: Address - k1FactoryAddress: Address - biconomyMetaFactoryAddress: Address - // Mock Contracts for testing - counterAddress: Address - stakeableAddress: Address - mockExecutorAddress: Address - mockHandlerAddress: Address - mockTokenAddress: Address - mockValidatorAddress: Address - mockHookAddress: Address -} + getCustomChain(`Anvil-${port}`, port, `http://localhost:${port}`, "") -const deploy = async (rpcPort: number): Promise => { +const deployContracts = async (rpcPort: number): Promise => { const DETERMINISTIC_DEPLOYER = "0x4e59b44847b379578588920ca78fbf26c0b4956c" const chain = getTestChainFromPort(rpcPort) const account = getTestAccount() const testClient = toTestClient(chain, account) - let nonce = await testClient.getTransactionCount({ - address: account.address - }) - - await Promise.all([ - testClient.sendTransaction({ - to: DETERMINISTIC_DEPLOYER, - data: ENTRY_POINT_SIMULATIONS_CREATECALL, - gas: 15_000_000n, - nonce: nonce++ - }), - testClient.sendTransaction({ - to: DETERMINISTIC_DEPLOYER, - data: ENTRY_POINT_V07_CREATECALL, - gas: 15_000_000n, - nonce: nonce++ - }) - ]) - - const bootstrapHash = await testClient.deployContract({ - bytecode: deployedContracts.Bootstrap.bytecode as Hex, - abi: BootstrapAbi - }) - - const nexusHash = await testClient.deployContract({ - bytecode: deployedContracts.Nexus.bytecode as Hex, - abi: NexusAbi, - args: [ENTRYPOINT_ADDRESS] + const entrypointSimulationHash = await testClient.sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data: ENTRY_POINT_SIMULATIONS_CREATECALL, + gas: 15_000_000n }) + await testClient.waitForTransactionReceipt({ hash: entrypointSimulationHash }) - const bootstrapLibHash = await testClient.deployContract({ - bytecode: deployedContracts.BootstrapLib.bytecode as Hex, - abi: BootstrapLibAbi + const entrypointHash = await testClient.sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data: ENTRY_POINT_V07_CREATECALL, + gas: 15_000_000n }) - - const k1ValidatorHash = await testClient.deployContract({ - bytecode: deployedContracts.K1Validator.bytecode as Hex, - abi: K1ValidatorAbi - }) - - const mockRegistryHash = await testClient.deployContract({ - bytecode: deployedContracts.MockRegistry.bytecode as Hex, - abi: MockRegistryAbi - }) - - const biconomyMetaFactoryHash = await testClient.deployContract({ - bytecode: deployedContracts.BiconomyMetaFactory.bytecode as Hex, - abi: BiconomyMetaFactoryAbi as Abi, - args: [account.address] - }) - - const receipts = await Promise.all([ - testClient.waitForTransactionReceipt({ hash: bootstrapHash }), - testClient.waitForTransactionReceipt({ hash: nexusHash }), - testClient.waitForTransactionReceipt({ hash: bootstrapLibHash }), - testClient.waitForTransactionReceipt({ hash: k1ValidatorHash }), - testClient.waitForTransactionReceipt({ hash: mockRegistryHash }), - testClient.waitForTransactionReceipt({ hash: biconomyMetaFactoryHash }) - ]) - - // Setup the Mock Contracts - await Promise.all([ - testClient.setCode(deployedContracts.Counter as SetCodeParameters), - testClient.setCode(deployedContracts.Stakeable as SetCodeParameters), - testClient.setCode(deployedContracts.MockExecutor as SetCodeParameters), - testClient.setCode(deployedContracts.MockHandler as SetCodeParameters), - testClient.setCode(deployedContracts.MockToken as SetCodeParameters), - testClient.setCode(deployedContracts.MockValidator as SetCodeParameters), - testClient.setCode(deployedContracts.MockHook as SetCodeParameters) - ]) - - const counterAddress = deployedContracts.Counter.address as Hex - const stakeableAddress = deployedContracts.Stakeable.address as Hex - const mockExecutorAddress = deployedContracts.MockExecutor.address as Hex - const mockHandlerAddress = deployedContracts.MockHandler.address as Hex - const mockTokenAddress = deployedContracts.MockToken.address as Hex - const mockValidatorAddress = deployedContracts.MockValidator.address as Hex - const mockHookAddress = deployedContracts.MockHook.address as Hex - - const [ - bootrapAddress, - nexusAddress, - bootstrapLibAddress, - k1ValidatorAddress, - mockRegistryAddress, - biconomyMetaFactoryAddress - ] = receipts.map((receipt) => receipt.contractAddress) - - const k1ValidatorAddressHash = await testClient.deployContract({ - bytecode: deployedContracts.K1ValidatorFactory.bytecode as Hex, - abi: K1ValidatorFactoryAbi as Abi, - args: [ - nexusAddress, - account.address, - k1ValidatorAddress, - bootrapAddress, - mockRegistryAddress - ] - }) - - const nexusAccountFactoryHash = await testClient.deployContract({ - bytecode: deployedContracts.NexusAccountFactory.bytecode as Hex, - abi: NexusAccountFactoryAbi as Abi, - args: [nexusAddress, account.address] - }) - - const [k1FactoryReceipt, nexusAccountFactoryReceipt] = await Promise.all([ - testClient.waitForTransactionReceipt({ - hash: k1ValidatorAddressHash - }), - testClient.waitForTransactionReceipt({ - hash: nexusAccountFactoryHash - }) - ]) - - const k1FactoryAddress = k1FactoryReceipt.contractAddress - const nexusAccountFactoryAddress = nexusAccountFactoryReceipt.contractAddress - - if ( - !biconomyMetaFactoryAddress || - !nexusAccountFactoryAddress || - !k1FactoryAddress || - !k1FactoryAddress || - !bootrapAddress || - !nexusAddress || - !bootstrapLibAddress || - !k1ValidatorAddress || - !mockRegistryAddress || - !counterAddress || - !stakeableAddress || - !mockExecutorAddress || - !mockHandlerAddress || - !mockTokenAddress || - !mockValidatorAddress || - !mockHookAddress - ) { - throw new Error("Failed to deploy contracts") - } - - const deployment: Deployment = { - biconomyMetaFactoryAddress, - bootrapAddress, - nexusAddress, - bootstrapLibAddress, - k1ValidatorAddress, - mockRegistryAddress, - k1FactoryAddress, - counterAddress, - stakeableAddress, - mockExecutorAddress, - mockHandlerAddress, - mockTokenAddress, - mockValidatorAddress, - mockHookAddress - } - - return deployment + await testClient.waitForTransactionReceipt({ hash: entrypointHash }) + await deployProcess(rpcPort) // hh deploy from nexus in node_modules } export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) + +export const writeToFile = (path: string, content: any) => { + fs.writeFileSync(path, JSON.stringify(content)) +}