diff --git a/.github/workflows/browser.yml b/.github/workflows/browser.yml index 4793a7ca9f..0498205be6 100644 --- a/.github/workflows/browser.yml +++ b/.github/workflows/browser.yml @@ -47,4 +47,6 @@ jobs: - run: npm run test:browser -w=@ethereumjs/statemanager - run: npm run test:browser -w=@ethereumjs/evm - run: npm run test:browser -w=@ethereumjs/vm + - run: npm run test:browser -w=@ethereumjs/verkle + diff --git a/package-lock.json b/package-lock.json index c1db22490a..60cc0f5c00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12099,10 +12099,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rust-verkle-wasm": { - "version": "0.0.1", - "license": "(MIT OR Apache-2.0)" - }, "node_modules/rustbn-wasm": { "version": "0.4.0", "license": "(MIT OR Apache-2.0)", @@ -13654,6 +13650,18 @@ "node": ">= 0.8" } }, + "node_modules/verkle-cryptography-wasm": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/verkle-cryptography-wasm/-/verkle-cryptography-wasm-0.4.0.tgz", + "integrity": "sha512-g0gvXqUvdOxqKhyE6qiMLIWqmyP9rnQIb9VDc+GS8SOIPFGx12WhVB7IMkPcfBXUTZmcMT2JXiNMrK7iR2ofBA==", + "dependencies": { + "@scure/base": "^1.1.5" + }, + "engines": { + "node": ">=18", + "npm": ">=7" + } + }, "node_modules/vite": { "version": "5.2.8", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", @@ -14993,7 +15001,8 @@ "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", "js-sdsl": "^4.1.4", - "lru-cache": "10.1.0" + "lru-cache": "10.1.0", + "verkle-cryptography-wasm": "^0.4.0" }, "devDependencies": { "@ethereumjs/block": "^5.2.0", @@ -15074,8 +15083,8 @@ "dependencies": { "@ethereumjs/rlp": "^5.0.2", "@ethereumjs/util": "^9.0.3", - "lru-cache": "^10.0.0", - "rust-verkle-wasm": "^0.0.1" + "lru-cache": "10.1.0", + "verkle-cryptography-wasm": "^0.4.0" }, "engines": { "node": ">=18" diff --git a/packages/block/src/index.ts b/packages/block/src/index.ts index b6b4faa482..f6c5da85a1 100644 --- a/packages/block/src/index.ts +++ b/packages/block/src/index.ts @@ -1,5 +1,5 @@ export { Block } from './block.js' -export { executionPayloadFromBeaconPayload } from './from-beacon-payload.js' +export { type BeaconPayloadJson, executionPayloadFromBeaconPayload } from './from-beacon-payload.js' export { BlockHeader } from './header.js' export { getDifficulty, valuesArrayToHeaderData } from './helpers.js' export * from './types.js' diff --git a/packages/client/src/execution/vmexecution.ts b/packages/client/src/execution/vmexecution.ts index ce6062aa98..318f31ab1f 100644 --- a/packages/client/src/execution/vmexecution.ts +++ b/packages/client/src/execution/vmexecution.ts @@ -188,9 +188,8 @@ export class VMExecution extends Execution { if (this.verkleVM !== undefined) { return } - this.config.logger.info(`Setting up verkleVM`) - const stateManager = new StatelessVerkleStateManager() + const stateManager = await StatelessVerkleStateManager.create() this.verkleVM = await VM.create({ common: this.config.execCommon, blockchain: this.chain.blockchain, diff --git a/packages/client/test/rpc/engine/kaustinen5.spec.ts b/packages/client/test/rpc/engine/kaustinen6.spec.ts similarity index 77% rename from packages/client/test/rpc/engine/kaustinen5.spec.ts rename to packages/client/test/rpc/engine/kaustinen6.spec.ts index 8d292af018..52b5619fd9 100644 --- a/packages/client/test/rpc/engine/kaustinen5.spec.ts +++ b/packages/client/test/rpc/engine/kaustinen6.spec.ts @@ -5,24 +5,28 @@ import * as td from 'testdouble' import { assert, describe, it } from 'vitest' import blocks from '../../testdata/blocks/kaustinen4.json' -import genesisJSON from '../../testdata/geth-genesis/kaustinen5.json' +import genesisJSON from '../../testdata/geth-genesis/kaustinen6.json' import { getRpcClient, setupChain } from '../helpers.js' import type { Chain } from '../../../src/blockchain' import type { BeaconPayloadJson } from '@ethereumjs/block' import type { Common } from '@ethereumjs/common' import type { HttpClient } from 'jayson/promise' -const genesisVerkleStateRoot = '0x382960711d9ccf58b9db20122e2253eb9bfa99d513f8c9d4e85b55971721f4de' -const genesisVerkleBlockHash = '0x086326f2922364dba375e7c9bed375d622845615c0974ffd1d3be0e34edbfbc3' +const genesisVerkleStateRoot = '0x1fbf85345a3cbba9a6d44f991b721e55620a22397c2a93ee8d5011136ac300ee' +const genesisVerkleBlockHash = '0x3fe165c03e7a77d1e3759362ebeeb16fd964cb411ce11fbe35c7032fab5b9a8a' /** - * One can run this test in two formats: - * 1. On the saved blocks, comma separated which are limited (353,368,374,467) + * One can run this test in this format: + * 1. Directly pull slots from a kaustinen beacon url + * `TEST_ONLINE_SLOTS=15 PEER_BEACON_URL=https://beacon.verkle-gen-devnet-6.ethpandaops.io DEBUG=ethjs,vm:*,evm:*,statemanager:verkle* npx vitest run test/rpc/engine/kaustinen6.spec.ts` + * + * However there are other ways to run the test with save data and testvectors but they are from old versions but + * can be updated to make it work + * + * a. On the saved blocks, comma separated (were produced for kaustinen4 ) * `TEST_SAVED_NUMBERS=353,368,374,467 npx vitest run test/rpc/engine/kaustinen5.spec.ts` - * 2. Directly pull slots from a kaustinen beacon url - * `TEST_ONLINE_SLOTS=15 PEER_BEACON_URL=https://beacon.verkle-gen-devnet-5.ethpandaops.io DEBUG=ethjs,vm:*,evm:*,statemanager:verkle* npx vitest run test/rpc/engine/kaustinen5.spec.ts` - * 3. Geth produced testvectors - * `TEST_GETH_VEC_DIR=test/testdata/gethk5vecs DEBUG=ethjs,vm:*,evm:*,statemanager:verkle* npx vitest run test/rpc/engine/kaustinen5.spec.ts` + * b. Geth produced testvectors (were produced for kaustinen5) + * `TEST_GETH_VEC_DIR=test/testdata/gethk5vecs DEBUG=ethjs,vm:*,evm:*,statemanager:verkle* npx vitest run test/rpc/engine/kaustinen6.spec.ts` */ const originalValidate = (BlockHeader as any).prototype._consensusFormatValidation @@ -30,15 +34,22 @@ const originalValidate = (BlockHeader as any).prototype._consensusFormatValidati async function fetchExecutionPayload( peerBeaconUrl: string, slot: number | string -): Promise { - const beaconBlock = await (await fetch(`${peerBeaconUrl}/eth/v2/beacon/blocks/${slot}`)).json() - return beaconBlock.data.message.body.execution_payload +): Promise { + let beaconPayload: BeaconPayloadJson | undefined = undefined + try { + const beaconBlock = await (await fetch(`${peerBeaconUrl}/eth/v2/beacon/blocks/${slot}`)).json() + beaconPayload = beaconBlock.data.message.body.execution_payload + // eslint-disable-next-line no-empty + } catch (_e) {} + + return beaconPayload } async function runBlock( { chain, rpc, common }: { chain: Chain; rpc: HttpClient; common: Common }, { execute, parent }: { execute: any; parent: any }, - isBeaconData: boolean + isBeaconData: boolean, + context: any ) { const blockCache = chain.blockCache @@ -51,6 +62,11 @@ async function runBlock( const executePayload = isBeaconData === true ? executionPayloadFromBeaconPayload(execute as any) : execute const res = await rpc.request('engine_newPayloadV2', [executePayload]) + + // if the block was not executed mark as skip so it shows in test + if (res.result.status === 'ACCEPTED') { + context.skip() + } assert.equal(res.result.status, 'VALID', 'valid status should be received') } @@ -75,21 +91,22 @@ describe(`valid verkle network setup`, async () => { const savedTestCases = process.env.TEST_SAVED_NUMBERS?.split(',') ?? [] for (const testCase of savedTestCases) { - it(`run saved block ${testCase}`, async () => { + it(`run saved block ${testCase}`, async (context) => { let testData let isBeaconData if (process.env.SAVED_DATA_DIR !== undefined) { const fileName = `${process.env.SAVED_DATA_DIR}/${testCase}.json` - testData = JSON.parse(readFileSync(fileName))[testCase] + testData = JSON.parse(readFileSync(fileName, 'utf8'))[testCase] isBeaconData = false } else { + // @ts-expect-error -- Typescript complains that `testCase` can't index the `blocks` object testData = blocks[testCase] isBeaconData = true } if (testData === undefined) { throw Error('unavailable data') } - await runBlock({ common, chain, rpc }, testData, isBeaconData) + await runBlock({ common, chain, rpc }, testData, isBeaconData, context) }) } @@ -107,9 +124,14 @@ describe(`valid verkle network setup`, async () => { let parent = await fetchExecutionPayload(process.env.PEER_BEACON_URL, startSlot - 1) for (let i = startSlot; i <= endSlot; i++) { const execute = await fetchExecutionPayload(process.env.PEER_BEACON_URL, i) - it(`run fetched block slot: ${i} number: ${execute.block_number}`, async () => { + if (execute === undefined) { + // may be there was no block on this slot + continue + } + + it(`run fetched block slot: ${i} number: ${execute.block_number}`, async (context) => { try { - await runBlock({ common, chain, rpc }, { parent, execute }, true) + await runBlock({ common, chain, rpc }, { parent, execute }, true, context) } finally { parent = execute } @@ -123,8 +145,8 @@ describe(`valid verkle network setup`, async () => { let parent = gethVecs[0] for (let i = 1; i < gethVecs.length; i++) { const execute = gethVecs[i] - it(`run geth vector: ${execute.blockNumber}`, async () => { - await runBlock({ common, chain, rpc }, { parent, execute }, false) + it(`run geth vector: ${execute.blockNumber}`, async (context) => { + await runBlock({ common, chain, rpc }, { parent, execute }, false, context) parent = execute }) } @@ -139,8 +161,8 @@ describe(`valid verkle network setup`, async () => { async function loadGethVectors(vectorsDirPath: string, opts: { common: Common }) { // set chain id to 1 for geth vectors - opts.common._chainParams.chainId = BigInt(1) - const stateDiffVec = JSON.parse(readFileSync(`${vectorsDirPath}/statediffs.json`)) + opts.common['_chainParams'].chainId = BigInt(1) + const stateDiffVec = JSON.parse(readFileSync(`${vectorsDirPath}/statediffs.json`, 'utf8')) const executionWitness0 = { stateDiff: [], verkleProof: { diff --git a/packages/client/test/testdata/geth-genesis/kaustinen5.json b/packages/client/test/testdata/geth-genesis/kaustinen6.json similarity index 99% rename from packages/client/test/testdata/geth-genesis/kaustinen5.json rename to packages/client/test/testdata/geth-genesis/kaustinen6.json index c926a106df..040691942b 100644 --- a/packages/client/test/testdata/geth-genesis/kaustinen5.json +++ b/packages/client/test/testdata/geth-genesis/kaustinen6.json @@ -897,5 +897,5 @@ "nonce": "0x1234", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": "1711712640" + "timestamp": "1712918460" } diff --git a/packages/common/src/chains.ts b/packages/common/src/chains.ts index abec20154f..ead59d947b 100644 --- a/packages/common/src/chains.ts +++ b/packages/common/src/chains.ts @@ -570,8 +570,8 @@ export const chains: ChainsDict = { 'enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.holesky.ethdisco.net', ], }, - kaustinen5: { - name: 'kaustinen5', + kaustinen6: { + name: 'kaustinen6', chainId: 69420, networkId: 69420, defaultHardfork: 'prague', @@ -579,14 +579,14 @@ export const chains: ChainsDict = { type: 'pos', algorithm: 'casper', }, - comment: 'Verkle kaustinen testnet 3 (likely temporary, do not hard-wire into production code)', + comment: 'Verkle kaustinen testnet 6 (likely temporary, do not hard-wire into production code)', url: 'https://github.com/eth-clients/kaustinen/', genesis: { difficulty: '0x01', extraData: '0x', gasLimit: '0x17D7840', nonce: '0x0000000000001234', - timestamp: '0x6606a9bc', + timestamp: '0x66190fbc', }, hardforks: [ { @@ -646,7 +646,7 @@ export const chains: ChainsDict = { { name: 'prague', block: null, - timestamp: '1711712640', + timestamp: '1712848500', }, ], bootstrapNodes: [], diff --git a/packages/common/src/enums.ts b/packages/common/src/enums.ts index dbb218151c..dd13f13875 100644 --- a/packages/common/src/enums.ts +++ b/packages/common/src/enums.ts @@ -5,7 +5,7 @@ export enum Chain { Goerli = 5, Sepolia = 11155111, Holesky = 17000, - Kaustinen5 = 69420, + Kaustinen6 = 69420, } /** @@ -44,10 +44,10 @@ export const ChainGenesis: Record = { blockNumber: BIGINT_0, stateRoot: hexToBytes('0x69d8c9d72f6fa4ad42d4702b433707212f90db395eb54dc20bc85de253788783'), }, - [Chain.Kaustinen5]: { - name: 'kaustinen5', + [Chain.Kaustinen6]: { + name: 'kaustinen6', blockNumber: BIGINT_0, - stateRoot: hexToBytes('0x382960711d9ccf58b9db20122e2253eb9bfa99d513f8c9d4e85b55971721f4de'), + stateRoot: hexToBytes('0x1fbf85345a3cbba9a6d44f991b721e55620a22397c2a93ee8d5011136ac300ee'), }, } diff --git a/packages/evm/src/interpreter.ts b/packages/evm/src/interpreter.ts index 6fd4ca1343..426ee73146 100644 --- a/packages/evm/src/interpreter.ts +++ b/packages/evm/src/interpreter.ts @@ -270,11 +270,11 @@ export class Interpreter { this._runState.env.chargeCodeAccesses === true ) { const contract = this._runState.interpreter.getAddress() + if ( - !(this._runState.stateManager as StatelessVerkleStateManager).checkChunkWitnessPresent( - contract, - programCounter - ) + !(await ( + this._runState.stateManager as StatelessVerkleStateManager + ).checkChunkWitnessPresent(contract, programCounter)) ) { throw Error(`Invalid witness with missing codeChunk for pc=${programCounter}`) } diff --git a/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts b/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts index 5dedf22f4c..4a24d746f8 100644 --- a/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts +++ b/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts @@ -76,7 +76,6 @@ describe('Precompiles: BLS12-G2-MUL', () => { const evm = await EVM.create({ common, }) - console.log(getActivePrecompiles(common)) const BLS12G2MUL = getActivePrecompiles(common).get('000000000000000000000000000000000000000f')! for (const testVector of testData) { diff --git a/packages/genesis/test/index.spec.ts b/packages/genesis/test/index.spec.ts index 7c820890b1..d3eb6023b4 100644 --- a/packages/genesis/test/index.spec.ts +++ b/packages/genesis/test/index.spec.ts @@ -10,7 +10,7 @@ describe('genesis test', () => { const chainIds = Object.keys(ChainGenesis) for (const chainId of chainIds) { // Kaustinen can have an empty genesis state since verkle blocks contain their pre-state - if (Number(chainId) === Chain.Kaustinen5) continue + if (Number(chainId) === Chain.Kaustinen6) continue const { name, stateRoot: expectedRoot } = ChainGenesis[chainId as unknown as Chain] diff --git a/packages/statemanager/package.json b/packages/statemanager/package.json index 64f437a5b1..f794eb2e66 100644 --- a/packages/statemanager/package.json +++ b/packages/statemanager/package.json @@ -57,7 +57,8 @@ "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", "js-sdsl": "^4.1.4", - "lru-cache": "10.1.0" + "lru-cache": "10.1.0", + "verkle-cryptography-wasm": "^0.4.0" }, "devDependencies": { "@ethereumjs/block": "^5.2.0", diff --git a/packages/statemanager/src/accessWitness.ts b/packages/statemanager/src/accessWitness.ts index 84ee09be9c..fe77207b95 100644 --- a/packages/statemanager/src/accessWitness.ts +++ b/packages/statemanager/src/accessWitness.ts @@ -3,6 +3,7 @@ import { getKey, getStem } from '@ethereumjs/verkle' import debugDefault from 'debug' import type { Address, PrefixedHexString } from '@ethereumjs/util' +import type { VerkleCrypto } from '@ethereumjs/verkle' const { debug: createDebugLogger } = debugDefault const debug = createDebugLogger('statemanager:verkle:aw') @@ -72,13 +73,18 @@ export type AccessedStateWithAddress = AccessedState & { export class AccessWitness { stems: Map chunks: Map - + verkleCrypto: VerkleCrypto constructor( opts: { + verkleCrypto?: VerkleCrypto stems?: Map chunks?: Map } = {} ) { + if (opts.verkleCrypto === undefined) { + throw new Error('verkle crypto required') + } + this.verkleCrypto = opts.verkleCrypto this.stems = opts.stems ?? new Map() this.chunks = opts.chunks ?? new Map() } @@ -164,7 +170,7 @@ export class AccessWitness { return gas } - touchCodeChunksRangeOnReadAndChargeGas(contact: Address, startPc: number, endPc: number) { + touchCodeChunksRangeOnReadAndChargeGas(contact: Address, startPc: number, endPc: number): bigint { let gas = BIGINT_0 for (let chunkNum = Math.floor(startPc / 31); chunkNum <= Math.floor(endPc / 31); chunkNum++) { const { treeIndex, subIndex } = getTreeIndicesForCodeChunk(chunkNum) @@ -173,7 +179,11 @@ export class AccessWitness { return gas } - touchCodeChunksRangeOnWriteAndChargeGas(contact: Address, startPc: number, endPc: number) { + touchCodeChunksRangeOnWriteAndChargeGas( + contact: Address, + startPc: number, + endPc: number + ): bigint { let gas = BIGINT_0 for (let chunkNum = Math.floor(startPc / 31); chunkNum <= Math.floor(endPc / 31); chunkNum++) { const { treeIndex, subIndex } = getTreeIndicesForCodeChunk(chunkNum) @@ -251,7 +261,7 @@ export class AccessWitness { // i.e. no fill cost is charged right now const chunkFill = false - const accessedStemKey = getStem(address, treeIndex) + const accessedStemKey = getStem(this.verkleCrypto, address, treeIndex) const accessedStemHex = bytesToHex(accessedStemKey) let accessedStem = this.stems.get(accessedStemHex) if (accessedStem === undefined) { @@ -291,7 +301,7 @@ export class AccessWitness { /**Create a shallow copy, could clone some caches in future for optimizations */ shallowCopy(): AccessWitness { - return new AccessWitness() + return new AccessWitness({ verkleCrypto: this.verkleCrypto }) } merge(accessWitness: AccessWitness): void { diff --git a/packages/statemanager/src/statelessVerkleStateManager.ts b/packages/statemanager/src/statelessVerkleStateManager.ts index d8d8aa29d1..1e2140d32c 100644 --- a/packages/statemanager/src/statelessVerkleStateManager.ts +++ b/packages/statemanager/src/statelessVerkleStateManager.ts @@ -13,10 +13,10 @@ import { short, toBytes, } from '@ethereumjs/util' -import { getKey, getStem, verifyUpdate } from '@ethereumjs/verkle' +import { getKey, getStem } from '@ethereumjs/verkle' import debugDefault from 'debug' import { keccak256 } from 'ethereum-cryptography/keccak.js' -import { equalsBytes } from 'ethereum-cryptography/utils' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' import { AccessWitness, @@ -45,6 +45,7 @@ import type { StorageRange, } from '@ethereumjs/common' import type { Address, PrefixedHexString } from '@ethereumjs/util' +import type { VerkleCrypto } from '@ethereumjs/verkle' const { debug: createDebugLogger } = debugDefault @@ -113,6 +114,7 @@ export interface StatelessVerkleStateManagerOpts { storageCacheOpts?: CacheOptions codeCacheOpts?: CacheOptions accesses?: AccessWitness + verkleCrypto?: VerkleCrypto } const PUSH_OFFSET = 95 @@ -141,6 +143,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { originalStorageCache: OriginalStorageCache + verkleCrypto: VerkleCrypto protected readonly _accountCacheSettings: CacheSettings protected readonly _storageCacheSettings: CacheSettings protected readonly _codeCacheSettings: CacheSettings @@ -173,6 +176,17 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { private keccakFunction: Function + /** + * Async static constructor for StatelessVerkleStateManager + * @param opts `StatelessVerkleStateManagerOpts` + * @returns a StatelessVerkleStateManager with initialized Verkle Crypto + */ + static create = async (opts: StatelessVerkleStateManagerOpts = {}) => { + if (opts.verkleCrypto === undefined) { + opts.verkleCrypto = await loadVerkleCrypto() + } + return new StatelessVerkleStateManager(opts) + } /** * Instantiate the StateManager interface. */ @@ -221,23 +235,15 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { this.keccakFunction = opts.common?.customCrypto.keccak256 ?? keccak256 + if (opts.verkleCrypto === undefined) { + throw new Error('verkle crypto required') + } + this.verkleCrypto = opts.verkleCrypto + // Skip DEBUG calls unless 'ethjs' included in environmental DEBUG variables // Additional window check is to prevent vite browser bundling (and potentially other) to break this.DEBUG = typeof window === 'undefined' ? process?.env?.DEBUG?.includes('ethjs') ?? false : false - - /* - * For a custom StateManager implementation adopt these - * callbacks passed to the `Cache` instantiated to perform - * the `get`, `put` and `delete` operations with the - * desired backend. - */ - // const getCb: get = async (address) => { - // return undefined - // } - // const putCb: put = async (keyBuf, accountRlp) => {} - // const deleteCb = async (keyBuf: Uint8Array) => {} - // this._cache = new Cache({ get, putCb, deleteCb }) } async getTransitionStateRoot(_: DefaultStateManager, __: Uint8Array): Promise { @@ -257,7 +263,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } this._executionWitness = executionWitness - this.accessWitness = accessWitness ?? new AccessWitness() + this.accessWitness = accessWitness ?? new AccessWitness({ verkleCrypto: this.verkleCrypto }) this._proof = executionWitness.verkleProof as unknown as Uint8Array @@ -325,9 +331,9 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { return getKey(stem, CODE_SIZE_LEAF_KEY) } - getTreeKeyForCodeChunk(address: Address, chunkId: number) { + async getTreeKeyForCodeChunk(address: Address, chunkId: number) { const { treeIndex, subIndex } = getTreeIndicesForCodeChunk(chunkId) - return getKey(getStem(address, treeIndex), toBytes(subIndex)) + return getKey(getStem(this.verkleCrypto, address, treeIndex), toBytes(subIndex)) } chunkifyCode(code: Uint8Array) { @@ -340,15 +346,15 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { throw new Error('Not implemented') } - getTreeKeyForStorageSlot(address: Address, storageKey: bigint) { + async getTreeKeyForStorageSlot(address: Address, storageKey: bigint) { const { treeIndex, subIndex } = getTreeIndexesForStorageSlot(storageKey) - return getKey(getStem(address, treeIndex), toBytes(subIndex)) + return getKey(getStem(this.verkleCrypto, address, treeIndex), toBytes(subIndex)) } - checkChunkWitnessPresent(address: Address, codeOffset: number) { - const chunkId = Math.floor(codeOffset / 31) - const chunkKey = bytesToHex(this.getTreeKeyForCodeChunk(address, chunkId)) + async checkChunkWitnessPresent(address: Address, codeOffset: number) { + const chunkId = codeOffset / 31 + const chunkKey = bytesToHex(await this.getTreeKeyForCodeChunk(address, chunkId)) return this._state[chunkKey] !== undefined } @@ -358,7 +364,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { * checkpoints were reverted. */ shallowCopy(): EVMStateManagerInterface { - const stateManager = new StatelessVerkleStateManager() + const stateManager = new StatelessVerkleStateManager({ verkleCrypto: this.verkleCrypto }) stateManager.initVerkleExecutionWitness(this._blockNum, this._executionWitness!) return stateManager } @@ -419,7 +425,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { const chunks = Math.floor(codeSize / 31) + 1 for (let chunkId = 0; chunkId < chunks; chunkId++) { - const chunkKey = bytesToHex(this.getTreeKeyForCodeChunk(address, chunkId)) + const chunkKey = bytesToHex(await this.getTreeKeyForCodeChunk(address, chunkId)) const codeChunk = this._state[chunkKey] if (codeChunk === null) { const errorMsg = `Invalid access to a non existent code chunk with chunkKey=${chunkKey}` @@ -486,7 +492,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } } - const storageKey = this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) + const storageKey = await this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) const storageValue = toBytes(this._state[bytesToHex(storageKey)]) if (!this._storageCacheSettings.deactivate) { @@ -508,7 +514,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { this._storageCache!.put(address, key, value) } else { // TODO: Consider refactoring this in a writeContractStorage function? Like in stateManager.ts - const storageKey = this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) + const storageKey = await this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) this._state[bytesToHex(storageKey)] = bytesToHex(setLengthRight(value, 32)) } } @@ -518,7 +524,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { * @param address - Address to clear the storage of */ async clearContractStorage(address: Address): Promise { - const stem = getStem(address, 0) + const stem = getStem(this.verkleCrypto, address, 0) const codeHashKey = this.getTreeKeyForCodeHash(stem) this._storageCache?.clearContractStorage(address) // Update codeHash to `c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470` @@ -537,7 +543,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } } - const stem = getStem(address, 0) + const stem = getStem(this.verkleCrypto, address, 0) const versionKey = this.getTreeKeyForVersion(stem) const balanceKey = this.getTreeKeyForBalance(stem) const nonceKey = this.getTreeKeyForNonce(stem) @@ -624,7 +630,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } if (this._accountCacheSettings.deactivate) { - const stem = getStem(address, 0) + const stem = getStem(this.verkleCrypto, address, 0) const balanceKey = this.getTreeKeyForBalance(stem) const nonceKey = this.getTreeKeyForNonce(stem) const codeHashKey = this.getTreeKeyForCodeHash(stem) @@ -678,7 +684,8 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { throw new Error('Not implemented yet') } - async verifyProof(parentVerkleRoot: Uint8Array): Promise { + // TODO: Re-implement this method once we have working verifyUpdate and the testnets have been updated to provide ingestible data + async verifyProof(_: Uint8Array): Promise { // Implementation: https://github.com/crate-crypto/rust-verkle-wasm/blob/master/src/lib.rs#L45 // The root is the root of the current (un-updated) trie // The proof is proof of membership of all of the accessed values @@ -687,17 +694,19 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { // // This function returns the new root when all of the updated values are applied - const updatedStateRoot: Uint8Array = verifyUpdate( - parentVerkleRoot, - this._proof!, // TODO: Convert this into a Uint8Array ingestible by the method - new Map() // TODO: Generate the keys_values map from the old to the updated value - ) + // const updatedStateRoot: Uint8Array = verifyUpdate( + // parentVerkleRoot, + // this._proof!, // TODO: Convert this into a Uint8Array ingestible by the method + // new Map() // TODO: Generate the keys_values map from the old to the updated value + // ) // TODO: Not sure if this should return the updated state Root (current block) or the un-updated one (parent block) - const verkleRoot = await this.getStateRoot() + // const verkleRoot = await this.getStateRoot() // Verify that updatedStateRoot matches the state root of the block - return equalsBytes(updatedStateRoot, verkleRoot) + // return equalsBytes(updatedStateRoot, verkleRoot) + + return true } // Verifies that the witness post-state matches the computed post-state diff --git a/packages/statemanager/test/statelessVerkleStateManager.spec.ts b/packages/statemanager/test/statelessVerkleStateManager.spec.ts index 75450d9c51..5a1dd3d645 100644 --- a/packages/statemanager/test/statelessVerkleStateManager.spec.ts +++ b/packages/statemanager/test/statelessVerkleStateManager.spec.ts @@ -1,5 +1,6 @@ import { Block } from '@ethereumjs/block' import { Common } from '@ethereumjs/common' +import { TransactionFactory } from '@ethereumjs/tx' import { Account, Address, @@ -9,37 +10,47 @@ import { randomBytes, } from '@ethereumjs/util' import { getStem } from '@ethereumjs/verkle' -import { assert, describe, it, test } from 'vitest' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' +import { assert, beforeAll, describe, it, test } from 'vitest' import { CacheType, StatelessVerkleStateManager } from '../src/index.js' import * as testnetVerkleKaustinen from './testdata/testnetVerkleKaustinen.json' import * as verkleBlockJSON from './testdata/verkleKaustinenBlock.json' +import type { VerkleCrypto } from '@ethereumjs/verkle' + describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { + let verkleCrypto: VerkleCrypto + beforeAll(async () => { + verkleCrypto = await loadVerkleCrypto() + }) const common = Common.fromGethGenesis(testnetVerkleKaustinen, { chain: 'customChain', - eips: [6800], + eips: [4895, 6800], }) - const block = Block.fromBlockData(verkleBlockJSON, { common }) + const decodedTxs = verkleBlockJSON.transactions.map((tx) => + TransactionFactory.fromSerializedData(hexToBytes(tx)) + ) + const block = Block.fromBlockData({ ...verkleBlockJSON, transactions: decodedTxs }, { common }) it('initPreState()', async () => { - const stateManager = new StatelessVerkleStateManager() + const stateManager = await StatelessVerkleStateManager.create({ verkleCrypto }) stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) assert.ok(Object.keys(stateManager['_state']).length !== 0, 'should initialize with state') }) it('getAccount()', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) const account = await stateManager.getAccount( - Address.fromString('0x9791ded6e5d3d5dafca71bb7bb2a14187d17e32e') + Address.fromString('0x6177843db3138ae69679a54b95cf345ed759450d') ) - assert.equal(account!.balance, 99765345920194942688594n, 'should have correct balance') - assert.equal(account!.nonce, 3963257n, 'should have correct nonce') + assert.equal(account!.balance, 724462229558283876n, 'should have correct balance') + assert.equal(account!.nonce, 700n, 'should have correct nonce') assert.equal(account!._storageRoot, null, 'stateroot should have not been set') assert.equal( bytesToHex(account!.codeHash), @@ -49,7 +60,7 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { }) it('put/delete/modify account', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) const address = new Address(randomBytes(20)) @@ -95,11 +106,11 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { }) it('getTreeKeyFor* functions', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) - const address = Address.fromString('0x9791ded6e5d3d5dafca71bb7bb2a14187d17e32e') - const stem = getStem(address, 0) + const address = Address.fromString('0x6177843db3138ae69679a54b95cf345ed759450d') + const stem = getStem(stateManager.verkleCrypto, address, 0n) const balanceKey = stateManager.getTreeKeyForBalance(stem) const nonceKey = stateManager.getTreeKeyForNonce(stem) @@ -133,10 +144,11 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { type: CacheType.ORDERED_MAP, }, common, + verkleCrypto, }) stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) - const stateManagerCopy = stateManager.shallowCopy() + const stateManagerCopy = stateManager.shallowCopy() as StatelessVerkleStateManager assert.equal( (stateManagerCopy as any)['_accountCacheSettings'].type, @@ -152,8 +164,8 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { // TODO contract storage functions not yet completely implemented test.skip('get/put/clear contract storage', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) - stateManager.initVerkleExecutionWitness(block.executionWitness) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) const contractAddress = Address.fromString('0x4242424242424242424242424242424242424242') const storageKey = '0x0000000000000000000000000000000000000000000000000000000000000022' diff --git a/packages/statemanager/test/testdata/verkleKaustinenBlock.json b/packages/statemanager/test/testdata/verkleKaustinenBlock.json index 2c977fa146..e6072507c9 100644 --- a/packages/statemanager/test/testdata/verkleKaustinenBlock.json +++ b/packages/statemanager/test/testdata/verkleKaustinenBlock.json @@ -1,677 +1,2626 @@ { "header": { - "baseFeePerGas": "0x8", - "blockHash": "0xb528b8feb9f7c45dc76b1dab179567f3fcbba43069c0835e20e2080b9e1bf47d", - "blockNumber": "0x680c5", - "extraData": "0x", - "coinbase": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "gasLimit": "0x1c9c380", - "gasUsed": "0x9f08f", + "blockNumber": "0x61", + "parentHash": "0xf3a540f1041fc87838706d6bd000d6dd8ba2193601578b89c86587921e76c00d", + "feeRecipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "stateRoot": "0x2cf2ab8fed2dcfe2fa77da044ab16393dbdabbc65deea5fdf272107a039f2c60", + "receiptsRoot": "0x012e5d46c71887b3c2cc72adea31450afd9ab07e572bf2746f2c024b0d937e7a", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x87c1abaf5d93799d62a37db5506cbc09551bc53433796ca7906b1de6c683b305", - "prevRandao": "0xde46f41bf314eee291472323c0ca8f2739ad687c5b29ef9ee496cf98add9e7bb", - "receiptsRoot": "0x4bdd2c518110f2142b6368dde87fe25609646f6c589397cf759baf3c7344ab9b", - "stateRoot": "0x43a3e98ba6fb6b303692b5279c7eeb8a191aa7cbff0ffd425368eb34a470268b", - "timestamp": "0x646f4448", - "transactionsTrie": "0x6158b8a8726077d42aac4433db063c79f8413054842d21cae7345941b86e9f35" + "gasLimit": "0x1a359a6", + "gasUsed": "0x56082f", + "timestamp": "0x66191448", + "extraData": "0xd983010c01846765746889676f312e32302e3134856c696e7578", + "baseFeePerGas": "0x152f", + "blockHash": "0x2f08a1461ab75873a0f2d23170f46d3be2ade2a7f4ebf607fc53fb361cf85865", + "prevRandao": "0xd27140a1c45ec8f8cb212da5c86ac7b0ac4209a2d3b9fd0d7a1541c98c70de86" }, "transactions": [ - { - "type": "0x2", - "nonce": "0x3", - "gasLimit": "0x23011", - "to": "0x", - "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100a1565b60405180910390f35b610073600480360381019061006e91906100ed565b61007e565b005b60008054905090565b8060008190555050565b6000819050919050565b61009b81610088565b82525050565b60006020820190506100b66000830184610092565b92915050565b600080fd5b6100ca81610088565b81146100d557600080fd5b50565b6000813590506100e7816100c1565b92915050565b600060208284031215610103576101026100bc565b5b6000610111848285016100d8565b9150509291505056fea26469706673582212208f6a6e5a1a593ae1ba29bd21e9d6e9092ae1df1986f8e8de139149a0e99dce1564736f6c63430008120033", - "v": "0x1", - "r": "0x272074bd1345fad76ab5e5a41b575890ebbb83747eb407e58caf61cbc503d357", - "s": "0x33d7a5ef1209b877e6cfb5aeab25e120e5a0d1acfc628ff04b85d7f0df4b3ddf", - "chainId": "0x10f2c", - "maxPriorityFeePerGas": "0x9502f900", - "maxFeePerGas": "0x9502f910", - "accessList": [] - }, - { - "type": "0x2", - "nonce": "0x4", - "gasLimit": "0x23011", - "to": "0x", - "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100a1565b60405180910390f35b610073600480360381019061006e91906100ed565b61007e565b005b60008054905090565b8060008190555050565b6000819050919050565b61009b81610088565b82525050565b60006020820190506100b66000830184610092565b92915050565b600080fd5b6100ca81610088565b81146100d557600080fd5b50565b6000813590506100e7816100c1565b92915050565b600060208284031215610103576101026100bc565b5b6000610111848285016100d8565b9150509291505056fea26469706673582212208f6a6e5a1a593ae1ba29bd21e9d6e9092ae1df1986f8e8de139149a0e99dce1564736f6c63430008120033", - "v": "0x0", - "r": "0xedf90bc7c4803cd34a1db633a06ba65d2aa15fbcacd24840a7787892efe0f05f", - "s": "0x5729091ec8aee9f2cada76ee82a6d67c575dcd9a138c9c99d92740ba2aff4ace", - "chainId": "0x10f2c", - "maxPriorityFeePerGas": "0x9502f900", - "maxFeePerGas": "0x9502f910", - "accessList": [] - }, - { - "type": "0x0", - "nonce": "0x3c7979", - "gasLimit": "0x186a0", - "to": "0xfc32a5c92c78e00b753283f45fd00c684ecff693", - "value": "0x0", - "data": "0x7f2d01a9842cdc19531652a41333db96f8f11f504385613a98b2e1394c095dc2bd60f9527f61d73699c64e21e12f8fe4a2ee7011812c49407abd0af9b8a5a7d66d507dadba610119527f44b98490e04b17a045b4e61761d325c37f808a7e5943e0373a559fb6598d5427610139527f8978a03e359c3e219cf3111998317cc24c", - "v": "0x21e7c", - "r": "0x7623d524742ccbc3059ea95d603b3fac066daf4300bd6d58f1378cb742c004fc", - "s": "0x1a057f8ccc7b60bb53683b72f9fe8c050ba7e96f4a5c77a1f96f922e4020f219", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x0", - "nonce": "0x3c797a", - "gasLimit": "0x186a0", - "to": "0x66a68bc25814f4d763327f7b9774463af847806d", - "value": "0x0", - "data": "0x60a7606b5360a3606c53609a606d536021606e5360e1606f5379600060ac5560006003556000606755", - "v": "0x21e7c", - "r": "0xcc2dd5879ca718288f279c1e0e9f521bf17cf19a6bee3522fe8fa019c169e485", - "s": "0x548cbe026fad70112faea072a1dc36a797e0bc0f97b1a82ddbe3568d15feece4", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x1", - "nonce": "0x3c797b", - "gasLimit": "0x186a0", - "to": "0x", - "value": "0x0", - "data": "0x7e7f7654ea857876c2f81f3e9ac805692ec2a16d2262c71961753ad1d251d71c2f386024527f9183f5f9fdffbfb870a8d8c150597eb13f88c691d53a9fdd5fb80287dc96699b6031527fbf80293e0df727acdb32469584afd3c7eeb61bdda84f2dacd0b37a44aa6204126051527fa9d47cae3479a9e05fad17765c563caf9e43", - "v": "0x0", - "r": "0xc74589e3654e1065977e507d0785ab4b22fbb0f0c05791ce6b2ceb53b86fc70c", - "s": "0x76eba80a9488ef2073a0a7c8fd914ece9c33e915e59884737ad45b78349ebd73", - "chainId": "0x10f2c", - "gasPrice": "0x3b9b1368", - "accessList": [] - }, - { - "type": "0x0", - "nonce": "0x3c797c", - "gasLimit": "0x186a0", - "to": "0x", - "value": "0x0", - "data": "0x78600060b1556091604e53605b604f5360ca605053606460515360eb60525360c360535360d760545360736055536082605653600b605753604b6058536054605953603c605a5360c2605b536073605c53600b605d5360ff605e537f5b823f64815224d1718fdfd1f205b06828542ca9426a5a88be06cfbe3d37001e60bd5260", - "v": "0x21e7b", - "r": "0xa1f2db6e99a5bc25f992a224c89cd9e158544ee16292e5fe00ddc3b22462cbd9", - "s": "0x73ecebc3c5772309cbabb11ab1b4c284e0cd625177202d7e052946e13ec99319", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x0", - "nonce": "0x3c797d", - "gasLimit": "0x186a0", - "to": "0xb02a2eda1b317fbd16760128836b0ac59b560e9d", - "value": "0x0", - "data": "0x7f53a1da3bbb96dc7f50d0b6f982567bc224e05c981d0a626f516323930b1d5e95602852604660485360b7604953cf6000609c55604a60245360ad602553607c602653607e60275360ae602853602b6029536003602a5360ee602b5360a5602c5360d5602d5360a7602e5360cf602f5360ba603053601c603153608260325360", - "v": "0x21e7c", - "r": "0x519314cb62a34f2578f94c084e8ff4cd7a8148270edcef572c2cde24f38960bc", - "s": "0x67cfbd75c6c556cd3b4c0e34fc098a3fce8c8fae4230106e9340c858c12a0323", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x0", - "nonce": "0x3c797e", - "gasLimit": "0x186a0", - "to": "0xae7d74fe5748f2675946c7542f4a3c729037b417", - "value": "0x0", - "data": "0x", - "v": "0x21e7c", - "r": "0xc6b4d19380f4e1527dddb9e82021cba2ce483d144e2360c3e31f8bbd5950d96b", - "s": "0x5f503fd55dcb51605d870a9833a8e8b4e8d352efd4798be70ae273185a3194f8", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x2", - "nonce": "0x3c797f", - "gasLimit": "0x186a0", - "to": "0xb02a2eda1b317fbd16760128836b0ac59b560e9d", - "value": "0x0", - "data": "0x9b948702eeb75ba77ffa681fb04ba4b3ff1fd0cd9b4c773796f008e230da7ef9f9ffd7ec04212d29d4604e527f76b3bf72263ccb7bc2a5a1c7d4529fd2e617ead0c0a8bc22b48bd887770897d9606e527fa241ae8d0974af7c4329355d6ba6b82741e0b2f3fa12755c1b4373c174b58f34608e527fb8e59608c4d61527cb6af4", - "v": "0x0", - "r": "0xaec3bb3876aa6301f1a4f03a3ec65cad1de1b12323fd1cfea76dad95740a83b0", - "s": "0x421a2088a5b1d14aa357ac368bb4f7a0052bfcc79693fb531e3aeb44e5937b0c", - "chainId": "0x10f2c", - "maxPriorityFeePerGas": "0x3b9b1360", - "maxFeePerGas": "0x3b9b1368", - "accessList": [] - }, - { - "type": "0x1", - "nonce": "0x3c7980", - "gasLimit": "0x186a0", - "to": "0xb02a2eda1b317fbd16760128836b0ac59b560e9d", - "value": "0x0", - "data": "0x600060565560006041557fdaf76cfabc5c32c462d3caf74accf78f4941c9bc501b9064aa1a52cfc0d1b1cd6013527f0b03c5292bd0ab5eace6a0a857290695e471f4893253a163f8ec6149e0e1d1dd6033527fc866d02fc029f173ae232870cb8ea7fc272bd888c47c1460685bce303e1c939b6053527f82e4fbc264bea50b0e", - "v": "0x1", - "r": "0xbb14b1bf1dc47e99ba5176f0051f87a5af3ad4596bdbc982767704aae6329a4d", - "s": "0x6790cd2ad26afb01edbe78279975f60a465afc88899f258e89d9352f00a4afb", - "chainId": "0x10f2c", - "gasPrice": "0x3b9b1368", - "accessList": [] - } + "0xf8ea8202bc843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b88060006093556000601555f06000600c55600060d4557f62d246280a89c93e2e733a707fe8bfb147b1d0eb41f4f22b5e79e5db83df065160c8527f267503c6e445d97a2e130084bc0ee7f50b762404959c90aa29fa6a186317448a60e8527f605b386742211b44aeb98e9d1a15714ccd7fb5ccb8935014d2551127c149bf88610183021e7ca0f4f0abf4288da6b8e93b284da3c71664bb334a739aef3cd327f38494010e4f16a037801159a1007ef996df618b59c7303d490d209f0e65bcfbd510df6224c8e3fa", + "0x01f8ec83010f2c8202bd843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8807f871613375053597dd947f76f4b59f193ed196d0a383db4f2c010538dc2d15d256006527fb9e5ac58f4696ea9fa97a8e72a506746d0329eb058430a6bdebedfaddca6361b60265260e46046536043604753609960485360456049536039604a5360c2604b5360ba604c536086604d536006604e536077604f53601660505360c080a02c88bd966264bb90cc7f8f38e404d4c1276c0d632f9af6969cf17808b272a76ba025eb38477c1acbf1d704fa4781b3d06d67fef69dc1897b8f5cf6986d671b4471", + "0x01f8ec83010f2c8202be843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000606b557f74e04d75d11784e3b01e0e4f9a60a43d78bcd32ed0666c174967d83f68ee200d60fb52605361011b5360a861011c5360dc61011d53608361011e53604861011f537eb63b7b4ba4cd1bd1994e0ac6eaccc0b69552b865e8796b5d92933417635a55601b527f835ef0fdbfe12ec4e04a55376e7959737676de295bc080a0a403e43f4e8eec2de13e2a5f2672e8d3ec769adff1a54cfebb01a591f720d69ea04d015cbad681bb3f98f629f1b785c34f0c8eb0295afdd4452bcb40181fa4d7ff", + "0x02f8f183010f2c8202bc843b9aca00843b9ae233830186a094230f71cb4e7df4bd2533281ca0af045c7265e2ca80b8806000606b557fc0ee05d8d433057c94f4b522ee190f37520763403561740a4a45276cfffc62f560575260406077536064607853608060795360a3607a536052607b536028607c53603d607d53601c607e536026607f5360be60805360e16081536025608253606360835360906084536001608553605760865360a36087536052c001a00f1ab5643ae1996e8c5ba9c9a74ed091c38c09a3f6061bfd567831e8c6046870a00e2268f2c00df0e0e546a09743c19303e98bc3d9b492c8e6446f0008212698d9", + "0x02f8f183010f2c8202bf843b9aca00843b9ae233830186a094a8c5863cffdf51206d6e5169ff52b8412df6989380b8807f252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c697a611ddbe7916038527f5daa14e1e219a7f8e5971d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642746058527f1fba8cd991afe01c60d1af8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec6078527f87bd75d3fbffc9915aff0cf2776ee367cd83bbc001a0cce9670b6fef7306b4183cdbbbf61d58649d13032c9623633e337164be115260a07029c2aae90010a8cf51a7927d0e2a34454004457b985a9bdf46b276006c6b0a", + "0x01f8ec83010f2c8202c0843b9ae233830186a094000000000000000000000000000000000000000080b8806000603c557fab253ed30195e7a8d206681e8fdeae8ceef0810d7bd9d222e996ff53e66dbaff608f5260c060af53600d60b053609460b153607860b253602960b35360a260b453607c60b55360006043556000604355600060b05597c61c7fa72659d4ab40a1576491227496d007e871853d67b0b454d931b373303cb6991360c080a082341e9c8943366896e911fae2df1b99ff59c5af45aeadf0d361c7a4b9974f69a05c188d12a29d122d90429448d7999260ff319973d50780350e2e845b400ba194", + "0x02f8f183010f2c8202c1843b9aca00843b9ae233830186a0943ef849aa4aafac0612334791b201ff8cd80cd5b180b8807ff16cd0e7f35957becf2a658baf68226eaf4ce04c6a4a1c59e202c198e85f286860a3527fd83e6d6279d2f7477af9376136c3197442b808817d9b4ab5809c62799457708f60c3527fc1c5a1882dcc0a0c5f935d5e63eb5af01a2ba1df46e9efa4668e7b3ebf48032460e3527f7a324fb31e93190c4cf9957762ca8c3583f27fc080a0deda834531e8e8a7416d48c7aab1798a9029635e75e8db95001f3cb390b79ae1a00aae8d1fe19673f632900b298252c76a88e432a071bad8e5f953a665b7582fec", + "0x02f8dd83010f2c8202c2843b9aca00843b9ae233830186a08080b8804c7fb298fcaed32a3ed8497bcee3c06e667cde78e94be60ed8fd31a6daf8cc4472e36045527f4eeb85fc981a45dafdb56d55fda3cb099e03683ad89e3cfdad53c367327d66986065527f9d9a48991aa51cf33bad8a37442a1548ba3f4408ecc3e790edb546c42a9ec7f46085527f543772b939f002969866ee6b75def0a05ed0c001a014b0c44ef32db47fafa7d64abd32f7b72db5a45d7132ab09a4412dd6b3152f97a0789a75b0f3971604b136eb3e7fee81cb5d0b5521660ca8356531c9824b0d587b", + "0xf8d68202c3843b9ae233830186a08080b8806d57417fae6f51c8841a7bf1d04549fed399c1ffb7f09f30bc7ef270ac93dce7bd1550f06011527fc547e60cd3da33d487ec62d246280a89c93e2e733a707fe8bfb147b1d0eb41f46031527ff22b5e79e5db83df0651267503c6e445d97a2e130084bc0ee7f50b762404959c605152609060715360aa607253602960735360fa83021e7ca0a02e3dd44b2b4048cd00c0d1b42dc8307f3199804178c9add0d3a39797b7a5f2a042221e10531035fbc81ab176f643c92062688e6da5a14b528e7d1b25347d40eb", + "0x01f8d883010f2c8202c4843b9ae233830186a08080b8807f60e1c8291d8c0fc8f87f5f0e467b963be9b5cc5c74d7af548f08be13e94e0b30603252604260525360836053536026605453608e60555360c16056536032605753604d605853601760595360b8605a5360c8605b536090605c53602e605d536088605e536037605f53607b60605360c8606153605a606253603b60635360cdc080a04f23de0034f505989235e11ebb88ae86120615223465a1492ba72bbbb8d5817fa0663ab79d674b61b2d8c4c4fc39dcb48633ae415a77c4af31b974d54f90377279", + "0x02f8dd83010f2c8202c5843b9aca00843b9ae233830186a08080b8807f3020a0fab73d6ca1e4ebd45f9c70647adfd75ec59a085c45bab226211258af7f6013527ff57d2983f8ec672dda14df5dec43060f9f9d00dcd2eb712ac8d1181d36e875006033527fbe8361ab1a2f44cf855f9f98d15760b1034d0f40eeaf61e8934c447a6a909cd460535260b26073536065607453600f6075536013607653c080a0de5fea7132b1657d2a9b31ad8ce9e85d289a8a040090c173de90468fb961dfeda004a0b6f390496587c0a40876ae27033a8cee0f8e7c85e55ad5834cfe0e1c2c05", + "0xf8ea8202c6843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880600060cf55f21e430c600060b655a4fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16083021e7ca0fd76456322a025773ddfa533b0b281113b7d0b04b7d26a3a992d4b9bbc60d44da0444c914bd68fd7b38d088dd775e54f14f94c41de23599d7ea497d912a94027e8", + "0x02f8dc83010f2c8202c7843b9aca00843b9ae233830186a08080b880d39560006006551e7fae8ceef0810d7bd9d222e996ff53e66dbaffc00d947829a27c388fca0bb443fd60dc527f446f43fc530ab052974cc6301c81fda72659d4ab40a1576491227496d007e87160fc527f853d67b0b454d931b373303cb6991306fd01dedbb84f6cc66157cce374107efb61011c527f027fc57e2feeaf617ff8c080a078c791d21dd6795764990db671b041467e16be9c70308ea0d1752e7994b0de3f9fa6ac900e33e29adde30a889e92a6d7c6669e50d361310f73d61fca2a1993fa", + "0xf8d68202c8843b9ae233830186a08080b880306000602b55f17fae8ccec31f12fc2a6d539598137f71c8e9108309174945d89ebd9f39c011857e6031527ff5ed9105f0627862037a10ab3f5f5956601ce4cb8537da4ca6f0f268146bda1f60515260a560715360d0607253601e60735360e2607453600b60755360f5607653606e607753609a60785360b160795350437f7183021e7ca0ebf1a7834bad7e9469442e69c4243e4d287d4019b51452dc24817685dc0ed72fa01e0ecae8c20eb9afbe9d63ad4ac4dd4fcef224a9b4c88a41f2aad54cac317520", + "0x02f8f183010f2c8202bd843b9aca00843b9ae233830186a0949f61fb36afa423dfbc7a70ec858dc2f6741feb8280b880a27f6ea322da76d421e23e7a6259ddfe3915701b89a43005d43533a46606afea3a6a6068527f90969935a6302161a02183b1c6bac3e61167232e702c95b3941d8c2fd03054c86088527f68279f6a4e18226336db340b9c935ffba4ddcc4efb76fc5dfdc68d7fcc18e5c360a8527f7aeb5048bccb7678d45a346b0cbbc6121e41c001a0e6c302483b9ad2868f645f703cf9d4768b61ec6b0d31b271730ba78382cc1bc7a034244ab41085b8939f366d256e77baed1f0edb33e3b6233c7d49f468e65c859a", + "0x01f8d883010f2c8202be843b9ae233830186a08080b8807f88b3914b0df2d82aa05eb1a90226a540e9ed0be3945f7668bba1ed5cbf99e6c5630f56dd02527fda06b50617d2eefd3a112a78d09cbdb9434794879defd2fada71e024797842b2630f56dd22526049630f56dd42536051630f56dd435360a1630f56dd44536041630f56dd4553605c630f56dd46536019630f56dd4753c360c080a049e2240e04e42a65f1166cffaefe5a1d226709644bb0e0553eae0756b631e834a00ce12dfa4016d26723305008fef9dcaf6b35bf53004d70b69dc9df2d8010d409", + "0xf8ea8202bf843b9ae233830186a094a7b2dd8168965e02018a5e269f6dc64476f6028d80b880600060f555600060f4557f0254b3c0290c3af91fffd4a2fcb109c5fa891f3b04df60d9aef1e7c5bcb4a6f860d752601160f753787fadbcfcf4e8ec6967d10b31c13a2a93b9365df11f0b0086c68dfc525559376060601e527f70b72c3df84dd6727e80468da13b9e2c5820c34152ba108f27ffaa4bb5101f0b603e527f5a260883021e7ba0f99936c9c37e02e9d69528ef42d795c31b54c79ab4a521d113c40b671f64017ba0061506f1dde5068bbd9103563b1d91aacbebf166191e9b897070e8e4aaf1316c", + "0x01f8ec83010f2c8202c0843b9ae233830186a0942b5badf338b63dc4746f02b0ed18b868d4e2c47380b8807fdcee0352ac50d362700bb82f6b9da311563632f362654bd133a98a177c0ed6ca607d527f0ee4978cc41a1cb903d930d44dc31148106d7ccc71375fb34fd6b99f9ee57c69609d527fbe6fdf4f53171602207d4dc59de41eed7a3a519e048d646fb5a5b4ac5fddf67d60bd52601360dd5332bc6000606055566000607a553d60c080a0c441220d1f95fb7027ae4e5d39908fc3fcfb76fc8052ede511da557ed2f242e1a033595ea375420044f422992fcb0f06c28614aed1819392ba14e1e41d1093997c", + "0xf8d68202c1843b9ae233830186a08080b880600060ec5563bef2600060c2556000600955d3600060fe5545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1779ff26054527f4d8fc780ba3d2929977dd99f10e983021e7ca01dfcad24f36eedb590d3bfd14a61a568ee18559c722c3ca2472d8930b6eb06c5a0661038c9557aacafb42f969a42969f27cdcda59759df61e761fa08fafda5a6b5", + "0x02f8dd83010f2c8202c2843b9aca00843b9ae233830186a08080b8803a60006013556000606b55609b63c74aa89b5360cb63c74aa89c53600a63c74aa89d53604f63c74aa89e53608063c74aa89f5360c163c74aa8a053601b63c74aa8a153603d63c74aa8a253608863c74aa8a35360af63c74aa8a453602663c74aa8a55360bf63c74aa8a65360a563c74aa8a753605b63c74aa8a853607963c74ac080a0e401019fa5ce61367d5f84e06bade78495b25b67270f2eabe96e5fda7cb5b0fba06f1c0622a319f81788e089f8e89b4b70e40cf8481b3917bf9b3381dba887f63f", + "0x02f8dd83010f2c8202c3843b9aca00843b9ae233830186a08080b880600060ad557f5d3d579b7df08f18b6bc83efe04baaa3b308d3fbeaad603beaf58ca4cc4b46d3601b527fafa7c69b91e79ee998acf456f36fe3f7501b26bf24c68b33ace0df15ab2b8dbd603b527f1781f623424f10716ca349816b5f8738b089c94ead98914170943e4090c02d09605b527f5d136e503e5b8dbfdbf74313d141c080a0f9566e31812be3dddb1d4a8207b648bc9d80c99456139fb7761716761f92e136a03897fd4823048778aca54af8e94002b620a12b716b2a19dfb6761a4bcd7e2b1f", + "0x02f8f183010f2c8202c4843b9aca00843b9ae233830186a094ee7a7e3df6c8dd748b41761aebe0c5e56899e7f780b8806000608b557ffe6d8507ea68c6e0364d3037568d78b3af31d37ce8db07aced9e901cfdf70e3a6087527f4f253b69d9861d7f2eaeee429eef0269dceccb8fe0e49cbb1993fb0fc9dee9e460a7527fa9c15c8ea5fd540bb27e18533a2ca316fb144f0b3d5997a5ecc1faf1ae23439560c752606060e75360aa60e85360de60e953c080a08f6612c9fa35309c5387ea613bb8d714cba774ff1b069dc33b0caaf9a40f9221a005402d3d501983142f3a0d6f6790041756a952f40a90f03eb61f7e411b221bb8", + "0x02f8f183010f2c8202c5843b9aca00843b9ae233830186a094bad71177f0c7582f045c24be52dba88687244ff380b88060006099555f94a3600060e555496000603c55600060e3557f5cd0f31097e0acd8c311e9f757be3fcf06c51812820b53d8442ffb01871f5b866041527f8418002f1568a364760df95a1296065426c3fd34851200cc292509c524af88ed6061526051608153601b60825360cc608353602960845360d260855360ea60865360c8c001a0dc01b85089eecf737706adb8b03da0902beb524d96cda17d2f39c297404a021da04baa30ec335b878d902cb727b14316f6d19a998909236348bdf913f9246efa46", + "0x02f8dd83010f2c8202c6843b9aca00843b9ae233830186a08080b880600060bc55600060c255f6600060115557600060cc5555600060b6553e60006063553d6000593e59600020805545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1c001a018959fc9696c31d825fac26b96aa8e6ab05ac114335a710bb6ffb0c5f0da401fa01b40f214be2c16cd334b9ccdda37b60a4daeb8ead1f0ca9be0f2a6690c7c13b0", + "0x02f8dd83010f2c8202c9843b9aca00843b9ae233830186a08080b88063600860a253601d60a353608e60a453600660a553606260a65360c460a75360d960a853602d60a95360d860aa53601660ab53602460ac5360f060ad53607a60ae53606d60af53dcf57f4357be6c859a5f72416cea364ccbfba229af622827f8ac2ce408016b1940dff8606f527f3f7ba712319b74765dcd0d47d500e086cc87c080a09e9b7e9edd0b89a6914861cba8e87df5edb9e61e299276eeed9061d5b2edd64fa06892922658a72dc5a693dd7e81b50c094e24bf2b1261fcfc954bf4e8f7f5cc12", + "0x02f8dd83010f2c8202ca843b9aca00843b9ae233830186a08080b88060006049556000606a557e9192665d260b11bb2d01a756f18c004506d453f16e498293d37052bde4b6ae6036527f61d68fd124023ca8c21eb41a0fd83417c5add3a5934a0575bf39efa27b418aac6056527ff3d826a2ed36b2e76833e992ed2356a20da06d9a261ffe9994148a628c79212a6076527f7a62efa309050525e74cc001a0f8db4c68c660d127e947cf5956ba96865961c945f80eb961e6e7857442a36b35a029660f219eadbdaaeeeefb8530d140f216da954920a7353b2534bdcfc4c1a720", + "0xf8ea8202cb843b9ae233830186a094000000000000000000000000000000000000000080b88039227f4ff1dcf605f1eb50218a7b0881be9a723020a0fab73d6ca1e4ebd45f9c70647a605f527fdfd75ec59a085c45bab226211258af7ff57d2983f8ec672dda14df5dec43060f607f52609f609f53609d60a053600060a15360dc60a25360d260a35360eb60a453607160a553602a60a65360c860a75360d160a853601860a983021e7ba0776c3bdde8cc5923ca1835cfcdead36fe8b37138b20a070d08de908915969a3ca012ed89e50754404f128c35fcea2055c43e4710e19296da567cdc548578ecc1ec", + "0xf8d68202cc843b9ae233830186a08080b8808c600060dc552b367ff60da39f46d6253d7eef2e8cb0388c7791b7df5cf7d69ae55e64f8ab90d691ef608d527f70816bf4dca23660e1c8291d8c0fc8f87f5f0e467b963be9b5cc5c74d7af548f60ad527f08be13e94e0b304283268ec1324d17b8c8902e88377bc85a3bcdccc5302e327c60cd52608760ed5360a960ee5360c983021e7ba06c7c1877f1e17f73ed2a66fa41fbac9a99df28930978395eff30514c6b6a11c2a021f288b5e20a2efea62a051d7ae8cc84104b5b8155bb6c89219b7928ca6aa2ab", + "0xf8ea8202cd843b9ae233830186a094000000000000000000000000000000000000000080b8807f553221e369e554d9f8d468b6685fc094b548e10a6e085452b0def6e04bcebca16099527f16658ea8100c1b1aad3eff8bc7ebe248525351b398fb35a9fd38d1093eb979a160b9527fbaa35c547598a957d4be53da888e0917c6a9acf42a788c70f3ff6430de29998f60d9527f023d8b0778d2f8ff319ac3207ceef82b4200e383021e7ca0ed1c9ed5dbd9be6aea098f942612b41d2834f3a36afad608544b320be0585a36a0499b99e37a9c8b968c25a463be9020a22ea64015cc28300b35522aa643ba2109", + "0x02f8f183010f2c8202c7843b9aca00843b9ae233830186a094fbdaaaeef288930fb9851c6e451acac2bae49d5180b880600060f25589f43d6000593e596000208055587f1c7fc0d0f6e35c5fa9afe37280c410dcaee0a0aa42c848d391d8827630f56c6a60d5527f51c53091156c29c3f96078e956dfbc3e77e69d1ae75fd4e6ccc03fd4d5fbd2b860f5527f1c27775a4b6eb8b491f552dfc4481e3a6c6c7b11e4982568b0a06c4d315605a561011552c080a0b98271711327197c04597a01090d2069c8584cf9c0f9d18767b6b59b48bab9d3a03151e55d741c2d0007b7d3e9bc28d8b954197fb5317325fcf938961df6e4f7d8", + "0xf8d68202c8843b9ae233830186a08080b8806000607c553111727f3bd834742c0ee6e7c85569874fe0e468a340b6b6268eb290ef6e8237ce7bf1f9600c527fbfb043aecf9a7d4e4f04877640064f1d5562cccee004fe0237192d55c06dee63602c527f32297cefa26777f0db4ed47c4e288af8157312e0d342ca0a902d3ec0c505fbab604c52608b606c5360a9606d53601383021e7ba05ac8301bba89defa7f64c2613a68f8bc8484720ec429520b3b537f516f61e7caa075ae5cebf673c03a6ab77bb7a690930962b3e0beb76614097802deb01c645690", + "0x01f8d883010f2c8202c9843b9ae233830186a08080b8806000603c55600060bd556000607355d9600060495547602f6000605a5568600060435529787fe09372d951ba061451cb57c643ed9b05448146952fbb04fe189666323625e784600b526032602b536019602c5360a3602d5360ce602e53603f602f536087603053604960315360f560325360b8603353606f6034536026603553c001a0d44e7134c95c63db7577aa63f3b900f034c558c3d24545476f464544a0943f9ea060bad54d2bff3c5943ffda059d0efb8adc1d652883fc0579cf220a04480649df", + "0x01f8ec83010f2c8202ca843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880836000602a5598485a7f27198ddfaee167a4ad61dcee0352ac50d362700bb82f6b9da311563632f362656033527f4bd133a98a177c0ed6ca0ee4978cc41a1cb903d930d44dc31148106d7ccc71376053527f5fb34fd6b99f9ee57c69be6fdf4f53171602207d4dc59de41eed7a3a519e048d6073527f646fb5a5b4ac5fddf67dc080a083aef536658a4afa2076b92257e4cd54535d0919754cabec7cbf8105c4daa815a0285c4bc945c66d6d50ad3bba5ed167511c6bb87ba42827b3f2f6bc3e6d2cdcfd", + "0x02f8f183010f2c8202cb843b9aca00843b9ae233830186a0941593ccc8ae41a5c2b556a41acbac1fdf30a6e13980b8806000609555b2600060c455eb603e60ee5360c260ef5360df60f053604660f153601460f253605360f353606460f453609360f55360b160f653606260f753604560f85360ad60f953609a60fa5360db60fb53609360fc53603a60fd5360e360fe53607960ff5360876101005360a76101015360ce6101025360c561010353603bc080a0f6ae939e1fcdadfc997d09e0714d53e031a4e98a0cd3dce03487ff7708adfda6a04a4be9015e882f8920367c38a8c7b7e33fd82ac65994b3b8910308b8f54f7901", + "0xf8ea8202cc843b9ae233830186a094000000000000000000000000000000000000000080b8808bee25600060e8556a60006008556000609355600060cb55601660d353608860d453607260d553608760d65360c060d753b060006058557f35cf25b6891820aecb6f5d3e39f97f477164b2a9704a96e2bd9346105d7cdc426081527f6ecd742eb55bb02cf674815e3f0d02d3385387db5d7611b251c73b412f95fdff60a1527f83021e7ba070e3038648767a3da2dcbc185dd30a607a3640e7eda3727badbb6938ce58b3c1a038cb8fc48a2e0397647ad0989c20d62c6d47a4dd23da8613c5888a130245c76c", + "0x01f8ec83010f2c8202cd843b9ae233830186a094000000000000000000000000000000000000000080b880e06000600d55cd3d6000593e5960002080557f630bf50570bfeef9f7ffc3c0f73b23876bc2cbe9ee8cc4327762e03f3a42403f60dc527f4eea252d6620135523d78020c65db930cb847608dbb1012a5f530820cd4a8d8d60fc527f3aad354e3fd807310043a47c6ec84bd096ffd8b13b8c3dddbc4784990131ce2761011c527fc080a00cff75184eeafa5c0a5cfe9902273332b043b52765b217b7fc8a03e7f2fcb890a02cd979888b27e4828ed66a63ab638091029e74aa37ed9b56c2871f5ef2a66c3e", + "0x01f8d883010f2c8202ce843b9ae233830186a08080b880c27e600060a555600060bc557ffc76ab830019a52d03c3d5babd6cc8b15fd8782c1548b192bf665f77d297157460ad527f0948fb9f3690f93e232e3cbc8d16adb9912892be43cd80091234531a1c66415660cd5260ff60ed5360c060ee53603560ef53605a60f05360a360f15360ff60f25360e060f353609060f453609360f5c080a092c9b11c1d27055109829e0f1eddafbcc66cb23c73685100215bc92c8f55e5bfa0359e2826460c464ca27fcc83e14ff388c6a5fb6e85bebb6ff31f2c294bfb9ba4", + "0x02f8dd83010f2c8202ce843b9aca00843b9ae233830186a08080b8809d8b7fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ecc080a0fc586d852071c9be12f5b238b6dce7ddf344e4a6f17ea56bade819442c3c2595a00c2a0c866e9ee6a08fa84c44f9ef63c2f06f864ca5899597c9d3186c533ed818", + "0x01f8ec83010f2c8202cf843b9ae233830186a094ade60a104f4068a7619e5268ffc4ead964c235aa80b880add27243600060385587397f06079ebde583e2a07038939368d7a98e3cd62f78ab560a32843e15f76af2af3e60ea527fe1fedb9e8b005bcce7968c9c9d5ccdeef1f729f737f775a978a53e9122be4a9c61010a527fbbf87d3aac2c309b967eadb90a044cb1ad3516629b5edaa5b67d83d070189e2b61012a527faf82b4065c8cc001a0ed01b46ca67b802b7116dd9864f5fe8d44b0b1246906f9a8afce681bf6dd6ba9a013374bd1a394f307eb8cb7da62ba89f5593267b15202c3667b1b62d99d5dfa8f", + "0x01f8d883010f2c8202d0843b9ae233830186a08080b8807fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ec5360c001a041df05ccb431263af776bc5482f84a3bd3a32bccd2e012ac61187b24f2c85faba05abbdb8f3f87af18a2aaa6b59be0c6038046cae606fe8f6cad8c9e4d20b32852", + "0x02f8dd83010f2c8202d1843b9aca00843b9ae233830186a08080b880fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16086527f1ec9313fb523398fe719fa4dc001a0e32e64fbd79e2dde56d01ad8d8676bdca32a11aa2a0142be0bec2c07adb37d7ba0330ecb44548556151c7c24c811c489d647d066e1199173a84bfb694db62cf218", + "0xf8ea8202d2843b9ae233830186a094000000000000000000000000000000000000000080b8807f134b0ed844476eb6e323346a83374c697a611ddbe7915daa14e1e219a7f8e5976066527f1d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642741fba8cd991afe01c60d16086527faf8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec87bd75d3fbffc9915aff60a6527f0cf2776ee367cd83bb280c217b29d90b448b5283021e7ba0fbb741a0db5ffe550cb6614c64032c79914d44d9ab71f1581219e2b78a62beaaa035dfd16e5106c1b2af8f0909cecdb43943dc8dea91be7af6ea53635e5d0a5a43", + "0x02f8f183010f2c8202cf843b9aca00843b9ae233830186a094a3608ae1bed27f19c0d005ac5609d4978da6756080b8804f3d977fc1faf1ae23439560aade62812de4f587e75c0f2e51b39ff70ee136834ee8015b60b7527ff0050b6cb68f84e855e5448e4af349acdd6ff10c133b3d4f118b8d86a4a7459a60d7527f47a894ba78c7c16fbbc7bb63a4e6e450500c9e8f6bb4d4bfd876c046a7c396a360f7527fb6c8800e3e71fa4f7cf3c546ba3af180c080a01124b6bb7bb6f413fb3eebdae1890635c20ead0a085166dc3a0bfd2d3e8fa75aa064e2960a5a3e518043af5cec8148757979a177a12676492a7f7008a349b99a36", + "0x02f8dd83010f2c8202d0843b9aca00843b9ae233830186a08080b880c36000606c55600060d8552c483d6000593e5960002080557f665f77d29715740948fb9f3690f93e232e3cbc8d16adb9912892be43cd80091260c6527f34531a1c664156ffc0355aa3ffe09093b07b8a7cdc0bd9cdffb48e82ad69742460e6527f9050706ab2bf4f042fe064e517f920d133c1d25e62f4e7d573ed8c1bbbc4e8c001a03cde552e24dae6908a5f683a02a30a56e2f716c28af787cb169f6decbe4dd76ea05e1ed1fdbeb338e95affa923c2fcce6186a404ccdbb1012d677b0c0123d6e9da", + "0xf8d68202d1843b9ae233830186a08080b8807ffe6d8507ea68c6e0364d3037568d78b3af31d37ce8db07aced9e901cfdf70e3a6087527f4f253b69d9861d7f2eaeee429eef0269dceccb8fe0e49cbb1993fb0fc9dee9e460a7527fa9c15c8ea5fd540bb27e18533a2ca316fb144f0b3d5997a5ecc1faf1ae23439560c752606060e75360aa60e85360de60e953606260ea5383021e7ba0937ee8b035e0145e0d61b17bb0596409377ba33eb50a69c36d0ccf462d0b7d99a060dcf7fe26e337a075bc48545366f6e33e680b4dac242b3c28a08287fb75d67d", + "0xf8ea8202d2843b9ae233830186a094c277b081e9cf30d631b90db4eb38a9629639f01780b880d6d3568d7f800a5d9f0360ef81b25ca1e2e086545937d178f18906311fabc02ffe84a8bb806052527ffa5aac32e55a0fb508de67a5e6b5d89dfa08026db6a78f9f9452f55e1d83a66c6072527f873fc57211aa56b08af0d65ee29fcfff7e896201834e7a8fd5920e4fa39c6bae6092527f7e4206a204b115d4dc50e0e57e0ba983021e7ba0faa84228b6e09352e14bdde1889b0031f2735bb09d44abde736ed0ca9baf3c46a058e2f8559c2c78511f36a564ee8432bc315130c9e17a61f9b9dfda26d9590726", + "0x02f8f183010f2c8202d3843b9aca00843b9ae233830186a094e030d841f8cbb3db0928049cb342609a8760d8ba80b8806000608255a17f5f587e6be73f8e59b509956eb2156b233a4733e6f397df2e4f4b5a2027e3b9c96099527eb4840a383e5135002a63dce725c5c9e40ef7eac246d44603a757ec1db5217460b9527f9dc95e36109d60d38e28a5a19011e264853d3487a50d272540f41a63671c9ce260d9527f45275e0a3575b08354fd641f1602c080a0e3a29c37d25fc25108cc683d426ea78c73e55dfad6a0edd423a3b7c9acaf24eea05a7d2d290957ac7e17ad0981e56f6798584709b8612e35c229d10eb3d8a98ae0", + "0x01f8ec83010f2c8202d4843b9ae233830186a094000000000000000000000000000000000000000080b880ae600060fd557f22d0e5875851f68a57d1614fdb3dafc4c1c9c7994e8fcfeab74280d20c599a326015527fa6a6ebeb6c8c63a3400a54bcb19b2ee3061cc7f0614adc03015b290131f627f66035527f80dd1eddef13d6c0d5694782e8a97f909c5f3adf2f998344bb3ba1e3a906c8ab6055527fcb93273a80d618de5b5ff5f60fc080a05dc2c165818df868346f2b2e52e56e22d42ac33d5c9a36d22819a5350f74f045a05ca8c54af8d56f5da25845065dd2c60308bbae6ba60ea6bd67709c9ba63f307d", + "0xf8d68202d5843b9ae233830186a08080b88021495d603460e25360c760e353603560e453600960e553602f60e65360d160e753603160e85360d260e953607860ea5360fe60eb53606a60ec5360a360ed53600160ee53606960ef53608d60f05360dd60f153606860f253607b60f35360d860f453600960f553605560f653609860f753602060f853608b60f953609660fa5383021e7ca04f411496701ecb39ecb3676fe06934c8513809296c32088a41217976950a1bd7a06ac7ba448e6f4428d9c2883a7a3a12795cf3fcb1b09a2161db7fbb9841099e32", + "0x01f8d883010f2c8202d6843b9ae233830186a08080b8807f2e255612584176ea74af4594265daa4c75edfde9cc536a055ee4d568574bb5446025527ff87d21ff26123da6026ebb8d89c0a3e3e149d0e55d8f8781ed6e8865fdec178a6045527f31763a38acbfe89a4cfb475ca5d7b041f03a8f243c1c833219c63c1e3c395b226065527faf584ff1dcf605f1eb50218a7b0881be9a7230c001a0b55cccda1b97d69b89f0013e0c8c265cdc9abff37bf8817d303a98804e2dddc3a04992a369886b1e12946fa176c7320b791078569ed7f8c02e915368d13f446e8d", + "0xf8ea8202d7843b9ae233830186a094a05f31a218a7d43598da785f5f80697dbfcc7e2380b8807f344c0506a8d6252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c69601d52607a603d536000605d5560e160e75360e260e853601960e95360a760ea5360f860eb5360e560ec53609760ed53601d60ee53601160ef53603d60f05360cf60f153609d60f253601d60f353609960f45360f460f553604460f653607c83021e7ba051ebefd46e24ff8c05110d443118d0a4400e98872fb66d86467c9d81b777a5cfa0529d442d04289a47d5f8c07d1a07f28205f89e6ac1d4324f2c70043d5ce7bdaa", + "0x02f8dd83010f2c8202d3843b9aca00843b9ae233830186a08080b8807f1c55857739ca8a51b19e7e024f87db209b5142a161fd1af72e570ed1f870b0c5608e527fb801ace831d7ecc756f149c7349eb6428f3848e9c0b6483403194716b0caa7e060ae527fbaaa7cfdd00e84266a66a6d9df6bd57b5e1f78f727f551db0d6e35eb4319c46b60ce527f39287d81187e5644d3e865d2b15427f9734f58c001a014450b1d027fd07256a433f9dab84e7a17a678b82d8364c7ac9f91761a84ed59a0734b1f32e31b5bfcc7fe482845f3c051b22ecf0c44e026b7b95cae72326702d2", + "0x01f8ec83010f2c8202d4843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000600955cb967f01052b709c4533377e1b821ad4c666c76bad40248fa20517115c5f5c17db1f216000527fc92568e9be2cfe2ab4bf37285be156f33fc4e08c921c2c795079ee80ad3a8a876020526077604053604f60415360a660425360486043537f55e44c14b79b162478cad6e4a7f08bf8d3dd34af64f1dd62bf652619c001a0c596d9ac16ff9e43612a3ec48414ae930f6750b7cff6d4788590c829bf3251e2a061a4e944a80849a3c431092a0497fc92dceb3a0b4e2d8a642829c9658b796cfa", + "0xf8ea8202d5843b9ae233830186a09450ba116d8975e9c3d2fcf4caf25959f883ac4c3d80b880434460006099555f94a3600060e555496000603c55600060e3557f5cd0f31097e0acd8c311e9f757be3fcf06c51812820b53d8442ffb01871f5b866041527f8418002f1568a364760df95a1296065426c3fd34851200cc292509c524af88ed6061526051608153601b60825360cc608353602960845360d260855360ea60865383021e7ba0404b057a8a999a1acbf0ecade9ce3b0da2251355e6971c84e4863232b5001880a026aec794ed13f893e337a1cb6f1d81700b418ba5d68924663164ad4c64e65f3b", + "0x02f8dd83010f2c8202d8843b9aca00843b9ae233830186a08080b8807f553221e369e554d9f8d468b6685fc094b548e10a6e085452b0def6e04bcebca16099527f16658ea8100c1b1aad3eff8bc7ebe248525351b398fb35a9fd38d1093eb979a160b9527fbaa35c547598a957d4be53da888e0917c6a9acf42a788c70f3ff6430de29998f60d9527f023d8b0778d2f8ff319ac3207ceef82b4200e3c001a0aed4d1ce2854d18c1709e391872b868a6095d326057b70edad8cff710c1f789aa00c0cfc1ab7e48fccc8f31e7324aa84eb6bea5f9ae5a3342dc9f9878dc6397d28", + "0x01f8d883010f2c8202d9843b9ae233830186a08080b8809d8b7fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ecc001a094e44e27b33e4c706670ca6a3e563b4772ea45cbd966e5c079f1cae90b8902f8a02a811dbcfa162bd5ba5c98fc7fea62ea91b592519d56e364fdcf4438c7150f9e", + "0x02f8f183010f2c8202d6843b9aca00843b9ae233830186a0949ead0c84d14b86207e92bbc38cbf511365e35af980b88060006047551f600060f3556000603f553d6000603255717f921d958f72f97e21600f19838283dd31f8d768d063129e45a480c5cfb5217e10607d527f586f500437cc17ec1f0dcb4648a1d1bc4b730dcd6fb5c8467fd8ba776bc1a755609d527f7d10237febb5303a09824c0a0c1da013a0d566dc620172fd211a3626c05fc519c001a07d7371b3ff2f940078b8685e4cc1a4b5f1f0c03e331b351d571d5ffbcc164091a0609788444577ec07d6961d328c9f1e6f0da3687f55490631c34b4d3fc82ae74a", + "0x02f8dd83010f2c8202d7843b9aca00843b9ae233830186a08080b880fc6000604e556000600755ee7ff35558bbde1f167aa4c54c6b1ed3dda9c0a6bca110ef32009f2bb0a0ba20c4f8602d526047604d53607d604e536015604f53604b60505360fc605153603960525360a160535360ad6054532b600060ea5560006084557fa35740ac9796cde3ae33b828e38fe46704fa4e24b59fb7a8de86ff88c080a0a49ecd1a3f63b5946c2b18aa69494cc5e560ef4fe773d2efe3043fd3562d1b25a0515b46ffc769aae4de8b25aa5f6c35b769097632e97546f54e11e73a1d2e1619", + "0x02f8dd83010f2c8202d8843b9aca00843b9ae233830186a08080b880600060e8556a60006008556000609355600060cb55601660d353608860d453607260d553608760d65360c060d753b060006058557f35cf25b6891820aecb6f5d3e39f97f477164b2a9704a96e2bd9346105d7cdc426081527f6ecd742eb55bb02cf674815e3f0d02d3385387db5d7611b251c73b412f95fdff60a1527f23ecc9c001a0f0c0a5e90305780a1c4b05b7e48fef185bc91a7b50c4a81951169ec089cb290ca002e1ce6c2d48a59ed25c9a59d6500e09bd40d892187215986ad5970ed010c7ef", + "0xf8d68202d9843b9ae233830186a08080b880600060ae55437faade62812de4f587e75c0f2e51b39ff70ee136834ee8015bf0050b6cb68f84e860f3527f55e5448e4af349acdd6ff10c133b3d4f118b8d86a4a7459a47a894ba78c7c16f610113527fbbc7bb63a4e6e450500c9e8f6bb4d4bfd876c046a7c396a3b6c8800e3e71fa4f610133526000603a556000607d557f6f83021e7ca075cb5780a42a395701c91bbdd7b9e62ea8363e1a6ceed04ab7fd91d70486a17ca01762bef4077c727a4160fbe4215bbdddac53727ae733309dbe6e8be50bf46ae9", + "0x01f8d883010f2c8202da843b9ae233830186a08080b8807feeb4fffe85e8bbc80e733d3686654a194354e3f4c51dfd90593e99dfd2740a46607f527f01bd008dc6af2bce6c62bd869f3acbd5035bf716d041f3261d8672f40d30acec609f527f1c55857739ca8a51b19e7e024f87db209b5142a161fd1af72e570ed1f870b0c560bf527fb801ace831d7ecc756f149c7349eb6428f3848c001a0586dcafc3cc5694fb3aaa940d8795fe413bf502d49075af92adc5640a3540cdaa05fe228c2fbd2cc6574c6a9c9bab95e14cb0816cbdb8d78db59f7d8736c7e1b36", + "0xf8ea8202db843b9ae233830186a094000000000000000000000000000000000000000080b8807f0df2d82aa05eb1a90226a540e9ed0be3945f7668bba1ed5cbf99e6c5da06b5066013527f17d2eefd3a112a78d09cbdb9434794879defd2fada71e024797842b24951a141603352605c605353601960545360fd605553600f605653605660575360dd6058536002605953607c605a5360c3605b5360d2605c53608e605d536083021e7ba0a95f9f13ca2866a3cd6eb6ab49c740b3bbf034ff8555bc713216f673923236e4a06d79664d76901d1954d2ec75ee3d73aab0a0a7f73b094bad5e342c60022ce1f1", + "0x02f8dd83010f2c8202dc843b9aca00843b9ae233830186a08080b8806000607b551ff7f5db6eeb1960006028557f187e5644d3e865d2b15427f9734f58e1ff991e131e985b3c26930dff12f8766c6056527ff4aeb1f1e74f54ac02e056c0dc398518d02da967d89eef4d65fd3120aed1936c6076527f23325734a61149d57fc81688972053f7b60c5e283d928a47ef935e53939a74e66096527fe657c080a0e95281821f0d8d54a654593a0c0f63e11b67138f0485103a85c9e8f5710dca33a0072613d356e8b4f362317fbed84939895e599863540fb02f11d87ea6830b5946", + "0x02f8dd83010f2c8202dd843b9aca00843b9ae233830186a08080b880c0600060ab557f135f85ea726b7b879b2a4b6e54a98b0ceed699228f8c01ee75bfc058a0856b1b60a0527f49863065ec145bfc830de078640734fdfd6ea54d31358925879d4cf4e52dbe1860c0527fa22a4db814f2fe37434f642bfc207ca5946993713d3070f3d8ab2372cd03c5d260e0527ff3a0f27005547601e36dd0daaac001a080b00af6dc0e87adde109bcd7691b73d9e7a686ec978b92f217dbeb7f82e2a1ea06584788bbfb1d717c795a4695c7739d18a4d63d5a227a79e7714e999e1b1ca3e", + "0x02f8dd83010f2c8202da843b9aca00843b9ae233830186a08080b880add27243600060385587397f06079ebde583e2a07038939368d7a98e3cd62f78ab560a32843e15f76af2af3e60ea527fe1fedb9e8b005bcce7968c9c9d5ccdeef1f729f737f775a978a53e9122be4a9c61010a527fbbf87d3aac2c309b967eadb90a044cb1ad3516629b5edaa5b67d83d070189e2b61012a527faf82b4065c8cc080a0243dcd73219c8102ee6c0232d7263763f2ff00c6f765608bc631d8c027910015a0735eec5d9df062cd8860310e88f554ca6eba34b7224754cdcfcfcfc066e3dc50", + "0x01f8d883010f2c8202db843b9ae233830186a08080b8807fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ec5360c080a0b1e2b582ae32ebdd1ab9d33a9218e37c5455bac8cdbc5523f8f622cf271ec967a04e1c84cc98119b8930018400579daaf41692fa478578120cf425c4290a5d666b", + "0x02f8dd83010f2c8202dc843b9aca00843b9ae233830186a08080b880fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16086527f1ec9313fb523398fe719fa4dc001a0e63017a7289b2bd3c3accfb3923ce514b668da97727412de3204096c3256e852a05c865b3377c137b9eb6c5a181708c89f2bd22f381cf905083d9c25f8da8647d4", + "0xf8d68202dd843b9ae233830186a08080b8807f134b0ed844476eb6e323346a83374c697a611ddbe7915daa14e1e219a7f8e5976066527f1d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642741fba8cd991afe01c60d16086527faf8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec87bd75d3fbffc9915aff60a6527f0cf2776ee367cd83bb280c217b29d90b448b5283021e7ca0f06a30f19d81595fe1a7ae329d0b2a68ccc1bd144cdcf4967ce0af503b23264fa0070d31932f369f33958aa6f01e2452d80a44dcd76a00d354afe93756ec6dc379", + "0xf8ea8202de843b9ae233830186a094af426b9ebe129619d0fe19b612380127cb2c132f80b8806000608255a17f5f587e6be73f8e59b509956eb2156b233a4733e6f397df2e4f4b5a2027e3b9c96099527eb4840a383e5135002a63dce725c5c9e40ef7eac246d44603a757ec1db5217460b9527f9dc95e36109d60d38e28a5a19011e264853d3487a50d272540f41a63671c9ce260d9527f45275e0a3575b08354fd641f160283021e7ca09b43b74f4488db65d84dc8d672940921d2ad4dc744a7a0d3a9fb2d4db91e9145a05e96084d8fe3f5e47ac624805ef930fde9eb352ccfcc443dd03712309724b953", + "0x02f8dd83010f2c8202df843b9aca00843b9ae233830186a08080b880ae600060fd557f22d0e5875851f68a57d1614fdb3dafc4c1c9c7994e8fcfeab74280d20c599a326015527fa6a6ebeb6c8c63a3400a54bcb19b2ee3061cc7f0614adc03015b290131f627f66035527f80dd1eddef13d6c0d5694782e8a97f909c5f3adf2f998344bb3ba1e3a906c8ab6055527fcb93273a80d618de5b5ff5f60fc001a0341490f6ce91ae88e58ee6ff088a5bf2fc1a89cd42f7777f526628ba3032c3dfa034abb48aaf536229fdc63878ec8f1153051e461f95eb4f8b3d8ece6413204641", + "0xf8ea8202e0843b9ae233830186a09431db9affad30b83811373e27db11e8754f5be6ef80b88021495d603460e25360c760e353603560e453600960e553602f60e65360d160e753603160e85360d260e953607860ea5360fe60eb53606a60ec5360a360ed53600160ee53606960ef53608d60f05360dd60f153606860f253607b60f35360d860f453600960f553605560f653609860f753602060f853608b60f953609660fa5383021e7ca01629b86fdd828c3c0488dfe41fe11a28e1888e8868043a1b087492307a4df3b0a01ee5142cd78767c348a401c5e37085f3873c3a2f2650c004f7b280e2fae2db07", + "0x01f8d883010f2c8202e1843b9ae233830186a08080b8807f2e255612584176ea74af4594265daa4c75edfde9cc536a055ee4d568574bb5446025527ff87d21ff26123da6026ebb8d89c0a3e3e149d0e55d8f8781ed6e8865fdec178a6045527f31763a38acbfe89a4cfb475ca5d7b041f03a8f243c1c833219c63c1e3c395b226065527faf584ff1dcf605f1eb50218a7b0881be9a7230c080a0f2973939f8a2b6f94beb601fbe1944ba3bef15ae57be33ffece96844d29927e6a0435e106b009b42f4885a1acfe92ecbb596b290ddb02131db1344c1706fd6c349", + "0xf8d68202e2843b9ae233830186a08080b8807f344c0506a8d6252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c69601d52607a603d536000605d5560e160e75360e260e853601960e95360a760ea5360f860eb5360e560ec53609760ed53601d60ee53601160ef53603d60f05360cf60f153609d60f253601d60f353609960f45360f460f553604460f653607c83021e7ca0013955dbde0317950052e765affcbb7fe23bbf01f348e5c0921df48d62f606e5a053c496601c5b99c1831693a96ee162360efdbd8ee6ee7cb3dc73fbb513ab07ad", + "0x02f8f183010f2c8202de843b9aca00843b9ae233830186a094adfa1f382e116692a6b7de1a459a680ed5d19f7a80b880600060c355567f6c096723788fc96ffcd240274efc91e20775eeae28f35558bbde1f167aa4c54c6084527f6b1ed3dda9c0a6bca110ef32009f2bb0a0ba20c4f8477d154bfc39a1ad3e2d5b60a452602b60c45360b560c553604660c653607860c75360ea60c85360e060c953601060ca537fa35740ac9796cde3ae33b828e38fc001a0320039a5c56817a0b8d4dfb734594a3faed54fa33f34ac84f391f756b0824248a01ff9a7b15700ca19add179895c80037847e2dc86dde9fec54ec7903f6b2ea634", + "0xf8ea8202df843b9ae233830186a094c3c70ab28f95012f33f9898c45680b2473e7bb7580b8806000609f55600060f3552b7f124c15f8b1fc74f701b8885df0f38a5cb554db930076765b1dbacad83ab752776018527fe6a3c939a2b143aabaac607fdeed7ba02b08188e2bc1e89b4b6b4514a7f67ace6038527fd9f0ce518f357417198560a2c1f89e40ea1895963b14292adb8117bf9bd46d226058527f6ac3cb8e787e177b83021e7ba013c3e154b4b224b9200a7bfe2fa8261cb6dbad7ababd7e951c605a9802f02f89a00ac92c640c9b6258112e8b63a639e657b47c999c8f2dc04e9f105b9b6a3f9aa4", + "0x02f8dd83010f2c8202e0843b9aca00843b9ae233830186a08080b880600060c7556000603b553d6000593e59600020805545d4108e600060d455887f4abbfc3e55fa691195ac0870fb45e64922ab8dd119223fec7a3d11028c92a8946080527f4386eb9f7c383e183eb0b472695865ce973f8a229e195b1084ba260307db4c7460a0527f84977580612c1856ad6f1f31bbfbbb8c2d6d141ec17bf7adc001a0da30b658eba105ae32ce69849cae58fc8a3592556c537b6721d5244349af1604a05de585779563a66f57cf19575c2d3e5f7498018ee541ceee9aa4c28375f25c3e", + "0x02f8f183010f2c8202e1843b9aca00843b9ae233830186a094000000000000000000000000000000000000000080b88060006047557f63d5e6358aa601b44d53ee8b73ce5828d143829947935f8c129982aa98ace52f6010527f1e27f6f5c4228ccfd588006670608f114c98f6212605e048a3e98df42c449b956030527f07bfac90733d7ac47cf46a6eeda36ac22f5c6110532a570c801be64a758869226050527f9e8d67677cc5045e04f237954502c001a0d5e6e44fcebd9c21229861ad0266ba39cab728af15cb1bc316db3b4a89ece9e5a04612facaa85d7724fc2fb3932c6b9324430894c02a06872a34ecc3ab48d00f36", + "0x01f8d883010f2c8202e2843b9ae233830186a08080b8806000607a55dced600060f6557fc6c5790e478f4de8ff0c8719a73308db2da826b7830ccea4bb3bc96cbf3a5e6d6042527fab8961604907f052a37ecead216dfc527935ccf8c9622f29d7c46f2fce5bc5716062527f9a48bbcbbdd870f9824d6bf8dd465783edd0805dcd88f8de4c0214bfd763bff36082527fb104f93bf3a0f7c080a0deee139e98f2f50d48d40b0065295e507417893482ed38e80ca0f33fb76f6d2ea0668f753d1a1f8bceeabc58d8e67f511a5934fe558632dd5250eccd0279a9b26f", + "0x02f8dd83010f2c8202e3843b9aca00843b9ae233830186a08080b880a27f6ea322da76d421e23e7a6259ddfe3915701b89a43005d43533a46606afea3a6a6068527f90969935a6302161a02183b1c6bac3e61167232e702c95b3941d8c2fd03054c86088527f68279f6a4e18226336db340b9c935ffba4ddcc4efb76fc5dfdc68d7fcc18e5c360a8527f7aeb5048bccb7678d45a346b0cbbc6121e41c001a0f7281f2341e30c7c1a8327312fcde44521e0f351695c39a928d42992226b9bdaa03fe0ab785e4c465da39122a68bad9f07d5ede775bbcb3ca3503089466cd4f383", + "0xf8d68202e4843b9ae233830186a08080b8807f88b3914b0df2d82aa05eb1a90226a540e9ed0be3945f7668bba1ed5cbf99e6c5630f56dd02527fda06b50617d2eefd3a112a78d09cbdb9434794879defd2fada71e024797842b2630f56dd22526049630f56dd42536051630f56dd435360a1630f56dd44536041630f56dd4553605c630f56dd46536019630f56dd4753c36083021e7ba02af5172deb692399671c8494864d77ec6d3e349e440a05d60218173216c01197a02db36fe854bf9b2f148d2b19d3228ee21d78eb1abcc4871aa2464099855656d4", + "0xf8d68202e5843b9ae233830186a08080b880600060f555600060f4557f0254b3c0290c3af91fffd4a2fcb109c5fa891f3b04df60d9aef1e7c5bcb4a6f860d752601160f753787fadbcfcf4e8ec6967d10b31c13a2a93b9365df11f0b0086c68dfc525559376060601e527f70b72c3df84dd6727e80468da13b9e2c5820c34152ba108f27ffaa4bb5101f0b603e527f5a260883021e7ba0cc10210786a1cdd0edff715a5df7c9d4612ef3db851e70fc931da5b8d66a654aa0704871e99d215be0c44bf3acffc7ad3a7dcc33070dda545c5615621262981e86", + "0x01f8ec83010f2c8202e6843b9ae233830186a0941468c27ce0ae8e3973df417ade59353ae90a12fb80b8807fdcee0352ac50d362700bb82f6b9da311563632f362654bd133a98a177c0ed6ca607d527f0ee4978cc41a1cb903d930d44dc31148106d7ccc71375fb34fd6b99f9ee57c69609d527fbe6fdf4f53171602207d4dc59de41eed7a3a519e048d646fb5a5b4ac5fddf67d60bd52601360dd5332bc6000606055566000607a553d60c080a0cfbb1f4cc760081bda0f35627b1f3434e50c2c8cbdc446985759c97b5b258599a03bb91a51c4fdee07cac717b494087389c8ff4b86f3746a0eb40f0ca8f10299f3", + "0xf8d68202e7843b9ae233830186a08080b880600060ec5563bef2600060c2556000600955d3600060fe5545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1779ff26054527f4d8fc780ba3d2929977dd99f10e983021e7ba0abfc06f3c0902b9e99d6e307eef1efd1ef48dbc12db7947aac6292f62f66b1b3a040a0d8640292d22df4d0c516fb377352295a7f9a20f2514118f5e95cdfd7e219", + "0xf8d68202e8843b9ae233830186a08080b8803a60006013556000606b55609b63c74aa89b5360cb63c74aa89c53600a63c74aa89d53604f63c74aa89e53608063c74aa89f5360c163c74aa8a053601b63c74aa8a153603d63c74aa8a253608863c74aa8a35360af63c74aa8a453602663c74aa8a55360bf63c74aa8a65360a563c74aa8a753605b63c74aa8a853607963c74a83021e7ba04af5143d9542e40b878d98c65b7da8ca9966bc8b5ce004221a770b8f7463d662a01a7a40273ed9e1c6c0fe748d96f7c7287422343907c5959ec3d70524781a7cde", + "0x02f8f183010f2c8202e9843b9aca00843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880600060ad557f5d3d579b7df08f18b6bc83efe04baaa3b308d3fbeaad603beaf58ca4cc4b46d3601b527fafa7c69b91e79ee998acf456f36fe3f7501b26bf24c68b33ace0df15ab2b8dbd603b527f1781f623424f10716ca349816b5f8738b089c94ead98914170943e4090c02d09605b527f5d136e503e5b8dbfdbf74313d141c080a0f3c72b2a6ab8e3b0038fc6f15be2bc5453d2a2e675a28d8b19e43ffe05c3dee5a043c842fc36740ec42479c260232e33bbad094c88eab698b2f1ecf9b4fe7bf2fa", + "0xf8ea8202ea843b9ae233830186a094000000000000000000000000000000000000000080b8806000608b557ffe6d8507ea68c6e0364d3037568d78b3af31d37ce8db07aced9e901cfdf70e3a6087527f4f253b69d9861d7f2eaeee429eef0269dceccb8fe0e49cbb1993fb0fc9dee9e460a7527fa9c15c8ea5fd540bb27e18533a2ca316fb144f0b3d5997a5ecc1faf1ae23439560c752606060e75360aa60e85360de60e95383021e7ca0b3b875f420cb59a84b220ff689beb79f77117adf89a45a576c3ce34ce8bef893a03855bb2da00a7e2c12cf63a37abd30ece74e60029268805d4a54efa78aaafc9c", + "0x02f8f183010f2c8202e3843b9aca00843b9ae233830186a094000000000000000000000000000000000000000080b8807f553221e369e554d9f8d468b6685fc094b548e10a6e085452b0def6e04bcebca16099527f16658ea8100c1b1aad3eff8bc7ebe248525351b398fb35a9fd38d1093eb979a160b9527fbaa35c547598a957d4be53da888e0917c6a9acf42a788c70f3ff6430de29998f60d9527f023d8b0778d2f8ff319ac3207ceef82b4200e3c001a02a5f503ed84d9b3c49450e40562b83e734223c8933c7c21ac97cdccc7ac75ea6a0764b9b7f91f0051741004929288fbac95f33ea09c71f1e7c08f54dc8ac86d452", + "0x02f8f183010f2c8202e4843b9aca00843b9ae233830186a094d5f95cb2c2ad15c3e1ecd2affeef4b052725746c80b8809d8b7fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ecc080a0494c128a757795452f10fd901de8be4477830fc83b60830d63eeee9f99859e4aa03a58bcfb8bf9f3b6cb52f9c34c0ed5ef7876af61af0ca5cf22219d1777e2a643", + "0x02f8f183010f2c8202e5843b9aca00843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880add27243600060385587397f06079ebde583e2a07038939368d7a98e3cd62f78ab560a32843e15f76af2af3e60ea527fe1fedb9e8b005bcce7968c9c9d5ccdeef1f729f737f775a978a53e9122be4a9c61010a527fbbf87d3aac2c309b967eadb90a044cb1ad3516629b5edaa5b67d83d070189e2b61012a527faf82b4065c8cc001a05b8d0a094a35c463647a002a425e581b5fbd2ad133b7194bdae338f8cb554a33a067a8291fbe90c7fe8dd33fbbc943e385f21851defc20e91d08fa600766d9fd01", + "0x02f8f183010f2c8202e6843b9aca00843b9ae233830186a0941092640f765d43c24169615680cddd275d23887780b8807fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ec5360c080a065ea9b878b9000f4e0137c21c399790f0226c1c29d1243bf18ab7407de5ee346a0190718eddd26fd4e345e046328d51fe908d4065a03ee049e01dea47ffc31cf22", + "0x01f8ec83010f2c8202e7843b9ae233830186a094d99e0c67584a2252c2c1a7fd9af3cb1d842a514680b880fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16086527f1ec9313fb523398fe719fa4dc080a05151549fa5907a69b6d59a8a8738905ca7e318f38ca1631a45fd3ef587c23527a03fb908bfb6354500ffa969407913297925b724c9d37f4059ece25e530b0a86e7", + "0xf8d68202e8843b9ae233830186a08080b8807f134b0ed844476eb6e323346a83374c697a611ddbe7915daa14e1e219a7f8e5976066527f1d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642741fba8cd991afe01c60d16086527faf8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec87bd75d3fbffc9915aff60a6527f0cf2776ee367cd83bb280c217b29d90b448b5283021e7ca0f3fa0279032a0927edcb0e138e02b34b5d30ed4578f3889ba7d62cc70c2674eba06d3e6fb2e13b9dfa2c3bfe42e691140818b6e7f79188b478ac16eec46c64c40f", + "0x01f8ec83010f2c8202e9843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000608255a17f5f587e6be73f8e59b509956eb2156b233a4733e6f397df2e4f4b5a2027e3b9c96099527eb4840a383e5135002a63dce725c5c9e40ef7eac246d44603a757ec1db5217460b9527f9dc95e36109d60d38e28a5a19011e264853d3487a50d272540f41a63671c9ce260d9527f45275e0a3575b08354fd641f1602c080a088eefe1e153c0f2351437b965d157e3f27272f1b8c7aefa27a81d5ba98b540caa02f613eea0054646e69b3f15257a7abd0eb847587b8d2f504fe0e36e9253e0c45", + "0x01f8d883010f2c8202ea843b9ae233830186a08080b880ae600060fd557f22d0e5875851f68a57d1614fdb3dafc4c1c9c7994e8fcfeab74280d20c599a326015527fa6a6ebeb6c8c63a3400a54bcb19b2ee3061cc7f0614adc03015b290131f627f66035527f80dd1eddef13d6c0d5694782e8a97f909c5f3adf2f998344bb3ba1e3a906c8ab6055527fcb93273a80d618de5b5ff5f60fc080a05c3425f1fb6213b1f160602cd209c7ad843c6b8d593687ccfe5db7c5eb2fffa4a00b97a3742a89079d1213f48fb455dee5a66b5721d5ad4596629e2ec231057ac8", + "0x01f8d883010f2c8202eb843b9ae233830186a08080b88021495d603460e25360c760e353603560e453600960e553602f60e65360d160e753603160e85360d260e953607860ea5360fe60eb53606a60ec5360a360ed53600160ee53606960ef53608d60f05360dd60f153606860f253607b60f35360d860f453600960f553605560f653609860f753602060f853608b60f953609660fa53c080a03554152ba2e8c6027181897a32a393128d43075740f6c6d8f8f838fa1ef47073a0044224dde465fd6fb5f00863f7e8f91f2cf31537fb9fca817c0c637648e5a54d", + "0xf8ea8202ec843b9ae233830186a09487b172c36dd7e571b7e31da2f4b5d0a167799b8580b8807f2e255612584176ea74af4594265daa4c75edfde9cc536a055ee4d568574bb5446025527ff87d21ff26123da6026ebb8d89c0a3e3e149d0e55d8f8781ed6e8865fdec178a6045527f31763a38acbfe89a4cfb475ca5d7b041f03a8f243c1c833219c63c1e3c395b226065527faf584ff1dcf605f1eb50218a7b0881be9a723083021e7ca08e5af7831a4ee4bc130034b5055ca674813beb6693ca7694b97ae76dce03259fa04b53d3c549ee779cca275c644ce314eae404d914988b18a238d01bc41c40dd83", + "0xf8ea8202ed843b9ae233830186a09421a168349e4653a15a2a6fdff75c3af56bc35dea80b8807f344c0506a8d6252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c69601d52607a603d536000605d5560e160e75360e260e853601960e95360a760ea5360f860eb5360e560ec53609760ed53601d60ee53601160ef53603d60f05360cf60f153609d60f253601d60f353609960f45360f460f553604460f653607c83021e7ca0330fbaad42e80b87dfd307b0d20861adebed5105fa3276da861aa1c90af5f515a0486cd8d24e082b8afebba6fc3e1623a662b77dcfdad567e207dc78f0e509d27e", + "0x02f8f183010f2c8202eb843b9aca00843b9ae233830186a0949c969779991bfcb19e715950acef93757e651cc380b88060006099555f94a3600060e555496000603c55600060e3557f5cd0f31097e0acd8c311e9f757be3fcf06c51812820b53d8442ffb01871f5b866041527f8418002f1568a364760df95a1296065426c3fd34851200cc292509c524af88ed6061526051608153601b60825360cc608353602960845360d260855360ea60865360c8c001a0ab6417499643d8dde0b01a7c59a1cad9d48b4a5ec61c9fca66eb18f7456684cba0325bb6b6a55f162f59d690e194fd8102a6d907c7888094ccc7349a18dacdb8a4", + "0x01f8ec83010f2c8202ec843b9ae233830186a094c82b9ff53ff1d1edcc4b84d42682160d3868d1f180b880600060bc55600060c255f6600060115557600060cc5555600060b6553e60006063553d6000593e59600020805545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1c001a0e103f7b65cad9057340a384a89864c5727473f4cc4f3db938a8261a7155c06a7a05d214dee4794bba4ac6993bab089ff3fb90b262bdeae1f0263a3a6b6f0368d52", + "0x02f8dd83010f2c8202ed843b9aca00843b9ae233830186a08080b880600060f25589f43d6000593e596000208055587f1c7fc0d0f6e35c5fa9afe37280c410dcaee0a0aa42c848d391d8827630f56c6a60d5527f51c53091156c29c3f96078e956dfbc3e77e69d1ae75fd4e6ccc03fd4d5fbd2b860f5527f1c27775a4b6eb8b491f552dfc4481e3a6c6c7b11e4982568b0a06c4d315605a561011552c080a058c6eb5acedaa98c70ba3e39d6aaa4bbb2803202cfe992c0ed1b45616b4f1074a05422d17f7ea362507a5cf717cb852ac4e3c2b2ee76e893da47b33d7abcb18e70" ], "executionWitness": { "stateDiff": [ { - "stem": "0x290378459380774194f3dd7af473757815a18a7dcb4eb6ca719dd127ccea28", + "stem": "0x0512bf2975221f014409d8cbc3dc3ec6bff277fbb7efc6c6f4d262f4ee9542", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x06b38b0366038e1584180814dc8b2408bd40591407d45a335afedb272de105", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 124, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x094ec4ec6e66fbe9552ad81cf9d8e5fd63018fb1deb3f1766fe8f2c3f8cce1", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 129 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x0a7c2785f0d523a13542f9b73a25c414af111e90a4e38540b80d6ffd77228b", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 130 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 131 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 132 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 133 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x0ad2328d12919a5e660597c334c036fbd93f854cdd54d44cbeba8f5f0e38e5", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 134 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 135 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 136 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 137 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x0caca623e7a74d430efbd4ed7cc8469e38faa3da903ee2f8ed67303038b59a", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 138 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 139 + "suffix": 73, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x3560782eb707a3a378ef492c66a4c38f1e33daaf9ec700b31f356d3e72e774", + "stem": "0x0f8fed11fae1d84d4dd496fc46d1dc2dd5fd21865bb555be3a62313fc683a1", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x4d97c3dfe169c2aab9b20fa5bbb6f6e53e4560767896523f6e5a93e09297be", + "stem": "0x1086e08bf6cd44838444244ba0090aa26ad46296b2e9696050f7aa941f33a5", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 - }, + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x175b2a970001855eb9a3615c16ecbed38668482d1682f23d378ecb66d12733", + "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 + "suffix": 194, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 129 - }, + "suffix": 236, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332", + "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 130 + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 131 + "suffix": 1, + "currentValue": "0x0100000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 132 + "suffix": 2, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 133 + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 134 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x1a9977e9cda4b1645de215801cf2513623c97fb77f51ebc13ed1117b5a8260", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 135 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 136 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 137 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 138 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x1e1687e53e9ec0e87578bc5927bf771dfe0ee94acaeae243c4be252d242e86", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 139 + "suffix": 2, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x84c05df768c23da56ace0e5bc7988d5dd032a1e2d8ea3c7145afc81bc0fba2", + "stem": "0x1f2b7b03407084f088fe8a8c06a76eae684890cee8a59494a9b20e4d52be71", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 129 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x8b900b79d7f493c4fb3a8fba13196cc0e76478a36b8674a6dfe6ddee66a9b4", + "stem": "0x211d581f717f816a41d26bf4a612d2818b17b4328c9bd716218b31d4526885", "suffixDiffs": [ { - "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xb8ea48b767f7c48a000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x0300000000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xad6c8b059c0aa4becd95161a2f297e0074af3048e47e671544c520eb0c4ab8", + "stem": "0x242271cf1aaa13ede9bb0a1550d6f181c6135afb92be8270221f03cc8a721e", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": "0xffa35aebed3d130a000000000000000000000000000000000000000000000000", + "newValue": "0x9253ecd75e6c090a000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": "0xbc02000000000000000000000000000000000000000000000000000000000000", + "newValue": "0xee02000000000000000000000000000000000000000000000000000000000000" }, { + "suffix": 3, "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xae1b106992d792cbeb5d96559894c2a8dda72c9414cfb3532325f4633047ae", + "stem": "0x245da06b377d1e36008df031087b2b3c9d5f3e82008c511c089d4ce7e32ab6", "suffixDiffs": [ { - "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x525de5f1f51e4d4a201500000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x79793c0000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xd68b7458f07bf329e87b81f099f9c3855d43aeeed7748d85d222b3a8d69152", + "stem": "0x26c6979b8c598b4fe76addf0191443d41886ae04141cbfa50c03d743b3873a", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xee9707ef2846473a6fe4e10781a3b8b225ea950a7c89fb88f01c3544a41dfb", + "stem": "0x2ba17676b1eb0b0deb1f1a88c219e840db9c8dcf45fb517e7f8a89f56b6e9a", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xf48b4a9ad9ca0b7761b6557aa59cc184a3d14dc8b6af87741fd29e19c11111", + "stem": "0x2cefed5786cba71b7d4e06c4338e153d9da91947b5e433e6601176621d3271", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 - }, + "suffix": 122, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x2f1d35788b1b3399054ae66e75013ebe9f489054566e2b7fc0a0e8a542cfde", + "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 130 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 131 + "suffix": 2, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "stem": "0x3071bdd7142c286443f6d9cc5400e1241a630bf50c92a8078119fba224eb4a", "suffixDiffs": [ { - "suffix": "0", + "suffix": 0, "currentValue": null, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + "newValue": null }, { - "suffix": "1", + "suffix": 2, "currentValue": null, - "newValue": "0x008053ee7ba80a00000000000000000000000000000000000000000000000000" - }, + "newValue": null + } + ] + }, + { + "stem": "0x3092d2f26a274b4ac37c8beb7077504260c58a7acfe93bb7925047e3c4830d", + "suffixDiffs": [ { - "suffix": "2", + "suffix": 199, "currentValue": null, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, + "newValue": null + } + ] + }, + { + "stem": "0x31129e65d47cb64c1704ecc330c8f3d68fe6fead3483524469ac05f9ddb4da", + "suffixDiffs": [ { - "suffix": "3", + "suffix": 0, "currentValue": null, - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + "newValue": null }, { - "suffix": "4", + "suffix": 2, "currentValue": null, "newValue": null } ] - } - ], - "verkleProof": { + }, + { + "stem": "0x32866b4d392c8f1395bf6e34ff355a22c01cf4600110fbb8a77104bc30ad23", + "suffixDiffs": [ + { + "suffix": 112, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3398c507f263626d75cdc742e42f2f04b4929af3248d6de504baf952ea09fa", + "suffixDiffs": [ + { + "suffix": 107, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x34cf12073e02b752eb9e13c8d18c065449acfe1fd79e37dc562bd7329afff0", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x39629e519f1070f19f0e20a6fb3529ac884fecca6f07bc2beb8c610ee4d130", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3c5f3a5f6f361904f0ae8db6db184b6cfa22afcdd31846bf26d6b193ca2673", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3f88e3cf10b7360ed3fedf58ab13a539b7de57edb126a47140826cd64e2c81", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x4300c80dd0f3c8818137a1985a0d75353d77cfb8fe744b3171d151869124dc", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x46ded0ee0ce535e3d12157fb01903e215dba22dfd7624469b48ca172e9aec2", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x4c6cc3daee6c53bdcac7a0a0c65f71aa29ca9f5428c0f130e0b8da18c7222f", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x4fb04986147d8a76dddadff38143c7df4183dc5a157ebbad4a30a0cbf6a848", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 83, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x56c1f462bcf4f01e86d741284d3cc84377a5c01b30fadd83d0ebdcad151371", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x58fbc2dbea6ef8a59977071dda04fc14ce0186a4d963b8d01d5668592f66ab", + "suffixDiffs": [ + { + "suffix": 242, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x594bc797c263a3e17f1fd75e48784d39220756de4b44d78445bda355e51f66", + "suffixDiffs": [ + { + "suffix": 194, + "currentValue": null, + "newValue": null + }, + { + "suffix": 236, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x59cb29b391a815af30ca671b9fca1bd9a2a69126949b1ca4bb304eea50e321", + "suffixDiffs": [ + { + "suffix": 124, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5a2df0a47f26b2d98c24ba9be9001276d39bffb597e014b2c45af5cc03c2eb", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5a3cbf8d517e33e29958a73fb23c38fd0cb6bf10dc5f3176760f271175bd0c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5a4fc2245142a8b79cd81d009b76877241f3ca227571c28a4b7f5cb4261ae7", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5c6e42f42e98a787b1d0b9b5dc7a67732990e36ae06f59e7e7aac61836d6f3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5fd44549c225e6a6d4ff606981e95a443a7967a209086721ae987842c410bb", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6059e84002b2e1f6fb992e6345103892dacae2ece9f2a7b215bfbbab7e8bf4", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x632e9ca86b022aae58d16840f58d8b7212d012b3b21b30b3acdcc6a4f31603", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6624d7cba92cbee9d0089a7b549d1c4a763d4f42d98bd4de67771ff81ae335", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x66f73b96bb94c797d9bc07dfcd0d1e1125eb2e2560fa09169849403dbd5d87", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6f646baa0e96f3539c927afb3c44521cf7db798ecea0b816038f65e0327d46", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x758dc0ea017f2a59053b0eea74059391c4305502eacf10708b475110a0399f", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x78c037906f2b68aace9d2f7d0f7353be0cc8e821e75e017aa58409f389ef4c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x790abce6ddd8c01d5560b5cce31c78dbc565d0667d517f4d7e1e196296acef", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x7a622bcccf06aaffc2dd6f4df69453b533c4d86fa18a03a5a35ba6a97756ab", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x7e749e23c2738db67c28077abeda8fe309ebecaf40adc5d9d28a783ec75f79", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x81d60a8ef88d628427be7dfafbec6ee5ca86a108af9a18be3ff18d30aed880", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x86301eea71f9e9340a15e6df9c0c499d5d9f31c5ecdfa591f77334e05fb6b0", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8871aa15f70a40e1a823afe2deb10787ee647e036b83da070108dd91b9fcab", + "suffixDiffs": [ + { + "suffix": 244, + "currentValue": null, + "newValue": null + }, + { + "suffix": 245, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8af20d9a15c195bb78e769c34d4b5c83a4b18a287b7fb942b360f11b842dd3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8c9aa66aef4c574d745b3bfcefe56937a7dea5f3e2d3699ba7074b06c2bc91", + "suffixDiffs": [ + { + "suffix": 232, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8cd7118a3fd8da2bd7bb4eb7e75c8cd9d67ee22868e9ffa4af5cd5312b31b8", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 123, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x910fdd9d0751f5d5d12c4c255067584bfe2c89cc17e94642947111d70d1de3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9525b0e280a6fe9aac626e5acd657082d76a4596db8f0de19250dc21ac1a78", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x96ed99018bcdb2439b664559f70a95ec161cfc6ef2b8e1b42ff61733e87f8e", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0xbd5433676ccc1c01000000000000000000000000000000000000000000000000", + "newValue": "0x25d2ae9954d43001000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x98f3a9c126844522572072e9cce8634970ef5eca571e872ef8164cde5edc07", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9960c722f94f42a8e634aee2a4e613cc621e32af33e98cdebe0d60a0c5515c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9a377262d31998106d72b5e6ac531f798d185770b8af05b31246b3e0723b29", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9cd15c57e67241dd173f3fdb8f049f9dc627304a77b268ca61b34a5131e33d", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9e125a9ab93304741e85ad70b17944dfd03d356db17d29a724f3916fdcb3e6", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 107, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9fb6b447be8b75ed8b63023678ec7cb609f2629b74309712ef4324579daca8", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa38337ef57b6044e6d0b10438c04b7533df1d9ac55176a6d0d781c5030301c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa6d770a1cce30be217a406ad92c4ec964bf54bb7f3da810c0e212bbf419cf3", + "suffixDiffs": [ + { + "suffix": 122, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa7ee40ee3158a6c17a5f7e39cb76cbe5c938813bdb87932b9593b330884d22", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa84aaa726b189a530eda32611eef4de5bba5dab33f108c7e9c5cc25ea34ae5", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xab8fbede899caa6a95ece66789421c7777983761db3cfb33b5e47ba10f413b", + "suffixDiffs": [ + { + "suffix": 96, + "currentValue": null, + "newValue": "0xf3a540f1041fc87838706d6bd000d6dd8ba2193601578b89c86587921e76c00d" + } + ] + }, + { + "stem": "0xac4e1877e17f9d07b8517d8b42454da96041fe3691ad2a5014845e5628f0a5", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb2f20925052d485a02dbbc368f423145757d23ff9c5a0576ec22ac0229a8fe", + "suffixDiffs": [ + { + "suffix": 115, + "currentValue": null, + "newValue": null + }, + { + "suffix": 189, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb5d048a04818c18604b0a5b6a99642c933d96004eea2016df0da9dec89a301", + "suffixDiffs": [ + { + "suffix": 73, + "currentValue": null, + "newValue": null + }, + { + "suffix": 106, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb6210bb43ad03b80ac92b6ed97fb94e94057e730379d95af7d3321b4f2b39a", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb887e578bf784daa577f287ebea0de03389ebccb25cf28812cc8fed898e04b", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb96c6214d3246d16faa31f11f58c7ba7411c845b1c52771be1b0aea2f64484", + "suffixDiffs": [ + { + "suffix": 93, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xbcc5243b9d6b4d69a2ab5e82d922a144f26e272b729c86617d09ca0f7c629c", + "suffixDiffs": [ + { + "suffix": 188, + "currentValue": null, + "newValue": null + }, + { + "suffix": 194, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc2a7d4c9d2005e7ebcfb8eaa0f87f885e5289afd6bf70b1fd5bb909981c55d", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc2e0308487c553079600c467413d872f5337a5a07a4c2797314e73745830ad", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc4a41f5f3fad02e33729418f39022da53368c11e75c99c764e64b2e5145ff6", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc5dd900c8c26e0b3c1980ae3870f9f2127be476bd54787b4a7dfbaa4531b28", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc8aacb03515ae23d996d168ff8eba57691303c63316ff6c61f940cde7c2b3e", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc9a39e5c7ddf2c2f9a5553a7c73bb97f899fda3137146acf9a812c84569e06", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xca3425ab202792210d9e294c434d1e34989d9c1961e0476cb7678896bbe736", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xcc257ef9bcf9400b9a16481590496f650b04bb690e9f11ae69f490c6210944", + "suffixDiffs": [ + { + "suffix": 107, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xcf5408fa602d6dbd8e2e641d14958a88836476fd0e0a32daa0de56ead34d24", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd080375a20f69585efaa6551d5729f463fae6f0068e9c76eafd1be0996574e", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd0f548ba085d0b3a26d0ae81e8244c2d73fdf3bd3009a285d3fada3b14feec", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd3987c8f556bc5c377ff52b171daa1cb83d05b4d95f2b013f5b560d1be8df7", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 83, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd424261571b4f0e6783482c59f72b1fb0ad54694d614133baad31a254d89f3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 73, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd81866238d9af46480fc7ed037df37e5d4d82cb4f2ee8abadd9579aa756762", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xdd886b61bf975565e8cc68c02e6942900162dfbe3aad5f544eee6cf0c98339", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xdf67dea9181141d6255ac05c7ada5a590fb30a375023f16c31223f067319e3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0x644e02368fce0d0a000000000000000000000000000000000000000000000000", + "newValue": "0xc8c57df82e98030a000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0xbc02000000000000000000000000000000000000000000000000000000000000", + "newValue": "0xee02000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xdf72f4afaa53b82fb0445e6261ff1d7ab5da0525649ccc7db9d5f06138f052", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xe13ec10bedcd8a59ee1ae190428ebae9d88c12061f06b8d7128e8c9a8b6961", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xe4aea3ebabf6e755469f194e73c28e04ce453e64c490f9e561a12d1ff7ea20", + "suffixDiffs": [ + { + "suffix": 123, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xecc45ade2962a8109bdd83615b81f8b06fa3895b63a91ebe98bc61da989e7f", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xf3a5f5c3cbb4e0c8437fc59c4ab4de0831b69bc7454685d27918ef454ba657", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xf9db1b27e3359ea9bf0c49ea0a607012bc4f584655d93ddec04e01d631ff5d", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xfcb3a619d36da42369f50a9bd41371c55ab37a73dac6caa505383f4636f2b0", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xfea5fe01f1910c3e2923c38b7395ce356b249a9a6b973fdea7e42b47b40745", + "suffixDiffs": [ + { + "suffix": 173, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xfef6c89561f11284efdc38d2f8a362d63149071b1e929bef2f199ca15be4cd", + "suffixDiffs": [ + { + "suffix": 125, + "currentValue": null, + "newValue": null + }, + { + "suffix": 174, + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [ + "0x2b0666d65c693f59a7d7e5c9d366c0af0f5918531699a1b36a864575d44b44", + "0x307e2d1d6b9252fe6017a1577d27eee29a32314e68499b600bc1dec125bdf3", + "0x31c3393ffca13d19aa27b799d5bb93777f75c50c08548beca9f789e825f8d2", + "0x4cad9c2d704a188facc52755cdc62bf947db397516ddd0025541d917290828", + "0x5a3e9eed1c04e8be7598cac97578a4ac1361f7300434437c15238ec4bffdf2", + "0x75a259f01b2e7f18d0cbc1d6c891d3acdb1f1f304f25cfc7d81a67215c4a84", + "0x8687c46a9c42f9560a190088d897602af1428c9675f11c557a580ebe9d20a5", + "0x8ca368ee3a41f56d9d636c74a2bc1fb89204dc338a261f982e043bdba46e25", + "0x9868d698b6605c6a1c0ace08cd261f6c8aa6cce1ad2926efe10d21c7bae806", + "0x9956331ae1b3ab76078bb941178bf8cc25dfd2e3f83650ed7305a6fccab9de", + "0x9f1e458ed3c7afc24285cc084733dc38657c573fdee2963873100dd69313b1", + "0xa6f677f1eb3c0fb04e197c317130977a4f8d4ae24ab71ecf3623a36949cb62", + "0xa78b8d5c04be31cc92fe38110c34b21da3e4a33a3b32494e200bbab91a9ac1", + "0xb59831880bd5aeccd94621d5060eb04e301df6cfadf654946332997791b4c9", + "0xb642d1637a669976bb1a3c78b352f7e7fc506acb7286cf507d2e31a2d697be", + "0xc8d0efd70a010c68da50d7727f54b388d945214acf03d6357e65e980c5265e", + "0xc9b21ead525cbf5a94f32949b5b20216d5870e0024c8e73a6ef364e546c964", + "0xca3f471892ec310cb6d062ad97856c811d81b46bb00343d39a777dc313b5c4", + "0xd092de740adcb52108f42fc495a04faad6724d07e2c65febec47e9d765a08e", + "0xd8f02c1b8a44c5ef8735974e10bb7faef7b618554bfc8e7b5f27899a85d1f9" + ], + "depthExtensionPresent": "0x0808081010100808101210080810121010090810090909100810080810101009101008101009090908080810101010091010100810091010090910081209091010100910090908121010090910101010101010090909101009091010091012101010101010101010", "commitmentsByPath": [ - "0x18f21df848fbde27fbe0f8a231b4561ed8993588010b01b6e076cac910b87c42", - "0x0520fa7a1eaa72f303b4bd5edfdc58235942f3a48a88ceb669d24ddb85586f55", - "0x186e9dc2f984e5db103680adbfdd83c2f6df0376daae0384d6bdc63d3ee1383b", - "0x32a41cdc3f91731a5ff0239e98d63b7e63880dda4a2bce20abe615b8bdbb81ae", - "0x4b22c6bdd8233349c3966c44fe7322213431df9fc3e3cc6fce0c7d7fd0fb0c22", - "0x56653741afebf8e9ed40e310ba9868bf8736e50463ad8d0a9fd700f2a35a7570", - "0x3c0d513d31e51867367010464d08a84a85c975528f7aaf1f059c0f2d5a8b90ca", - "0x10dd60b1df160579af0d2667dcf6358e340aeef59ad6b00200f56ee8af850b39", - "0x2dcb916d0a9a01ba6254922ae3492284c46345e3e7e0fc94f4fc0978ba0e4b00", - "0x192f580695485d9fe38610a4d3d1af7ef4daaa5b5a512e6e9574191ccfd02670", - "0x08b9cb110253c94d40df41d56745b8767b1ddac66e3d378f04fed2b007f5db7b", - "0x1cfb1a085e241a26fefbcd19e5c8fa14a5abe38eff6d78a7671475e74c900ec8", - "0x63be1f65657faa7d706b908d3b3b3674f5d8d858b790480dd8a4d9c2ce9369fc", - "0x08652f5969f0d7f893dea8a247dbc70bcc10a54ad86684cd9f15288b056d5e96", - "0x2758d93b5d57c8bb8985b8245ebc4b9f8c3dd1e376119a1a99416cd16c4d459c", - "0x38af2cefe233d1f2c0a8d116fafa67725c9201d65e3a5b7b6e2c615c13a5eec7", - "0x0c3dec1d8094db18271c95c0292877dfe14076d5bd965b7da4b090f8e0c3cf26", - "0x2ab4e41a5e97902d093bd194d7e9fb15d7b6866d083cc2cde9b1e60235d3e759", - "0x1ea2625ea1d3b62c540749ebcb1daa2eefda6478d1958c067e8d65bf473a15e5", - "0x30a3c5b308656a1ff8fd9cb982cdcd7050a477459d33da41e312615af4028569", - "0x073afcac9107622d7e81726ef59c8e30f7c0228724ab6ca437d34ad7dd89169d", - "0x5ff714b854edbf2e5eb9f994ca2ca4ff30fdef76d62091c9920463487c91fe0c", - "0x4deb8879de6ddbc6c99dd321e1b26b70fbdb2fe080d8244a2b9e1ddb63ae4fcf", - "0x2644e2ebafd0c4b847fe534f833d79899e9dbaedb3e7b0715326ac3f8de5a2ef", - "0x09eb0175311484f786ba1e12f5dd80823fb9bb806de46cac8f10b72b91019b75" + "0x01199557646012cfa7d03df58183e2ce851f2c18e20d075cb7d8c85546e755f4", + "0x46c5faaecf65c9823b7449701968b1a7ad5d6bc04be964466aff85655f9101be", + "0x3aa4441b6c89365e21093ad98d32f286075e8ce26a907e99f1907e2c7920baff", + "0x37e9a7aec30a2f9512e1e3c4a1acd943e9d12b5d8a34e1821577a3e12402b33b", + "0x427b4a9ef0138f38eb2aa1004b32318028f41c34b3724313b73b4bbb3c7fb2a9", + "0x62dbc83963aef42b5c6696695bbbf01e92ad6d0db9e565b687bc145b463ec46c", + "0x1851f9391eca8b89a1f1fe153b3587a467abf10f9ecb2b796356b361e6605ec9", + "0x529a76c37776d20f4af070db3c191866f2f43d87c718d910dc6b5c89bc0a5459", + "0x3f16cfc6eab0330d3ae71c498bc0981c8e17d2cbef0d5a45a911b892bd45cba2", + "0x65e9f1920bb62cdb0cf51efafaa162dfa0e4153f8cc309f9aec67f1b3c2dcb7b", + "0x0cc8a0e6124391d684d7b6ec322140e59e998acab7b05bc17160cbc6ab5e4455", + "0x37cdeb1feb98a341cc1e72d89db97596a63a932607427fc128bedba5ed2c22e2", + "0x1f8018a60bf452f9925da38bdd039db5e6667a0d5f9b2328139f7d291f4aca0d", + "0x2361e30c77b5b1b5da73a446e7d6e78d67fc93e622e14aea409c34167ed34ff4", + "0x0e61ce0dc0366a7445ca583488912c5e26e21d69e768ceb2d3ff3194f166521e", + "0x32cfa7e52600376abaf1bcfaf5603c311c6c3471defe66259fccbd3bd3005afe", + "0x1c9bd61333adb8f883866d4ebd33d2ec82786e6d6861ccaf95d54c9609841c0d", + "0x4b9e6076d475be65155e3d05e34265c447f0743d46fa8a8842ce9e8d3302bf93", + "0x254f7279536e199e89484d67f772a2b410dabe11a961b88f03bb259243e3f69e", + "0x0aacf6eb2c818ddfb84d4eef00b486d945b536a316d3631f8e10b55172257945", + "0x2841830305a4b148416f4a46e23d1c3e7733a9c380922dadb5ad398df2d852a1", + "0x14929fcbcc77ff4e60c3ce8281421589e4958ed0ffcc70c6172d7b1010268c40", + "0x0d7a506c35e95ca6f482ae1b9641efb198635e219f874e43ea5f3acbaf48473c", + "0x430f5531e6770d1a78456b12bce8f4b32c42558a04a7be9ed66cda52e0775d21", + "0x1d6aba0ac51f8d7c4418baf5d908fa520bf4701c2e5b2903c344baa5105b2585", + "0x3f01e5ca24e0903981a0cbbd0067153d6c7129852477ba1f31e1c093fb9b65ad", + "0x690e98ec45cf5d9bf56df3cb85ea3975c357925d2ebee811ea2ef00322ee322f", + "0x2aa951abbb03d98ebd822c492d577e7f8617fae2f439e26ab1313e479c68824d", + "0x2c02f17363947895ce377823e07fe5d5c64b6ca0e4c51d6b6a8419fa6a708c08", + "0x5ff1c4d4883f22678fd589e34edac1c8fd6f154c6621a61fdc660989cb72f056", + "0x3aefdf17895c4d636451e49bd489fd5735701aebd3a1a9dd5a815827ef0e824e", + "0x352fef2b2a4429bda58710de7a8e3a7d605127ff9da0b001998b9eac4c084244", + "0x0c2d895c8bd298ba965414a8bdf0694980938a27aa0de8b59b81fafa60ee111c", + "0x244a95b14754daac8bb87af1e04a6344eac954de41cb429753d77a63a655530d", + "0x31d545fba02d0568b0b36225f05f7088e819238158493164bb6818a520c4b167", + "0x531736c74afa4fd3fff3bad6c5bbb95b8b68f0f7ba3c65dd689ca1f5d96f23ef", + "0x25bee57af20fc8a1e3900d515226c0d0abf48b013d660a869d7c0b74f5731e7c", + "0x23f8b7161eecbf64eb8ad567b5aaeaa4aa1144ecd50ce06821537bfd2d415619", + "0x0931f8461f83ea58b33a0d8ea0961391d7664f7c0085f4b299a944a7c8e466d1", + "0x3064e3d6b3f8e2cccba57dc010f652e8cd5ea8a6f91c50ff2a8505c9192e6fd6", + "0x3726fb35ffde02e6a36ac85bfc5910bf4affaa3a6d4d8f0e9a81a8e6737b4f8f", + "0x24602e77b76788c5c1f51942fcbf54ed3d8f3ee118a399f275dca4185bb95ad0", + "0x1abb09195dfc0a37a2abb51bc2e2b791b5ca7d9484aabf6b83eda1e97aa3db17", + "0x3e4e0080dbfec64fff7fa7b7f30a5f9867b1aa28cf79b09542ea8ecc52952375", + "0x19cbdc4a103f05b555cee260469142e8a34a5717e321ed74fa7a62e50b65c9ce", + "0x64aa4ec790c5c8a1b0945ffb88ca8b88da4fdb0297b9b65b696f3da999f28c46", + "0x6019069e6b808e2c30e3ac17fc4942a2194d3be7097a06768b03a985a369da71", + "0x474f20cb18aeb879742fbdfcc015118f5b36f93389a314040415a8b01c533c6b", + "0x2005252cc4226fa20774d566874e0398e568894934aa6452355620d03ecff29e", + "0x14229c7ac78d277f9d8565b4edd7659dff181c72e7735b1d8fc21a8b5f95d2d5", + "0x3bb63594faf0265fbae4501060c6f917eae9ade1ff3dbca860eacb8826616a28", + "0x694df494913aed82cf7a4b15b0b4f8284ed46ca963177713bc8738072c9fdafc", + "0x47baccfb1043a41567004a5aafe28e00b6902092e42af59362171a31c5b3d720", + "0x335b2d28993c36130a6cf3d14dc06015e8d3126c2a32ee85eb83098e1028f71e", + "0x5f06f874808fb17e13d839fa2069a399d9e2e5960baabeea294732e646eaceb5", + "0x39e92e43a6cf68ba5fe29ae873c83670b434ba3e7b645ca35c44f14421ee95cb", + "0x69fdfff6c225f5f0631ccca3fbcdff3574106a23310d288ddd142bd3bc23eb65", + "0x288b90416e8d13b029f5dc498c46d6966388d227e0682f9c8a150dd0b2228a67", + "0x0747e20676b865a559fb6284d4a38f5ea2e2222842186c0031c8bf9ff4cc27ca", + "0x72167fa9d85e5733eec80323e11625294ef4de12c813179dfe906ad22bb0229d", + "0x2f9ec2baf178082fa7c33a7021476642b761e03052dcc775e480939cba1237e2", + "0x73d3c2c2d54273b9cc41fcd84b8fc7579176f8244127ecdfc018b66da6122c99", + "0x59857c8fd15a33f6b94b5da737729f0d78fb2288f4ac06393cc7cf8714ca1923", + "0x35346be2c112a07ef69aa62bb02a3a2f817a32c91f4e88e3a204b9339575347d", + "0x4793b69a54c5568a699b4cf13184fc9a38992f4ae2e71e0bea63b7b790e39a91", + "0x00bac75a4a4d681858a0208707207832484f100edaa8ccee7301f48566ebf1a5", + "0x47d17a51003a73347b659182c9be702753ff285845921440a3a4b285a071022b", + "0x172e4b0ebdb0da24f90f60570a7db2fd3a47bacca549eba99a9cc1d40b26732e", + "0x58917df0d0901cf067af992294f5487e64225cb3137e85d071c4d501b2c2d888", + "0x6949014ab1ab4a6fb597650c9d606061233818c05320de08639617b421b71351", + "0x1aac937c03ceb3fd76d138e7ff323847ca7031b1148583d47a4f0c9c2768ac58", + "0x1795bbbe3c75f245a6eb020010db6f077f3f30133ea0cc263819d252b1d6d89b", + "0x5a5c5c655811a3019436f15fca4ee8638df1ead43f2d1aa8813a829398fd610f", + "0x29825f7282d2857e272790c4dff4179567ede081abc846a42723f5a88b385ee3", + "0x4bb2c2db2a43027b4fc316dd850f16d648f7d941a33ecf1f63af986e4079366f", + "0x6160d57744eb2a58458d744253d94594e91fb3fa42d6360c83208368123a1de6", + "0x6a9463d0c8a3160cb5ef0ee6d76c20b99f32ac327b5ea5dc424ae6db28b59f60", + "0x0553079e00b90ff9ad35980a42d6364cc25ce03a66f87f51447437c3010fe1cc", + "0x4115c344d113c884ecab66a2506cdaa0d721aa8e2ac29989e9f47bab0172b999", + "0x67ff748cd92ba6161c0d35698c24df64fd724e70981714173bf6d3b9ded06ab5", + "0x14cec786771992338db76d054d8e0dfe9154eff89ced6f0c5f5e4ae4ec211353", + "0x003ad8815f835e9abdbf548de77607d6f257275d8c8644bebe1b04d179960deb", + "0x648e1ce096a694eac74a5dcd17923cedf0f1e34f6355955274515797802a8381" ], - "d": "0x06110992b049b61a7543a1a388a08b7aa967580266b12b1880dfd8b8aa1e2aa3", - "depthExtensionPresent": "0x181818181a181a181819", + "d": "0x354c2d2f39b0e47290b752043b724864154117120477748f012aed939da8a19a", "ipaProof": { "cl": [ - "0x7201d3474df7071d5b08628720df125d3c576b7310a99a67e57c5d364f442aed", - "0x5eb72934160412aba09e9f28d911577942c171cf0921c016eb7887aa8ae0ce05", - "0x69a486db0afb403ea7c64d00bdde39e53112a41fa48fdc1403a392f12a5dc02c", - "0x461f0f169a348da80089c2f59d99a2a372de7be4f9b80c734d87b951b51ef39c", - "0x66a53133a17a72f39492d3430fb8b476bbe3c56fbfe59c44bdfca4a9a3a5e99c", - "0x497cc3587d1994f6ae21b2e7ffd97f5505c9aaaa9c6288267dc8e1c326b8118a", - "0x1cb46f70017c2f54571b8620e237cb3b94b41e37894c29a3fcb1685ffcd56083", - "0x5a249d17a2257c122743ec27afbb7624e52819c6ef6c6d081d4c023012931381" + "0x1d241c125f6e2590909746f39cd93ed8347014a9015232de6c1e3446c094acf8", + "0x521b7520e11608865c43909b66a03378078376ce948589d83981807decfc8d22", + "0x2bbd0825725d7f411914ce99cbf9d9f7c93f35842c39443c27c9309327c7e1bc", + "0x447ba4f8d604d63308942b0a555e79e5be332544501a3c73fad9b80ce7c8ada6", + "0x69f58232134e771cdc98ef29e0e7dd803b37aad76969aa93e2667a6e04b6de17", + "0x087907e4c70dd98d72d7a9b5764781210c563fb73c1756a2b2d03c72fb0b61de", + "0x14543308ebd9f2401a63a4dfe691d558fbdbfc7066d99cb1dc8ffd4d914db998", + "0x170e27ca863cfac63545c64d3b6381672a19430d3fdcd66ad4b682b04b0656db" ], "cr": [ - "0x1be4988b202837e86a2e3ba61ba5fc62e4bb36bebad554193df623270ef0c9fd", - "0x2120506addcff94106a227c0ba2812cbc21f7003fac2643d4ec2b1ed8a9df858", - "0x6a0a5aa53dbf13b873669715f5a8245d76dc41bfb6c9a002347ece4cc8aea838", - "0x0f2558cd2bdd186be9d721a24679f1d92c599abdf25ac4b1294df2f090be3091", - "0x0a3a12eebd6234289697b747d242fa4ea769802c5a28c739534324f070fb7102", - "0x5984c0dd556fca9e7e7335eb03670ca08787292b0eb9de624ce88f421d531f8e", - "0x47f7f6d5b603026777d3f57fa1657ba257df66adf890ea4d5da454b44816ebc7", - "0x23d9bd0146baffdef1fac45f9b573596a15f72ae0f84aa2b82689ea2a6c95f2a" + "0x41108a82a07d24400ebdae0dfe00bb9b12d630ad079554e377b66b658b51174a", + "0x3dd720a87ec6c348ab25dc9e79e7e035597823b2f7dce96a0d0c9881dba1657e", + "0x254bf6160f481ab222999772d177541ca9938bd791671263d1fcd886ddaa3902", + "0x6dc8a24d0b06a559b1bdf160b564d3199dddbef461d91766a55555ad9735a5d6", + "0x64fab74dc9dc68d3f1789386dc5413803591aee4270829b0a7e703fbec799b7f", + "0x16c8329759af37ed8c8c0cb5201a5d9356c892ad4ffc7e9aa670c4f4f64e4594", + "0x2483b303c03c8943d6b55df7b6307e534d3d919ad545ffe7aa099ff1730e47a4", + "0x2aa0a2593c1d3d3d5d39e1d7b665feda7c92952bad7df1c8feaab9809faf5fc6" ], - "finalEvaluation": "0x0fb5674a2d8693294a5cfc0f95ae7ce5a6c4112255dc7a25afd76446863612b1" - }, - "otherStems": ["0xf48b4afcf49fabd63c9ea130cd708c6f1a1c2cfd8329c9265395a00f670658"] + "finalEvaluation": "0x0e1e1acaa1b2e38bed96d0ff5cd2d2980faceae8cefb49f9743849ba5200ce48" + } + } + }, + "execute": { + "blockNumber": "0x62", + "parentHash": "0x2f08a1461ab75873a0f2d23170f46d3be2ade2a7f4ebf607fc53fb361cf85865", + "feeRecipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "stateRoot": "0x1817126b2e3f5bb9a77835e46cb42ce46f35968d0fcf2ef2b6678c7d826e49dd", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1a3c27b", + "gasUsed": "0x0", + "timestamp": "0x66191454", + "extraData": "0xd983010c01846765746889676f312e32302e3134856c696e7578", + "baseFeePerGas": "0x13a0", + "blockHash": "0x9e0baab3628fb096ca0d0903c40d782af008b851b9e0309b1fb861335a3f22c4", + "prevRandao": "0xede66b8478c3b7623206885a59e297cb4722fa7b67fda2cbc9be53e7690e6fc5", + "transactions": [], + "withdrawals": [], + "executionWitness": { + "stateDiff": [ + { + "stem": "0xab8fbede899caa6a95ece66789421c7777983761db3cfb33b5e47ba10f413b", + "suffixDiffs": [ + { + "suffix": 97, + "currentValue": null, + "newValue": "0x2f08a1461ab75873a0f2d23170f46d3be2ade2a7f4ebf607fc53fb361cf85865" + } + ] + } + ], + "verkleProof": { + "otherStems": [], + "depthExtensionPresent": "0x12", + "commitmentsByPath": [ + "0x4900c9eda0b8f9a4ef9a2181ced149c9431b627797ab747ee9747b229579b583", + "0x491dff71f13c89dac9aea22355478f5cfcf0af841b68e379a90aa77b8894c00e", + "0x525d67511657d9220031586db9d41663ad592bbafc89bc763273a3c2eb0b19dc" + ], + "d": "0x5c6e856174962f2786f0711288c8ddd90b0c317db7769ab3485818460421f08c", + "ipaProof": { + "cl": [ + "0x4ff3c1e2a97b6bd0861a2866acecd2fd6d2e5949196429e409bfd4851339832e", + "0x588cfd2b401c8afd04220310e10f7ccdf1144d2ef9191ee9f72d7d44ad1cf9d0", + "0x0bb16d917ecdec316d38b92558d46450b21553673f38a824037716bfee067220", + "0x2bdb51e80b9e43cc5011f4b51877f4d56232ce13035671f191bd4047baa11f3d", + "0x130f6822a47533ed201f5f15b144648a727217980ca9e86237977b7f0fe8f41e", + "0x2c4b83ccd0bb8ad8d370ab8308e11c95fb2020a6a62e71c9a1c08de2d32fc9f1", + "0x4424bec140960c09fc97ee29dad2c3ff467b7e01a19ada43979c55c697b4f583", + "0x5c8f76533d04c7b868e9d7fcaa901897c5f35b27552c3bf94f01951fae6fcd2a" + ], + "cr": [ + "0x31cb234eeff147546cabd033235c8f446812c7f44b597d9580a10bbecac9dd82", + "0x6945048c033a452d346977ab306df4df653b6e7f3e0b75a705a650427ee30e88", + "0x38ca3c4ebbee982301b6bafd55bc9e016a7c59af95e9666b56a0680ed1cd0673", + "0x16160e96b0fb20d0c9c7d9ae76ca9c74300d34e05d3688315c0062204ab0d07b", + "0x2bc96deadab15bc74546f8882d8b88c54ea0b62b04cb597bf5076fe25c53e43c", + "0x301e407f62f0d1f6bf56f2e252ca89dd9f3bf09acbb0cca9230ecda24ac783b5", + "0x3ce1800a2e3f10e641f3ef8a8aaacf6573e9e33f4cb5b429850271528ed3cd31", + "0x471b1578afbd3f2762654d04db73c6a84e9770f3d6b8a189596fbad38fffa263" + ], + "finalEvaluation": "0x07ca48ff9f0fb458967f070c18e5cdf180e93212bf3efba6378384c5703a61fe" + } + } } } } diff --git a/packages/verkle/package.json b/packages/verkle/package.json index 2a7e028bc4..ca1d5fa68b 100644 --- a/packages/verkle/package.json +++ b/packages/verkle/package.json @@ -48,13 +48,14 @@ "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node", "test:node": "npx vitest run", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { + "lru-cache": "10.1.0", + "verkle-cryptography-wasm": "^0.4.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/util": "^9.0.3", - "lru-cache": "^10.0.0", - "rust-verkle-wasm": "^0.0.1" + "@ethereumjs/util": "^9.0.3" }, "engines": { "node": ">=18" diff --git a/packages/verkle/src/node/baseVerkleNode.ts b/packages/verkle/src/node/baseVerkleNode.ts index 01aee3ebfe..43edb15007 100644 --- a/packages/verkle/src/node/baseVerkleNode.ts +++ b/packages/verkle/src/node/baseVerkleNode.ts @@ -2,10 +2,8 @@ import { RLP } from '@ethereumjs/rlp' import { type VerkleNodeInterface, type VerkleNodeOptions, type VerkleNodeType } from './types.js' -import type { Point } from '../types.js' - export abstract class BaseVerkleNode implements VerkleNodeInterface { - public commitment: Point + public commitment: Uint8Array public depth: number constructor(options: VerkleNodeOptions[T]) { @@ -13,7 +11,7 @@ export abstract class BaseVerkleNode implements Verkle this.depth = options.depth } - abstract commit(): Point + abstract commit(): Uint8Array // Hash returns the field representation of the commitment. hash(): Uint8Array { diff --git a/packages/verkle/src/node/internalNode.ts b/packages/verkle/src/node/internalNode.ts index 9371744124..06869e1172 100644 --- a/packages/verkle/src/node/internalNode.ts +++ b/packages/verkle/src/node/internalNode.ts @@ -6,13 +6,12 @@ import { BaseVerkleNode } from './baseVerkleNode.js' import { LeafNode } from './leafNode.js' import { NODE_WIDTH, VerkleNodeType } from './types.js' -import type { Point } from '../types.js' import type { VerkleNode, VerkleNodeOptions } from './types.js' export class InternalNode extends BaseVerkleNode { // Array of references to children nodes public children: Array - public copyOnWrite: Record + public copyOnWrite: Record public type = VerkleNodeType.Internal /* TODO: options.children is not actually used here */ @@ -22,7 +21,7 @@ export class InternalNode extends BaseVerkleNode { this.copyOnWrite = options.copyOnWrite ?? {} } - commit(): Point { + commit(): Uint8Array { throw new Error('Not implemented') } @@ -46,7 +45,7 @@ export class InternalNode extends BaseVerkleNode { } // TODO: Generate Point from rawNode value - const commitment = rawNode[rawNode.length - 1] as unknown as Point + const commitment = rawNode[rawNode.length - 1] return new InternalNode({ commitment, depth }) } diff --git a/packages/verkle/src/node/leafNode.ts b/packages/verkle/src/node/leafNode.ts index dd11308d82..330fbf17c6 100644 --- a/packages/verkle/src/node/leafNode.ts +++ b/packages/verkle/src/node/leafNode.ts @@ -38,14 +38,14 @@ export class LeafNode extends BaseVerkleNode { const stem = rawNode[1] // TODO: Convert the rawNode commitments to points - const commitment = rawNode[2] as unknown as Point + const commitment = rawNode[2] const c1 = rawNode[3] as unknown as Point const c2 = rawNode[4] as unknown as Point const values = rawNode.slice(5, rawNode.length) return new LeafNode({ depth, stem, values, c1, c2, commitment }) } - commit(): Point { + commit(): Uint8Array { throw new Error('Not implemented') } @@ -72,7 +72,7 @@ export class LeafNode extends BaseVerkleNode { return [ new Uint8Array([VerkleNodeType.Leaf]), this.stem, - this.commitment.bytes(), + this.commitment, this.c1.bytes(), this.c2.bytes(), ...this.values, diff --git a/packages/verkle/src/node/types.ts b/packages/verkle/src/node/types.ts index ab956271f7..4070d1e7ad 100644 --- a/packages/verkle/src/node/types.ts +++ b/packages/verkle/src/node/types.ts @@ -15,14 +15,14 @@ export interface TypedVerkleNode { export type VerkleNode = TypedVerkleNode[VerkleNodeType] export interface VerkleNodeInterface { - commit(): Point + commit(): Uint8Array hash(): any serialize(): Uint8Array } interface BaseVerkleNodeOptions { // Value of the commitment - commitment: Point + commitment: Uint8Array depth: number } @@ -32,7 +32,7 @@ interface VerkleInternalNodeOptions extends BaseVerkleNodeOptions { // Values of the child commitments before the tree is modified by inserts. // This is useful because the delta of the child commitments can be used to efficiently update the node's commitment - copyOnWrite?: Record + copyOnWrite?: Record } interface VerkleLeafNodeOptions extends BaseVerkleNodeOptions { stem: Uint8Array diff --git a/packages/verkle/src/types.ts b/packages/verkle/src/types.ts index 596b5ad0ec..63e7f18f86 100644 --- a/packages/verkle/src/types.ts +++ b/packages/verkle/src/types.ts @@ -3,6 +3,7 @@ import { utf8ToBytes } from '@ethereumjs/util' import type { VerkleNode } from './node/index.js' import type { WalkController } from './util/walkController.js' import type { DB } from '@ethereumjs/util' +import type { VerkleCrypto as VerkleFFI } from 'verkle-cryptography-wasm' // Field representation of a commitment export interface Fr {} @@ -61,6 +62,10 @@ export interface Point { export type Proof = Uint8Array[] export interface VerkleTreeOpts { + /** + * An instantiated Verkle Cryptography interface + */ + verkleCrypto: any /** * A database instance. */ @@ -116,3 +121,5 @@ export type FoundNodeFunction = ( ) => void export const ROOT_DB_KEY = utf8ToBytes('__root__') + +export type VerkleCrypto = VerkleFFI diff --git a/packages/verkle/src/util/crypto.ts b/packages/verkle/src/util/crypto.ts index ca5aa03b63..b64bfec9c6 100644 --- a/packages/verkle/src/util/crypto.ts +++ b/packages/verkle/src/util/crypto.ts @@ -1,46 +1,27 @@ import { type Address, bigIntToBytes, - bytesToHex, concatBytes, int32ToBytes, setLengthLeft, setLengthRight, } from '@ethereumjs/util' -import { pedersen_hash, verify_update } from 'rust-verkle-wasm' -import type { Point } from '../types.js' - -export function pedersenHash(input: Uint8Array): Uint8Array { - const pedersenHash = pedersen_hash(input) - - if (pedersenHash === null) { - throw new Error( - `pedersenHash: Wrong pedersenHash input: ${bytesToHex( - input - )}. This might happen if length is not correct.` - ) - } - - return pedersenHash -} - -export function verifyUpdate( - root: Uint8Array, - proof: Uint8Array, - keyValues: Map -): Uint8Array { - return verify_update(root, proof, keyValues) -} +import type { VerkleCrypto } from 'verkle-cryptography-wasm' /** * @dev Returns the 31-bytes verkle tree stem for a given address and tree index. * @dev Assumes that the verkle node width = 256 + * @param ffi The verkle ffi object from verkle-crypotography-wasm. * @param address The address to generate the tree key for. * @param treeIndex The index of the tree to generate the key for. Defaults to 0. * @return The 31-bytes verkle tree stem as a Uint8Array. */ -export function getStem(address: Address, treeIndex: number | bigint = 0): Uint8Array { +export function getStem( + ffi: VerkleCrypto, + address: Address, + treeIndex: number | bigint = 0 +): Uint8Array { const address32 = setLengthLeft(address.toBytes(), 32) let treeIndexBytes: Uint8Array @@ -50,8 +31,7 @@ export function getStem(address: Address, treeIndex: number | bigint = 0): Uint8 treeIndexBytes = setLengthRight(bigIntToBytes(BigInt(treeIndex), true).slice(0, 32), 32) } - const input = concatBytes(address32, treeIndexBytes) - const treeStem = pedersenHash(input).slice(0, 31) + const treeStem = ffi.getTreeKey(address32, treeIndexBytes, 0).slice(0, 31) return treeStem } @@ -69,13 +49,4 @@ export function getKey(stem: Uint8Array, subIndex: Uint8Array): Uint8Array { return treeKey } -export function verifyProof( - root: Uint8Array, - proof: Uint8Array, - keyValues: Map -): Uint8Array { - return verify_update(root, proof, keyValues) -} - -// TODO: Replace this by the actual value of Point().Identity() from the Go code. -export const POINT_IDENTITY = new Uint8Array(32).fill(0) as unknown as Point +export const POINT_IDENTITY = new Uint8Array(0) diff --git a/packages/verkle/src/verkleTree.ts b/packages/verkle/src/verkleTree.ts index b756262f6a..261865903d 100644 --- a/packages/verkle/src/verkleTree.ts +++ b/packages/verkle/src/verkleTree.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { KeyEncoding, Lock, ValueEncoding, equalsBytes, zeros } from '@ethereumjs/util' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' import { CheckpointDB } from './db/checkpoint.js' import { InternalNode } from './node/internalNode.js' @@ -30,6 +31,7 @@ export class VerkleTree { protected readonly _opts: VerkleTreeOptsWithDefaults = { useRootPersistence: false, cacheSize: 0, + verkleCrypto: undefined, } /** The root for an empty tree */ @@ -41,6 +43,7 @@ export class VerkleTree { protected _lock = new Lock() protected _root: Uint8Array + protected verkleCrypto: any /** * Creates a new verkle tree. * @param opts Options for instantiating the verkle tree @@ -61,6 +64,12 @@ export class VerkleTree { if (opts?.root) { this.root(opts.root) } + + if (opts === undefined || opts?.verkleCrypto === undefined) { + throw new Error('instantiated verkle cryptography option required for verkle tries') + } + + this.verkleCrypto = opts?.verkleCrypto } static async create(opts?: VerkleTreeOpts) { @@ -80,6 +89,13 @@ export class VerkleTree { } } + if (opts === undefined) { + opts = { + verkleCrypto: loadVerkleCrypto, + } + } + opts.verkleCrypto = await loadVerkleCrypto() + return new VerkleTree(opts) } @@ -425,6 +441,7 @@ export class VerkleTree { db: this._db.db.shallowCopy(), root: this.root(), cacheSize: 0, + verkleCrypto: this.verkleCrypto, }) if (includeCheckpoints && this.hasCheckpoints()) { tree._db.setCheckpoints(this._db.checkpoints) diff --git a/packages/verkle/test/crypto.spec.ts b/packages/verkle/test/crypto.spec.ts index b1448edac2..604fd82d22 100644 --- a/packages/verkle/test/crypto.spec.ts +++ b/packages/verkle/test/crypto.spec.ts @@ -1,20 +1,28 @@ import { Address, bytesToHex } from '@ethereumjs/util' -import { assert, describe, it } from 'vitest' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' +import { assert, beforeAll, describe, it } from 'vitest' import { getStem } from '../src/index.js' +import type { VerkleCrypto } from '../src/index.js' + describe('Verkle cryptographic helpers', () => { - it('getStem(): returns the expected stems', async () => { + let verkle: VerkleCrypto + beforeAll(async () => { + verkle = await loadVerkleCrypto() + }) + + it('getStem(): returns the expected stems', () => { // Empty address assert.equal( - bytesToHex(getStem(Address.fromString('0x0000000000000000000000000000000000000000'))), - '0xbf101a6e1c8e83c11bd203a582c7981b91097ec55cbd344ce09005c1f26d19' + bytesToHex(getStem(verkle, Address.fromString('0x0000000000000000000000000000000000000000'))), + '0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332' ) // Non-empty address assert.equal( - bytesToHex(getStem(Address.fromString('0x71562b71999873DB5b286dF957af199Ec94617f7'))), - '0x274cde18dd9dbb04caf16ad5ee969c19fe6ca764d5688b5e1d419f4ac6cd16' + bytesToHex(getStem(verkle, Address.fromString('0x71562b71999873DB5b286dF957af199Ec94617f7'))), + '0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466' ) }) }) diff --git a/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts b/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts index da89540ca5..de9722e3fb 100644 --- a/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts +++ b/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts @@ -2,18 +2,23 @@ import { Block } from '@ethereumjs/block' import { Common, Hardfork } from '@ethereumjs/common' import { EVM } from '@ethereumjs/evm' import { StatelessVerkleStateManager } from '@ethereumjs/statemanager' +import { TransactionFactory } from '@ethereumjs/tx' +import { hexToBytes } from '@ethereumjs/util' import { describe, it } from 'vitest' import * as verkleBlockJSON from '../../../../statemanager/test/testdata/verkleKaustinenBlock.json' import { VM } from '../../../src' const customChainParams = { name: 'custom', chainId: 69420, networkId: 678 } -const common = Common.custom(customChainParams, { hardfork: Hardfork.Cancun, eips: [6800] }) -const block = Block.fromBlockData(verkleBlockJSON, { common }) +const common = Common.custom(customChainParams, { hardfork: Hardfork.Cancun, eips: [4895, 6800] }) +const decodedTxs = verkleBlockJSON.transactions.map((tx) => + TransactionFactory.fromSerializedData(hexToBytes(tx)) +) +const block = Block.fromBlockData({ ...verkleBlockJSON, transactions: decodedTxs }, { common }) describe('EIP 6800 tests', () => { it('successfully run transactions statelessly using the block witness', async () => { - const verkleStateManager = new StatelessVerkleStateManager({ common }) + const verkleStateManager = await StatelessVerkleStateManager.create({ common }) const evm = await EVM.create({ common, stateManager: verkleStateManager }) const vm = await VM.create({ common,