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 e06d9aad..9e7dcd78 100755 Binary files a/bun.lockb and b/bun.lockb differ 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)) +}