From 7bb751f9cf1b5fdde95297049e3407ce23d56ac6 Mon Sep 17 00:00:00 2001 From: Xi Lin Date: Wed, 31 Jul 2024 13:03:56 +0800 Subject: [PATCH] feat: v3 codec (#4) --- .env.example | 1 + hardhat-test/L1MessageQueue.spec.ts | 305 +--- hardhat-test/ScrollChain.blob.spec.ts | 149 -- .../ScrollChainV3CodecUpgrade.spec.ts | 228 +++ hardhat-test/ZkEvmVerifierV1.spec.ts | 6 +- hardhat-test/ZkEvmVerifierV2.spec.ts | 155 ++ hardhat-test/testdata/batch.commit.txt | 932 ++++++++++++ hardhat-test/testdata/batch.finalize.txt | 998 +++++++++++++ .../plonk-verifier/v0.12.0-rc.2_pi.data | Bin 0 -> 416 bytes .../plonk-verifier/v0.12.0-rc.2_proof.data | Bin 0 -> 2144 bytes .../plonk-verifier/v0.12.0-rc.3_pi.data | Bin 0 -> 416 bytes .../plonk-verifier/v0.12.0-rc.3_proof.data | Bin 0 -> 2144 bytes .../v0.9.8_pi.data} | Bin .../v0.9.8_proof.data} | Bin package.json | 2 +- src/L1/L1ScrollMessenger.sol | 7 + src/L1/rollup/IL1MessageQueue.sol | 25 +- src/L1/rollup/IScrollChain.sol | 54 +- src/L1/rollup/L1MessageQueue.sol | 60 +- .../L1MessageQueueWithGasPriceOracle.sol | 4 + .../rollup/MultipleVersionRollupVerifier.sol | 18 +- src/L1/rollup/ScrollChain.sol | 623 +++++--- src/libraries/codec/BatchHeaderV0Codec.sol | 8 +- src/libraries/codec/BatchHeaderV1Codec.sol | 125 +- src/libraries/codec/BatchHeaderV3Codec.sol | 67 + src/libraries/codec/ChunkCodecV0.sol | 15 +- src/libraries/codec/ChunkCodecV1.sol | 21 +- src/libraries/verifier/IRollupVerifier.sol | 12 + src/libraries/verifier/IZkEvmVerifier.sol | 9 +- src/libraries/verifier/ZkEvmVerifierV1.sol | 6 +- src/libraries/verifier/ZkEvmVerifierV2.sol | 107 ++ .../plonk_verifier_v0.12.0-rc.2.bin | Bin 0 -> 16464 bytes .../plonk_verifier_v0.12.0-rc.3.bin | Bin 0 -> 16464 bytes ...er_0.9.8.bin => plonk_verifier_v0.9.8.bin} | Bin src/mocks/ScrollChainMockBlob.sol | 109 ++ src/mocks/ScrollChainMockFinalize.sol | 98 +- src/test/L1CustomERC20Gateway.t.sol | 2 + src/test/L1ERC1155Gateway.t.sol | 4 + src/test/L1ERC721Gateway.t.sol | 4 + src/test/L1ETHGateway.t.sol | 2 + src/test/L1GatewayTestBase.t.sol | 26 +- src/test/L1MessageQueue.t.sol | 628 ++++++++ src/test/L1ScrollMessengerTest.t.sol | 6 + src/test/L1StandardERC20Gateway.t.sol | 2 + src/test/L1WETHGateway.t.sol | 2 + src/test/ScrollChain.t.sol | 1257 ++++++++++++++--- src/test/lido/L1LidoGateway.t.sol | 2 + src/test/mocks/MockRollupVerifier.sol | 8 + src/test/mocks/MockZkEvmVerifier.sol | 11 +- yarn.lock | 121 +- 50 files changed, 5092 insertions(+), 1127 deletions(-) delete mode 100644 hardhat-test/ScrollChain.blob.spec.ts create mode 100644 hardhat-test/ScrollChainV3CodecUpgrade.spec.ts create mode 100644 hardhat-test/ZkEvmVerifierV2.spec.ts create mode 100644 hardhat-test/testdata/batch.commit.txt create mode 100644 hardhat-test/testdata/batch.finalize.txt create mode 100644 hardhat-test/testdata/plonk-verifier/v0.12.0-rc.2_pi.data create mode 100644 hardhat-test/testdata/plonk-verifier/v0.12.0-rc.2_proof.data create mode 100644 hardhat-test/testdata/plonk-verifier/v0.12.0-rc.3_pi.data create mode 100644 hardhat-test/testdata/plonk-verifier/v0.12.0-rc.3_proof.data rename hardhat-test/testdata/{plonk_verifier_0.9.8_pi.data => plonk-verifier/v0.9.8_pi.data} (100%) rename hardhat-test/testdata/{plonk_verifier_0.9.8_proof.data => plonk-verifier/v0.9.8_proof.data} (100%) create mode 100644 src/libraries/codec/BatchHeaderV3Codec.sol create mode 100644 src/libraries/verifier/ZkEvmVerifierV2.sol create mode 100644 src/libraries/verifier/plonk-verifier/plonk_verifier_v0.12.0-rc.2.bin create mode 100644 src/libraries/verifier/plonk-verifier/plonk_verifier_v0.12.0-rc.3.bin rename src/libraries/verifier/plonk-verifier/{plonk_verifier_0.9.8.bin => plonk_verifier_v0.9.8.bin} (100%) create mode 100644 src/mocks/ScrollChainMockBlob.sol create mode 100644 src/test/L1MessageQueue.t.sol diff --git a/.env.example b/.env.example index 49e95ed..2ce666b 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,7 @@ ### NOTE: DO NOT USE THIS FILE IF USING TESTNET'S .ENV ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 +MAINNET_FORK_RPC= RINKEBY_RPC=https://eth-rinkeby.alchemyapi.io/v2/ SCROLL_L1_RPC=https://prealpha.scroll.io/l1 SCROLL_L2_RPC=https://prealpha.scroll.io/l2 diff --git a/hardhat-test/L1MessageQueue.spec.ts b/hardhat-test/L1MessageQueue.spec.ts index 33109a2..a400410 100644 --- a/hardhat-test/L1MessageQueue.spec.ts +++ b/hardhat-test/L1MessageQueue.spec.ts @@ -5,25 +5,13 @@ import { expect } from "chai"; import { ethers } from "hardhat"; import { L1MessageQueue, L2GasPriceOracle } from "../typechain"; -import { - MaxUint256, - ZeroAddress, - concat, - encodeRlp, - getAddress, - hexlify, - keccak256, - randomBytes, - toBeHex, - toBigInt, -} from "ethers"; +import { MaxUint256, ZeroAddress, concat, encodeRlp, hexlify, keccak256, randomBytes, toBeHex } from "ethers"; describe("L1MessageQueue", async () => { let deployer: HardhatEthersSigner; let scrollChain: HardhatEthersSigner; let messenger: HardhatEthersSigner; let gateway: HardhatEthersSigner; - let signer: HardhatEthersSigner; let oracle: L2GasPriceOracle; let queue: L1MessageQueue; @@ -37,7 +25,7 @@ describe("L1MessageQueue", async () => { }; beforeEach(async () => { - [deployer, scrollChain, messenger, gateway, signer] = await ethers.getSigners(); + [deployer, scrollChain, messenger, gateway] = await ethers.getSigners(); const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); const admin = await ProxyAdmin.deploy(); @@ -62,51 +50,7 @@ describe("L1MessageQueue", async () => { await queue.initialize(messenger.address, scrollChain.address, ZeroAddress, oracle.getAddress(), 10000000); }); - context("auth", async () => { - it("should initialize correctly", async () => { - expect(await queue.owner()).to.eq(deployer.address); - expect(await queue.messenger()).to.eq(messenger.address); - expect(await queue.scrollChain()).to.eq(scrollChain.address); - expect(await queue.enforcedTxGateway()).to.eq(gateway.address); - expect(await queue.gasOracle()).to.eq(await oracle.getAddress()); - expect(await queue.maxGasLimit()).to.eq(10000000); - }); - - it("should revert, when initialize again", async () => { - await expect(queue.initialize(ZeroAddress, ZeroAddress, ZeroAddress, ZeroAddress, 0)).to.revertedWith( - "Initializable: contract is already initialized" - ); - }); - - context("#updateGasOracle", async () => { - it("should revert, when non-owner call", async () => { - await expect(queue.connect(signer).updateGasOracle(ZeroAddress)).to.revertedWith( - "Ownable: caller is not the owner" - ); - }); - - it("should succeed", async () => { - expect(await queue.gasOracle()).to.eq(await oracle.getAddress()); - await expect(queue.updateGasOracle(deployer.address)) - .to.emit(queue, "UpdateGasOracle") - .withArgs(await oracle.getAddress(), deployer.address); - expect(await queue.gasOracle()).to.eq(deployer.address); - }); - }); - - context("#updateMaxGasLimit", async () => { - it("should revert, when non-owner call", async () => { - await expect(queue.connect(signer).updateMaxGasLimit(0)).to.revertedWith("Ownable: caller is not the owner"); - }); - - it("should succeed", async () => { - expect(await queue.maxGasLimit()).to.eq(10000000); - await expect(queue.updateMaxGasLimit(0)).to.emit(queue, "UpdateMaxGasLimit").withArgs(10000000, 0); - expect(await queue.maxGasLimit()).to.eq(0); - }); - }); - }); - + // other functions are tested in `src/test/L1MessageQueue.t.sol` context("#computeTransactionHash", async () => { it("should succeed", async () => { const sender = "0xb2a70fab1a45b1b9be443b6567849a1702bc1232"; @@ -147,247 +91,4 @@ describe("L1MessageQueue", async () => { } }); }); - - context("#appendCrossDomainMessage", async () => { - it("should revert, when non-messenger call", async () => { - await expect(queue.connect(signer).appendCrossDomainMessage(ZeroAddress, 0, "0x")).to.revertedWith( - "Only callable by the L1ScrollMessenger" - ); - }); - - it("should revert, when exceed maxGasLimit", async () => { - await expect(queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 10000001, "0x")).to.revertedWith( - "Gas limit must not exceed maxGasLimit" - ); - }); - - it("should revert, when below intrinsic gas", async () => { - await expect(queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 0, "0x")).to.revertedWith( - "Insufficient gas limit, must be above intrinsic gas" - ); - }); - - it("should succeed", async () => { - expect(await queue.nextCrossDomainMessageIndex()).to.eq(0n); - const sender = getAddress( - toBeHex((toBigInt(messenger.address) + toBigInt("0x1111000000000000000000000000000000001111")) % 2n ** 160n) - .slice(2) - .padStart(40, "0") - ); - const hash = await queue.computeTransactionHash(sender, 0, 0, signer.address, 100000, "0x01"); - await expect(queue.connect(messenger).appendCrossDomainMessage(signer.address, 100000, "0x01")) - .to.emit(queue, "QueueTransaction") - .withArgs(sender, signer.address, 0, 0, 100000, "0x01"); - expect(await queue.nextCrossDomainMessageIndex()).to.eq(1n); - expect(await queue.getCrossDomainMessage(0)).to.eq(hash); - }); - }); - - context("#appendEnforcedTransaction", async () => { - it("should revert, when non-gateway call", async () => { - await expect( - queue.connect(signer).appendEnforcedTransaction(signer.address, ZeroAddress, 0, 0, "0x") - ).to.revertedWith("Only callable by the EnforcedTxGateway"); - }); - - it("should revert, when sender is not EOA", async () => { - await expect( - queue.connect(gateway).appendEnforcedTransaction(queue.getAddress(), ZeroAddress, 0, 0, "0x") - ).to.revertedWith("only EOA"); - }); - - it("should revert, when exceed maxGasLimit", async () => { - await expect( - queue.connect(gateway).appendEnforcedTransaction(signer.address, ZeroAddress, 0, 10000001, "0x") - ).to.revertedWith("Gas limit must not exceed maxGasLimit"); - }); - - it("should revert, when below intrinsic gas", async () => { - await expect( - queue.connect(gateway).appendEnforcedTransaction(signer.address, ZeroAddress, 0, 0, "0x") - ).to.revertedWith("Insufficient gas limit, must be above intrinsic gas"); - }); - - it("should succeed", async () => { - expect(await queue.nextCrossDomainMessageIndex()).to.eq(0n); - const sender = signer.address; - const hash = await queue.computeTransactionHash(sender, 0, 200, signer.address, 100000, "0x01"); - await expect( - queue.connect(gateway).appendEnforcedTransaction(signer.address, signer.address, 200, 100000, "0x01") - ) - .to.emit(queue, "QueueTransaction") - .withArgs(sender, signer.address, 200, 0, 100000, "0x01"); - expect(await queue.nextCrossDomainMessageIndex()).to.eq(1n); - expect(await queue.getCrossDomainMessage(0)).to.eq(hash); - }); - }); - - context("#popCrossDomainMessage", async () => { - it("should revert, when non-scrollChain call", async () => { - await expect(queue.connect(signer).popCrossDomainMessage(0, 0, 0)).to.revertedWith( - "Only callable by the ScrollChain" - ); - }); - - it("should revert, when pop too many messages", async () => { - await expect(queue.connect(scrollChain).popCrossDomainMessage(0, 257, 0)).to.revertedWith( - "pop too many messages" - ); - }); - - it("should revert, when start index mismatch", async () => { - await expect(queue.connect(scrollChain).popCrossDomainMessage(1, 256, 0)).to.revertedWith("start index mismatch"); - }); - - it("should succeed", async () => { - // append 512 messages - for (let i = 0; i < 256 * 2; i++) { - await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); - } - - // pop 50 messages with no skip - await expect(queue.connect(scrollChain).popCrossDomainMessage(0, 50, 0)) - .to.emit(queue, "DequeueTransaction") - .withArgs(0, 50, 0); - for (let i = 0; i < 50; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(false); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - expect(await queue.pendingQueueIndex()).to.eq(50); - - // pop 10 messages all skip - await expect(queue.connect(scrollChain).popCrossDomainMessage(50, 10, 1023)) - .to.emit(queue, "DequeueTransaction") - .withArgs(50, 10, 1023); - expect(await queue.pendingQueueIndex()).to.eq(60); - for (let i = 50; i < 60; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(true); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - - // pop 20 messages, skip first 5 - await expect(queue.connect(scrollChain).popCrossDomainMessage(60, 20, 31)) - .to.emit(queue, "DequeueTransaction") - .withArgs(60, 20, 31); - expect(await queue.pendingQueueIndex()).to.eq(80); - for (let i = 60; i < 65; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(true); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - for (let i = 65; i < 80; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(false); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - - // pop 256 messages with random skip - const bitmap = toBigInt("0x496525059c3f33758d17030403e45afe067b8a0ae1317cda0487fd2932cbea1a"); - const tx = await queue.connect(scrollChain).popCrossDomainMessage(80, 256, bitmap); - await expect(tx).to.emit(queue, "DequeueTransaction").withArgs(80, 256, bitmap); - console.log("gas used:", (await tx.wait())!.gasUsed.toString()); - for (let i = 80; i < 80 + 256; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(((bitmap >> toBigInt(i - 80)) & 1n) === 1n); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - }); - - // @note skip this random benchmark tests - for (const count1 of [1, 2, 128, 129, 256]) { - for (const count2 of [1, 2, 128, 129, 256]) { - for (const count3 of [1, 2, 128, 129, 256]) { - it.skip(`should succeed on random tests, pop three times each with ${count1} ${count2} ${count3} msgs`, async () => { - // append count1 + count2 + count3 messages - for (let i = 0; i < count1 + count2 + count3; i++) { - await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); - } - - // first pop `count1` messages - const bitmap1 = toBigInt(randomBytes(32)); - let tx = await queue.connect(scrollChain).popCrossDomainMessage(0, count1, bitmap1); - await expect(tx) - .to.emit(queue, "DequeueTransaction") - .withArgs(0, count1, bitmap1 & ((1n << toBigInt(count1)) - 1n)); - for (let i = 0; i < count1; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(((bitmap1 >> toBigInt(i)) & 1n) === 1n); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - - // then pop `count2` messages - const bitmap2 = toBigInt(randomBytes(32)); - tx = await queue.connect(scrollChain).popCrossDomainMessage(count1, count2, bitmap2); - await expect(tx) - .to.emit(queue, "DequeueTransaction") - .withArgs(count1, count2, bitmap2 & ((1n << toBigInt(count2)) - 1n)); - for (let i = 0; i < count2; i++) { - expect(await queue.isMessageSkipped(i + count1)).to.eq(((bitmap2 >> toBigInt(i)) & 1n) === 1n); - expect(await queue.isMessageDropped(i + count1)).to.eq(false); - } - - // last pop `count3` messages - const bitmap3 = toBigInt(randomBytes(32)); - tx = await queue.connect(scrollChain).popCrossDomainMessage(count1 + count2, count3, bitmap3); - await expect(tx) - .to.emit(queue, "DequeueTransaction") - .withArgs(count1 + count2, count3, bitmap3 & ((1n << toBigInt(count3)) - 1n)); - for (let i = 0; i < count3; i++) { - expect(await queue.isMessageSkipped(i + count1 + count2)).to.eq(((bitmap3 >> toBigInt(i)) & 1n) === 1n); - expect(await queue.isMessageDropped(i + count1 + count2)).to.eq(false); - } - }); - } - } - } - }); - - context("#dropCrossDomainMessage", async () => { - it("should revert, when non-messenger call", async () => { - await expect(queue.connect(signer).dropCrossDomainMessage(0)).to.revertedWith( - "Only callable by the L1ScrollMessenger" - ); - }); - - it("should revert, when drop non-skipped message", async () => { - // append 10 messages - for (let i = 0; i < 10; i++) { - await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); - } - // pop 5 messages with no skip - await expect(queue.connect(scrollChain).popCrossDomainMessage(0, 5, 0)) - .to.emit(queue, "DequeueTransaction") - .withArgs(0, 5, 0); - for (let i = 0; i < 5; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(false); - expect(await queue.isMessageDropped(i)).to.eq(false); - } - expect(await queue.pendingQueueIndex()).to.eq(5); - - for (let i = 0; i < 5; i++) { - await expect(queue.connect(messenger).dropCrossDomainMessage(i)).to.revertedWith("drop non-skipped message"); - } - - // drop pending message - for (let i = 6; i < 10; i++) { - await expect(queue.connect(messenger).dropCrossDomainMessage(i)).to.revertedWith("cannot drop pending message"); - } - }); - - it("should succeed", async () => { - // append 10 messages - for (let i = 0; i < 10; i++) { - await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); - } - // pop 10 messages, all skipped - await expect(queue.connect(scrollChain).popCrossDomainMessage(0, 10, 0x3ff)) - .to.emit(queue, "DequeueTransaction") - .withArgs(0, 10, 0x3ff); - - for (let i = 0; i < 10; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(true); - expect(await queue.isMessageDropped(i)).to.eq(false); - await expect(queue.connect(messenger).dropCrossDomainMessage(i)).to.emit(queue, "DropTransaction").withArgs(i); - await expect(queue.connect(messenger).dropCrossDomainMessage(i)).to.revertedWith("message already dropped"); - expect(await queue.isMessageSkipped(i)).to.eq(true); - expect(await queue.isMessageDropped(i)).to.eq(true); - } - }); - }); }); diff --git a/hardhat-test/ScrollChain.blob.spec.ts b/hardhat-test/ScrollChain.blob.spec.ts deleted file mode 100644 index 4f6689c..0000000 --- a/hardhat-test/ScrollChain.blob.spec.ts +++ /dev/null @@ -1,149 +0,0 @@ -/* eslint-disable node/no-unpublished-import */ -/* eslint-disable node/no-missing-import */ -import { ZeroAddress } from "ethers"; -import { ethers } from "hardhat"; - -import { ScrollChain, L1MessageQueue } from "../typechain"; -import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; -import { randomBytes } from "crypto"; -import { expect } from "chai"; - -describe("ScrollChain.blob", async () => { - let deployer: HardhatEthersSigner; - let signer: HardhatEthersSigner; - - let queue: L1MessageQueue; - let chain: ScrollChain; - - beforeEach(async () => { - [deployer, signer] = await ethers.getSigners(); - - const EmptyContract = await ethers.getContractFactory("EmptyContract", deployer); - const empty = await EmptyContract.deploy(); - - const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); - const admin = await ProxyAdmin.deploy(); - - const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); - const queueProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); - const chainProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); - - const L1MessageQueue = await ethers.getContractFactory("L1MessageQueue", deployer); - const queueImpl = await L1MessageQueue.deploy(deployer.address, chainProxy.getAddress(), deployer.address); - await admin.upgrade(queueProxy.getAddress(), queueImpl.getAddress()); - - const ScrollChain = await ethers.getContractFactory("ScrollChain", deployer); - const chainImpl = await ScrollChain.deploy(0, queueProxy.getAddress(), deployer.address); - await admin.upgrade(chainProxy.getAddress(), chainImpl.getAddress()); - - queue = await ethers.getContractAt("L1MessageQueue", await queueProxy.getAddress(), deployer); - chain = await ethers.getContractAt("ScrollChain", await chainProxy.getAddress(), deployer); - - await chain.initialize(queue.getAddress(), ZeroAddress, 100); - await chain.addSequencer(deployer.address); - await chain.addProver(deployer.address); - await queue.initialize(deployer.address, chain.getAddress(), deployer.address, deployer.address, 10000000); - }); - - context("commit batch", async () => { - let batchHeader0: Uint8Array; - - beforeEach(async () => { - // import 10 L1 messages - for (let i = 0; i < 10; i++) { - queue.appendCrossDomainMessage(deployer.address, 1000000, "0x"); - } - - // import genesis batch first - batchHeader0 = new Uint8Array(89); - batchHeader0[25] = 1; - await chain.importGenesisBatch(batchHeader0, randomBytes(32)); - }); - - it("should revert when caller is not sequencer", async () => { - await expect(chain.connect(signer).commitBatch(1, batchHeader0, [], "0x")).to.revertedWithCustomError( - chain, - "ErrorCallerIsNotSequencer" - ); - }); - - it("should revert when batch is empty", async () => { - await expect(chain.commitBatch(1, batchHeader0, [], "0x")).to.revertedWithCustomError(chain, "ErrorBatchIsEmpty"); - }); - - it("should revert when batch header length too small", async () => { - const header = new Uint8Array(120); - header[0] = 1; - await expect(chain.commitBatch(1, header, ["0x"], "0x")).to.revertedWithCustomError( - chain, - "ErrorBatchHeaderLengthTooSmall" - ); - }); - - it("should revert when wrong bitmap length", async () => { - const header = new Uint8Array(122); - header[0] = 1; - await expect(chain.commitBatch(1, header, ["0x"], "0x")).to.revertedWithCustomError( - chain, - "ErrorIncorrectBitmapLength" - ); - }); - - it("should revert when incorrect parent batch hash", async () => { - batchHeader0[25] = 2; - await expect(chain.commitBatch(1, batchHeader0, ["0x"], "0x")).to.revertedWithCustomError( - chain, - "ErrorIncorrectBatchHash" - ); - batchHeader0[25] = 1; - }); - - it("should revert when ErrorNoBlobFound", async () => { - await expect(chain.commitBatch(1, batchHeader0, ["0x"], "0x")).to.revertedWithCustomError( - chain, - "ErrorNoBlobFound" - ); - }); - - /* Hardhat doesn't have support for EIP4844 yet. - const makeTransaction = async (data: string, value: bigint, blobVersionedHashes: Array) => { - const tx = new Transaction(); - tx.type = 3; - tx.to = await chain.getAddress(); - tx.data = data; - tx.nonce = await deployer.getNonce(); - tx.gasLimit = 1000000; - tx.maxPriorityFeePerGas = (await ethers.provider.getFeeData()).maxPriorityFeePerGas; - tx.maxFeePerGas = (await ethers.provider.getFeeData()).maxFeePerGas; - tx.value = value; - tx.chainId = (await ethers.provider.getNetwork()).chainId; - tx.maxFeePerBlobGas = ethers.parseUnits("1", "gwei"); - tx.blobVersionedHashes = blobVersionedHashes; - return tx; - }; - - it("should revert when ErrorFoundMultipleBlob", async () => { - const data = chain.interface.encodeFunctionData("commitBatch", [1, batchHeader0, ["0x"], "0x"]); - const tx = await makeTransaction(data, 0n, [ZeroHash, ZeroHash]); - const signature = await deployer.signMessage(tx.unsignedHash); - tx.signature = Signature.from(signature); - const r = await ethers.provider.broadcastTransaction(tx.serialized); - await expect(r).to.revertedWithCustomError(chain, "ErrorFoundMultipleBlob"); - }); - - it("should revert when ErrorNoBlockInChunk", async () => {}); - - it("should revert when ErrorIncorrectChunkLength", async () => {}); - - it("should revert when ErrorLastL1MessageSkipped", async () => {}); - - it("should revert when ErrorNumTxsLessThanNumL1Msgs", async () => {}); - - it("should revert when ErrorTooManyTxsInOneChunk", async () => {}); - - it("should revert when ErrorIncorrectBitmapLength", async () => {}); - - it("should succeed", async () => {}); - */ - }); -}); diff --git a/hardhat-test/ScrollChainV3CodecUpgrade.spec.ts b/hardhat-test/ScrollChainV3CodecUpgrade.spec.ts new file mode 100644 index 0000000..ecee8d4 --- /dev/null +++ b/hardhat-test/ScrollChainV3CodecUpgrade.spec.ts @@ -0,0 +1,228 @@ +/* eslint-disable node/no-missing-import */ +/* eslint-disable node/no-unpublished-import */ +import * as fs from "fs"; +import { expect } from "chai"; +import { ZeroAddress, toQuantity } from "ethers"; +import { ethers, network } from "hardhat"; + +const Deployer = "0x0A47CeC6657570831AE93db36367656e5597C310"; +const ScrollOwner = "0x798576400F7D662961BA15C6b3F3d813447a26a6"; +const MESSENGER = "0x6774Bcbd5ceCeF1336b5300fb5186a12DDD8b367"; +const MESSAGE_QUEUE = "0x0d7E906BD9cAFa154b048cFa766Cc1E54E39AF9B"; +const SCROLL_CHAIN = "0xa13BAF47339d63B743e7Da8741db5456DAc1E556"; +const COMMITTER = "0xcF2898225ED05Be911D3709d9417e86E0b4Cfc8f"; +const FINALIZER = "0x356483dC32B004f32Ea0Ce58F7F88879886e9074"; + +// random real mainnet batches to test compatibility of committing and finalizing +// to run this tests, you need to config `MAINNET_FORK_RPC` in `.env` file and change `it.skip` to `it`. +describe("ScrollChainV3CodecUpgrade.spec", async () => { + const mockETHBalance = async (account: string, balance: bigint) => { + await network.provider.send("hardhat_setBalance", [account, toQuantity(balance)]); + expect(await ethers.provider.getBalance(account)).to.eq(balance); + }; + + const genCommit = async (batch: { index: number; batch_hash: string; commit_tx: string }) => { + it.skip("should succeed to commit batch: " + batch.index, async () => { + const provider = new ethers.JsonRpcProvider("https://rpc.ankr.com/eth"); + const originalTx = await provider.getTransaction(batch.commit_tx); + const originalReceipt = await provider.getTransactionReceipt(batch.commit_tx); + + await network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + jsonRpcUrl: process.env.MAINNET_FORK_RPC!, + blockNumber: originalReceipt!.blockNumber - 1, + }, + }, + ], + }); + await network.provider.request({ + method: "hardhat_impersonateAccount", + params: [Deployer], + }); + await network.provider.request({ + method: "hardhat_impersonateAccount", + params: [ScrollOwner], + }); + await network.provider.request({ + method: "hardhat_impersonateAccount", + params: [COMMITTER], + }); + + const deployer = await ethers.getSigner(Deployer); + const owner = await ethers.getSigner(ScrollOwner); + const committer = await ethers.getSigner(COMMITTER); + await mockETHBalance(committer.address, ethers.parseEther("100")); + await mockETHBalance(deployer.address, ethers.parseEther("100")); + await mockETHBalance(owner.address, ethers.parseEther("100")); + + const ScrollChainMockBlob = await ethers.getContractFactory("ScrollChainMockBlob", deployer); + const L1MessageQueueWithGasPriceOracle = await ethers.getContractFactory( + "L1MessageQueueWithGasPriceOracle", + deployer + ); + const MultipleVersionRollupVerifier = await ethers.getContractFactory("MultipleVersionRollupVerifier", deployer); + + const verifier = await MultipleVersionRollupVerifier.deploy( + [0, 1, 2], + [ + "0x585DfaD7bF4099E011D185E266907A8ab60DAD2D", + "0x4b289E4A5331bAFBc6cCb2F10C39B8EDceCDb247", + "0x63FB51C55d9605a75F8872C80De260a00fACfaA2", + ] + ); + const queueImpl = await L1MessageQueueWithGasPriceOracle.deploy( + MESSENGER, + SCROLL_CHAIN, + "0x72CAcBcfDe2d1e19122F8A36a4d6676cd39d7A5d" + ); + const chainImpl = await ScrollChainMockBlob.deploy(534352, MESSAGE_QUEUE, verifier.getAddress()); + + const admin = await ethers.getContractAt("ProxyAdmin", "0xEB803eb3F501998126bf37bB823646Ed3D59d072", deployer); + await admin.connect(owner).upgrade(SCROLL_CHAIN, chainImpl.getAddress()); + await admin.connect(owner).upgrade(MESSAGE_QUEUE, queueImpl.getAddress()); + + const queue = await ethers.getContractAt("L1MessageQueueWithGasPriceOracle", MESSAGE_QUEUE, deployer); + if ((await queue.whitelistChecker()) === ZeroAddress) { + await queue.initializeV2(); + } + await queue.initializeV3(); + const chain = await ethers.getContractAt("ScrollChainMockBlob", SCROLL_CHAIN, deployer); + + if (originalTx!.blobVersionedHashes) { + await chain.setBlobVersionedHash(originalTx!.blobVersionedHashes[0]); + } + + const tx = await committer.sendTransaction({ + to: SCROLL_CHAIN, + data: originalTx!.data, + }); + await expect(tx).emit(chain, "CommitBatch").withArgs(batch.index, batch.batch_hash); + expect(await chain.committedBatches(batch.index)).to.eq(batch.batch_hash); + const r = await tx.wait(); + console.log( + "Fork At Block:", + originalReceipt!.blockNumber - 1, + `OriginalGasUsed[${originalReceipt?.gasUsed}]`, + `NowGasUsed[${r?.gasUsed}]` + ); + }); + }; + + const genFinalize = async (batch: { index: number; batch_hash: string; finalize_tx: string }) => { + it.skip("should succeed to finalize batch: " + batch.index, async () => { + const provider = new ethers.JsonRpcProvider("https://rpc.ankr.com/eth"); + const originalTx = await provider.getTransaction(batch.finalize_tx); + const originalReceipt = await provider.getTransactionReceipt(batch.finalize_tx); + + await network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + jsonRpcUrl: process.env.MAINNET_FORK_RPC!, + blockNumber: originalReceipt!.blockNumber - 1, + }, + }, + ], + }); + await network.provider.request({ + method: "hardhat_impersonateAccount", + params: [Deployer], + }); + await network.provider.request({ + method: "hardhat_impersonateAccount", + params: [ScrollOwner], + }); + await network.provider.request({ + method: "hardhat_impersonateAccount", + params: [FINALIZER], + }); + + const deployer = await ethers.getSigner(Deployer); + const owner = await ethers.getSigner(ScrollOwner); + const finalizer = await ethers.getSigner(FINALIZER); + await mockETHBalance(finalizer.address, ethers.parseEther("100")); + await mockETHBalance(deployer.address, ethers.parseEther("100")); + await mockETHBalance(owner.address, ethers.parseEther("100")); + + const ScrollChainMockBlob = await ethers.getContractFactory("ScrollChainMockBlob", deployer); + const L1MessageQueueWithGasPriceOracle = await ethers.getContractFactory( + "L1MessageQueueWithGasPriceOracle", + deployer + ); + const MultipleVersionRollupVerifier = await ethers.getContractFactory("MultipleVersionRollupVerifier", deployer); + + const verifier = await MultipleVersionRollupVerifier.deploy( + [0, 1, 2], + [ + "0x585DfaD7bF4099E011D185E266907A8ab60DAD2D", + "0x4b289E4A5331bAFBc6cCb2F10C39B8EDceCDb247", + "0x63FB51C55d9605a75F8872C80De260a00fACfaA2", + ] + ); + const queueImpl = await L1MessageQueueWithGasPriceOracle.deploy( + MESSENGER, + SCROLL_CHAIN, + "0x72CAcBcfDe2d1e19122F8A36a4d6676cd39d7A5d" + ); + const chainImpl = await ScrollChainMockBlob.deploy(534352, MESSAGE_QUEUE, verifier.getAddress()); + + const admin = await ethers.getContractAt("ProxyAdmin", "0xEB803eb3F501998126bf37bB823646Ed3D59d072", deployer); + await admin.connect(owner).upgrade(SCROLL_CHAIN, chainImpl.getAddress()); + await admin.connect(owner).upgrade(MESSAGE_QUEUE, queueImpl.getAddress()); + + const queue = await ethers.getContractAt("L1MessageQueueWithGasPriceOracle", MESSAGE_QUEUE, deployer); + if ((await queue.whitelistChecker()) === ZeroAddress) { + await queue.initializeV2(); + } + await queue.initializeV3(); + const chain = await ethers.getContractAt("ScrollChainMockBlob", SCROLL_CHAIN, deployer); + + if (originalTx!.blobVersionedHashes) { + await chain.setBlobVersionedHash(originalTx!.blobVersionedHashes[0]); + } + + expect(await chain.lastFinalizedBatchIndex()).to.eq(batch.index - 1); + const tx = await finalizer.sendTransaction({ + to: SCROLL_CHAIN, + data: originalTx!.data, + }); + await expect(tx).emit(chain, "FinalizeBatch"); + expect(await chain.lastFinalizedBatchIndex()).to.eq(batch.index); + const r = await tx.wait(); + console.log( + "Fork At Block:", + originalReceipt!.blockNumber - 1, + `OriginalGasUsed[${originalReceipt?.gasUsed}]`, + `NowGasUsed[${r?.gasUsed}]` + ); + }); + }; + + context("commit batches", async () => { + const batches = fs.readFileSync("./hardhat-test/testdata/batch.commit.txt").toString().split("\n"); + for (const batchStr of batches) { + const batch: { + index: number; + batch_hash: string; + commit_tx: string; + } = JSON.parse(batchStr); + genCommit(batch); + } + }); + + context("finalize batches", async () => { + const batches = fs.readFileSync("./hardhat-test/testdata/batch.finalize.txt").toString().split("\n"); + for (const batchStr of batches) { + const batch: { + index: number; + batch_hash: string; + finalize_tx: string; + } = JSON.parse(batchStr); + genFinalize(batch); + } + }); +}); diff --git a/hardhat-test/ZkEvmVerifierV1.spec.ts b/hardhat-test/ZkEvmVerifierV1.spec.ts index ec523e2..4b56474 100644 --- a/hardhat-test/ZkEvmVerifierV1.spec.ts +++ b/hardhat-test/ZkEvmVerifierV1.spec.ts @@ -16,7 +16,7 @@ describe("ZkEvmVerifierV1", async () => { beforeEach(async () => { [deployer] = await ethers.getSigners(); - const bytecode = hexlify(fs.readFileSync("./src/libraries/verifier/plonk-verifier/plonk_verifier_0.9.8.bin")); + const bytecode = hexlify(fs.readFileSync("./src/libraries/verifier/plonk-verifier/plonk_verifier_v0.9.8.bin")); const tx = await deployer.sendTransaction({ data: bytecode }); const receipt = await tx.wait(); @@ -25,8 +25,8 @@ describe("ZkEvmVerifierV1", async () => { }); it("should succeed", async () => { - const proof = hexlify(fs.readFileSync("./hardhat-test/testdata/plonk_verifier_0.9.8_proof.data")); - const instances = fs.readFileSync("./hardhat-test/testdata/plonk_verifier_0.9.8_pi.data"); + const proof = hexlify(fs.readFileSync("./hardhat-test/testdata/plonk-verifier/v0.9.8_proof.data")); + const instances = fs.readFileSync("./hardhat-test/testdata/plonk-verifier/v0.9.8_pi.data"); const publicInputHash = new Uint8Array(32); for (let i = 0; i < 32; i++) { diff --git a/hardhat-test/ZkEvmVerifierV2.spec.ts b/hardhat-test/ZkEvmVerifierV2.spec.ts new file mode 100644 index 0000000..f493fdf --- /dev/null +++ b/hardhat-test/ZkEvmVerifierV2.spec.ts @@ -0,0 +1,155 @@ +/* eslint-disable node/no-unpublished-import */ +/* eslint-disable node/no-missing-import */ +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; +import { expect } from "chai"; +import { hexlify } from "ethers"; +import fs from "fs"; +import { ethers } from "hardhat"; + +import { ScrollChainMockBlob, ZkEvmVerifierV2 } from "../typechain"; + +describe("ZkEvmVerifierV2", async () => { + let deployer: HardhatEthersSigner; + + let zkEvmVerifier: ZkEvmVerifierV2; + let chain: ScrollChainMockBlob; + + const genPublicInputs = (instances: Buffer): Uint8Array => { + // build public inputs + const publicInputs = new Uint8Array(172); + publicInputs.fill(0); + // layer2ChainId, last 8 bytes of instances[0x120:0x140] + for (let i = 0; i < 8; ++i) { + publicInputs[i] = instances[0x140 - (8 - i)]; + } + // numBatches, last 4 bytes of instances[0x180:0x1a0] + 1 + let numBatches = Number(hexlify(instances.subarray(0x180, 0x1a0))) + 1; + for (let i = 3; i >= 0; --i) { + publicInputs[8 + i] = numBatches % 256; + numBatches = Math.floor(numBatches / 256); + } + // prevStateRoot, concat(last 16 bytes of instances[0x20:0x40], last 16 bytes of instances[0x40:0x60]) + for (let i = 0; i < 16; ++i) { + publicInputs[12 + i] = instances[0x40 - (16 - i)]; + publicInputs[12 + 16 + i] = instances[0x60 - (16 - i)]; + } + // prevBatchHash, concat(last 16 bytes of instances[0x60:0x80], last 16 bytes of instances[0x80:0xa0]) + for (let i = 0; i < 16; ++i) { + publicInputs[44 + i] = instances[0x80 - (16 - i)]; + publicInputs[44 + 16 + i] = instances[0xa0 - (16 - i)]; + } + // postStateRoot, concat(last 16 bytes of instances[0xa0:0xc0], last 16 bytes of instances[0xc0:0xe0]) + for (let i = 0; i < 16; ++i) { + publicInputs[76 + i] = instances[0xc0 - (16 - i)]; + publicInputs[76 + 16 + i] = instances[0xe0 - (16 - i)]; + } + // batchHash, concat(last 16 bytes of instances[0xe0:0x100], last 16 bytes of instances[0x100:0x120]) + for (let i = 0; i < 16; ++i) { + publicInputs[108 + i] = instances[0x100 - (16 - i)]; + publicInputs[108 + 16 + i] = instances[0x120 - (16 - i)]; + } + // withdrawRoot, concat(last 16 bytes of instances[0x140:0x160], last 16 bytes of instances[0x160:0x180]) + for (let i = 0; i < 16; ++i) { + publicInputs[140 + i] = instances[0x160 - (16 - i)]; + publicInputs[140 + 16 + i] = instances[0x180 - (16 - i)]; + } + return publicInputs; + }; + + const doTest = async (version: string) => { + context("test with version:" + version, async () => { + let instances: Buffer; + let publicInputs: Uint8Array; + + beforeEach(async () => { + [deployer] = await ethers.getSigners(); + + const bytecode = hexlify( + fs.readFileSync(`./src/libraries/verifier/plonk-verifier/plonk_verifier_${version}.bin`) + ); + const tx = await deployer.sendTransaction({ data: bytecode }); + const receipt = await tx.wait(); + + instances = fs.readFileSync(`./hardhat-test/testdata/plonk-verifier/${version}_pi.data`); + publicInputs = genPublicInputs(instances); + const verifierDigest = hexlify(instances.subarray(0x0, 0x20)); + const layer2ChainId = hexlify(publicInputs.subarray(0, 8)); + + console.log("verifierDigest:", verifierDigest, "layer2ChainId:", BigInt(layer2ChainId)); + const ZkEvmVerifierV2 = await ethers.getContractFactory("ZkEvmVerifierV2", deployer); + zkEvmVerifier = await ZkEvmVerifierV2.deploy(receipt!.contractAddress!, verifierDigest); + + const MultipleVersionRollupVerifier = await ethers.getContractFactory( + "MultipleVersionRollupVerifier", + deployer + ); + const verifier = await MultipleVersionRollupVerifier.deploy([3], [await zkEvmVerifier.getAddress()]); + + const EmptyContract = await ethers.getContractFactory("EmptyContract", deployer); + const empty = await EmptyContract.deploy(); + + const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); + const admin = await ProxyAdmin.deploy(); + + const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const chainProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); + + const ScrollChainMockBlob = await ethers.getContractFactory("ScrollChainMockBlob", deployer); + const chainImpl = await ScrollChainMockBlob.deploy(layer2ChainId, deployer.address, verifier.getAddress()); + await admin.upgrade(chainProxy.getAddress(), chainImpl.getAddress()); + + chain = await ethers.getContractAt("ScrollChainMockBlob", await chainProxy.getAddress(), deployer); + await chain.initialize(deployer.address, deployer.address, 100); + await chain.addProver(deployer.address); + }); + + it("should succeed when direct call ZkEvmVerifierV2", async () => { + const proof = hexlify(fs.readFileSync(`./hardhat-test/testdata/plonk-verifier/${version}_proof.data`)); + + // verify ok + const unsignedTx = await zkEvmVerifier.verify.populateTransaction(proof, publicInputs); + const tx = await deployer.sendTransaction(unsignedTx); + const receipt = await tx.wait(); + console.log("Gas Usage:", receipt?.gasUsed); + + // verify failed + await expect(zkEvmVerifier.verify(proof, publicInputs.reverse())).to.reverted; + }); + + it("should succeed when call through ScrollChain", async () => { + const proof = hexlify(fs.readFileSync(`./hardhat-test/testdata/plonk-verifier/${version}_proof.data`)); + + const lastFinalizedBatchIndex = 1; + const numBatches = Number(BigInt(hexlify(publicInputs.subarray(8, 12)))); + const batchIndex = lastFinalizedBatchIndex + numBatches; + const prevStateRoot = hexlify(publicInputs.subarray(12, 44)); + const prevBatchHash = hexlify(publicInputs.subarray(44, 76)); + const postStateRoot = hexlify(publicInputs.subarray(76, 108)); + const batchHash = hexlify(publicInputs.subarray(108, 140)); + const withdrawRoot = hexlify(publicInputs.subarray(140, 172)); + + await chain.setOverrideBatchHashCheck(true); + await chain.setLastFinalizedBatchIndex(lastFinalizedBatchIndex); + await chain.setFinalizedStateRoots(lastFinalizedBatchIndex, prevStateRoot); + await chain.setCommittedBatches(lastFinalizedBatchIndex, prevBatchHash); + await chain.setCommittedBatches(batchIndex, batchHash); + + const header = new Uint8Array(193); + header[0] = 3; // version 3 + let value = batchIndex; + for (let i = 8; i >= 1; --i) { + header[i] = value % 256; + value = Math.floor(value / 256); + } + // verify ok + const tx = await chain.finalizeBundleWithProof(header, postStateRoot, withdrawRoot, proof); + const receipt = await tx.wait(); + console.log("Gas Usage:", receipt?.gasUsed); + }); + }); + }; + + for (const version of ["v0.12.0-rc.2", "v0.12.0-rc.3"]) { + await doTest(version); + } +}); diff --git a/hardhat-test/testdata/batch.commit.txt b/hardhat-test/testdata/batch.commit.txt new file mode 100644 index 0000000..026e86d --- /dev/null +++ b/hardhat-test/testdata/batch.commit.txt @@ -0,0 +1,932 @@ +{"index": 1423, "batch_hash": "0xfe5392fbaa1c59120fa1e8b0db5d4e81166a7e2d31d40fc24337ac5c17264b43", "commit_tx": "0xf9b87e4e94c1d7db0288b33de1f4f4b47038e534596c31f72e33dd58c65f2fa7"} +{"index": 1424, "batch_hash": "0xe2ba38b055ed3a06a0a5ce4a407c707f9639b2f4013dd4859f884d8fcf7e8be8", "commit_tx": "0x9b7154d3d15236de86d829a623b59874fae54cc890c4a82471fed79a0abf0ac4"} +{"index": 1425, "batch_hash": "0x1b2673aff110ed2b571f2a976da5531f8c5f749396a20d7e5afabe3c8544db29", "commit_tx": "0xa1cd2540e59d65d37b3ad16879bf432094fb13c3817c0f8b22fe9b4975f9e463"} +{"index": 1426, "batch_hash": "0x7d9dd949f6e8cb6e23f7872f3f27de9e49b2c529c5ee81f599b6737cec5e8fcd", "commit_tx": "0xd20dc8f09d5b8a2f2804a7be171d81073e1701da9a8bcb77167e71a613e96a4b"} +{"index": 1427, "batch_hash": "0x58dcd62bea5ef21801e3e21d86a608b63e069451deacbd68d5b1b2e066724ec1", "commit_tx": "0xf227621e1a92c684aeeef641473342e79692d027852bc063ff21559c6cf9480e"} +{"index": 1428, "batch_hash": "0x05c3d03c5329ffa300bf7a5bb86ac8a1c8998a8bce78cc3086b602b4fe9bc5d9", "commit_tx": "0xaa12f6a82ebb27f10663a31f4a537766855d30b5b2cee82b1830e514ce106caa"} +{"index": 1429, "batch_hash": "0x939e9b1c4c3171f084d4d8b15b8105412be6a8e4be3bde13caa3a4451a55a15a", "commit_tx": "0x3d1ca5aba3fe09d9b93aec55464577a301b722eddf2e772af443c55976797f2a"} +{"index": 1430, "batch_hash": "0x13e0ce8d5ed6fd0e347fd5378fc38526ede2aedec31ab2d79d061eeffe168e5b", "commit_tx": "0xe83c44c807e4ba5f67047fffa43b199a7c8428eba9ec99e72cb515e6a660cc37"} +{"index": 1431, "batch_hash": "0xce459f19c1d48ed41176b440711627ed34539f5deabd0a3af39d2154b5732c59", "commit_tx": "0x07311a0d4e83c871dd0c684915fb9b3cc237dc45533bc48336ce55bbf458310a"} +{"index": 1432, "batch_hash": "0xd5955d9c995f0e0dedcf943261ef30c2cdb3557625b0b51921f934265a43878c", "commit_tx": "0xe23ac42a9f201cc282c6e8396ee9012a5b0e22109344ffc47e9bb006d44ebdfc"} +{"index": 4973, "batch_hash": "0x02e364adf62c46bb5bdfd14f1e3a76b7df0c46043a4f0ab1d39cdeca62036fd6", "commit_tx": "0x25c63b54bb3951b74fdb5921d2da195c60622c3d3ca7205e2080b46fd71e81b9"} +{"index": 4974, "batch_hash": "0x2d29367a6ff1163c3274dd049c114e310018e72434ddaa64cd18f03c1bba74c6", "commit_tx": "0x2a0bcb5e24f2376776c3c57e98db2156360ecd3a8f00ad01865d89d9cec7a674"} +{"index": 4975, "batch_hash": "0x21b0c8d15ff75192e6900cb9f6dc98b8bc7cf08a1dee9ad93b05e9291fd286bf", "commit_tx": "0x8fcd7f9a9174acce16f65ad89f4f6c45f6d9f41b656d20d30d1e2b3588d781d1"} +{"index": 4976, "batch_hash": "0xe488f400ad7114ee5589c342cc766de036b9c9106edf2e73a3f0d1eeb72d00b2", "commit_tx": "0x1fff0a64e0b438ba304f1503489e4f50afaf1ce0def42ceb9441d126f8444bc9"} +{"index": 4977, "batch_hash": "0xf22760864cf4385eea5508e98a0948c3bf1f8b557cb142fe2bf25a56babd4aa9", "commit_tx": "0x665503ec23bb4fb2ae2e3a19671d070aea8ac45438cda2043e6cb0db629be7e5"} +{"index": 4978, "batch_hash": "0x460b97b5218b5b5f29e277994a795e707b2e61827a4dafe3db56125237956458", "commit_tx": "0x174b78bd8d063362028b24ad25557e5b3baeeb43454b846f9a3d2c562c6b40fd"} +{"index": 4979, "batch_hash": "0x04cf9e678572c913671a4a14573e01f232f34cf20de1d457b9d49abbec8bb8ad", "commit_tx": "0x9ecaaa2ef084c4d4b23c27395a0a8c283f43209ed90f9444a3fb425480f0cb54"} +{"index": 4980, "batch_hash": "0x6942e13077e2ab3c72e5b9d780bfbfc04baa7be8788407fbd7dbce6b32c29c16", "commit_tx": "0x514108c04761ddded00cc8c4b85d2013eaca8bb6d3946a277e2e7010c80a139c"} +{"index": 4981, "batch_hash": "0x89ffd65f9750145a72c36cf47a5925a1d86191c61cda1af31f55cd81dd61d7d4", "commit_tx": "0x51bfdc94c4a5be340bd488fe1a2483de01f4f51579a8c16df64170212f29cf37"} +{"index": 4982, "batch_hash": "0xf0536f932de0ee8972074a82c145c240da1385cadc7da447ece900ba4a73c59d", "commit_tx": "0x4c03a865d654fa8c9995c6221b368de8619ae649672bfb084ae93f272e665bc8"} +{"index": 7213, "batch_hash": "0x0402403d7778e65444552ed664efc69c9fef3516d5b76e9d6d38ca1efaf88b16", "commit_tx": "0xd64deec8ba3283a38c32f8a2e1f7fae9561c9db04eefad0b0c540ecdb801028f"} +{"index": 7214, "batch_hash": "0x46c23f856cc8099068e68010b5bb1a45c4f20548fde93a89981c6ef6c1f4fd1b", "commit_tx": "0x95a3e8d0aea81f59ad4d6b56b49036ada42a48df79672b38f7d6ca645635de39"} +{"index": 7215, "batch_hash": "0x93f32b737145d2108938d1bdf5cf28b4010e5993d0ad236cf43246cd9f168d19", "commit_tx": "0x39f00182e83573e0a98eb2bd9a0a6099428b005f12736f6b08c1549ff7fc4f4a"} +{"index": 7216, "batch_hash": "0x5a560043df82735487c38545762b1c0484d43324759e03b23b1b9717ef3f4993", "commit_tx": "0x455e46d7ce046931e9536d3e5058084c2480f2eeac3a7630e70b5a16a3803c2b"} +{"index": 7217, "batch_hash": "0x1451aff1ff25810af38c7f9682acda708bbb23b5f97a91c8897191c7d3cbca58", "commit_tx": "0xdc316ccbdfc93c11dbce73b913fe4977a66a6527210aa533631e61ac0d4b449a"} +{"index": 7218, "batch_hash": "0x5eefb3f4a384e0d9ce6ee34ecb878c97f593d130eb75cd82e620068cad064fb2", "commit_tx": "0xb9307081e84d5c9fbe375d0c0ece523979e17b9e0fb785273b56934a6bc8a812"} +{"index": 7219, "batch_hash": "0x49ae2778c4b11b17248b73b131c38d88b2d47752cc0e8670155af0e8cdb772b3", "commit_tx": "0xf0123ddbf6d7089e8b021edfab3bcbcd29051bac6e1586f8d14bb60c34494234"} +{"index": 7220, "batch_hash": "0x6f9389feeb18049664ddc411dd8bb1fa5689e4011c479e4def3a2eafa71cc489", "commit_tx": "0xfee9b23dc3925e977b481c81b0aa797f83769caaf9c98676d0fc1e20a2b331be"} +{"index": 7221, "batch_hash": "0x53e0c474a3e027604f4c00f9a749be6a255749b6277e50a62639d4c3007f1a44", "commit_tx": "0x024833a34ff2cc45064456dab954e4fa2390808a29e86cb5dd0ade14920d119a"} +{"index": 7222, "batch_hash": "0x134dd22870dc393bec2077e2982be8d36f75d2ae1bb29efb03d35ad039fdd521", "commit_tx": "0x7c763975bf3041f6e4c9904b5949e0a807181e7a35adbde7f7fb602ad31f0775"} +{"index": 8163, "batch_hash": "0x94d5670ddedba9a379160c05ddbe472749c13c48e249a778fb25f0cba5f010b8", "commit_tx": "0x71268722f9c1189a4bb98504d3b4defcf655efa0c5e24141e700148f94a91be8"} +{"index": 8164, "batch_hash": "0xe58d292935bc5ae6950730053258ef188c45d587a576ea355bef1d86fd298824", "commit_tx": "0x772ca8ce645cd2619d1bfd93690ee482a037b60ec69a1d694354a76aa4e43d64"} +{"index": 8165, "batch_hash": "0x4edfb0a1b6a688e722204118c6425e6a2db19e6f0d9d3a00c6084d0a3e096818", "commit_tx": "0xffa698106f8e9f1b7e48cd6794658ecfe74e04f721e9cb31f96ffc1bab4e3cd0"} +{"index": 8166, "batch_hash": "0xd11c772d65c98731b611e148975d188c948e4ac0410539c2d87e00d58af4dbcc", "commit_tx": "0xe260b2564a21587d004b2778c245cd1e0b3b6335db64a14c1509c299d93d6351"} +{"index": 8167, "batch_hash": "0x7610490b56463b07d08dd050ea7431b922cdf040959d37beb7fbb4628b8352f4", "commit_tx": "0xa7087582612d01c218009c4c434367ededc03a8224933e68b7870474586ab0ad"} +{"index": 8168, "batch_hash": "0x7d2826cac66aae3833ec863546ae888e77afcf2d7b3793474d7868843ab7e0a6", "commit_tx": "0x663fe23c4211734cff75eb38a6514a93aeb4ab6d46f7a3e4c5343fd4ffe4afd3"} +{"index": 8169, "batch_hash": "0x23d5929bbca52de2625bc6b858fff0a770d94dec298ef25cfa053a975266f4ed", "commit_tx": "0xe8ab944541d3181b14572fcf1d899572fb49e21a85fa14b13c8b917d02630162"} +{"index": 8170, "batch_hash": "0x4628ee676ef28fdf8d85fa279d912b2e732bcb6d69d1d37d034cb4eb08e7719a", "commit_tx": "0xe4bc74e26ead0711dd0f4a7acfc38aaac16876bac190b8be8473a5ed62035785"} +{"index": 8171, "batch_hash": "0x244ef1acfb070aa5a493362acc8b77ec5a6d7e0673a1b093e0970f2cc67d6a95", "commit_tx": "0xa5ade37e69807a4bfa0fcd2f0ca32ff09aa3399da7e28b6f75c98d5d3f5322d7"} +{"index": 8172, "batch_hash": "0xa780f2815a61e6ce468026fa14fd36fd145a1d7e1e9a18961c0b4aa4c36119bb", "commit_tx": "0xa064bfd57801a4800c1b3dd26fc7023885d832cccc7a280addba525a3f5c12e2"} +{"index": 13063, "batch_hash": "0xc122486669ba8824a33546d04c9f1fc35447b1a534e4622d41a6ff476a242bc7", "commit_tx": "0x8d137f3b86298e3acc42daf51dae8adc916cbc2c30dc5d3b5ef8f19a2720ec50"} +{"index": 13064, "batch_hash": "0x928335191d050c8cb0de72ba5b140ac7af8aded594d48c946ddf4ba5b7ffdc8c", "commit_tx": "0x00197b67daf776d95bcedd83b02ae498588badd84abbe59cea0d445fd19075b8"} +{"index": 13065, "batch_hash": "0x391009026fd1dad0b4748129390501667a171217eb981e642ef07e49adb3a5aa", "commit_tx": "0x939e27c78014f52784a32477e0d6f9cbed0f87a8523b0772a343c06309f3d940"} +{"index": 13066, "batch_hash": "0xa39f8880c4985aabd0006570c116246d9d52d8e77498fa5b1ea8352c77fa9a53", "commit_tx": "0x242e5a30eaf9dec572bfb0ab3f05d8fb1e9560135fc1154b8aab6465dcd5d861"} +{"index": 13067, "batch_hash": "0x7a3356d8156e3d5ee32c9b623f0d67b0c9e772a5734837d7404026865ee1420b", "commit_tx": "0x3f8f5804d2763f5a5359b9741af496cfa1515c3e695298e1c75ccb7d1322a362"} +{"index": 13068, "batch_hash": "0xac0f79b37f87e0fe24d7ba3b43abeb2115858d9c6b64807d2da9426902b571ee", "commit_tx": "0x40ea04e07a3ca04e085a32e513d47a79cdfb0471eb6de4e186dc2680bbb2127a"} +{"index": 13069, "batch_hash": "0x28077c13bd20b86a53302f31342e1558d0098727f82fa764d5d9d94b1a7c54a4", "commit_tx": "0x343077e3f20e903762c3e008bbc479f5d831ae2fa332d14585b5093a91ebc0f0"} +{"index": 13070, "batch_hash": "0x12d5dd0e7d6d006d710d6ed73bc46a6392c39fad6ab2018c029bd4839016b9a4", "commit_tx": "0xa766a018de6da07156f667e6036e64e921788b77290066b2fa8008941822ac99"} +{"index": 13071, "batch_hash": "0x520851adb630e327b08810b64af3928491217e83196f1d715209c92eb5032925", "commit_tx": "0x73774ff03d0560fccc3af10ee0204599ed8b8b77099ab61814ee925df53a20c2"} +{"index": 13072, "batch_hash": "0x2f31221f381ac18d523613525ea40dbccea1c66f4529c080752f9e2aa0a4fbcb", "commit_tx": "0x63cf968f3e77db3adc2647af3a6fdde47cddd211d2e2b63e3498bebdce7b025e"} +{"index": 13103, "batch_hash": "0xb2c08a8fe10f307e9a0181e86ed31fa8f82c1f7119ec582d02ed3c443847decf", "commit_tx": "0x13600e43fdf5d584dcfd14309c5a74c2825bc94f5dbfc088a7b34a4810e1add1"} +{"index": 13104, "batch_hash": "0xcade6ce76b1da03335983f6a72727b991589b6daf05bc58b0312d3dcd53aa764", "commit_tx": "0xca39f341d1918223b710f8c87706153cba52e526e6a25b97419527ecfb0dcff4"} +{"index": 13105, "batch_hash": "0x1ff58287305f34e0c6b6aa173b842860dbe4e09cea1eea0d01f04448dcff8670", "commit_tx": "0xe2d47ccc9850d47eae7d9eaa02610c30826b230055c19fd3d33e64d3cbc34241"} +{"index": 13106, "batch_hash": "0x8192f414a9e4faf631689e4616c2bc932d1e16471d2c62c04f897e4297e6bf0a", "commit_tx": "0x2dc820f0a4db444bd2c3d7ef278700ebae3c391f1c7817bff19d8d18a66f74d5"} +{"index": 13107, "batch_hash": "0xe1a54eb26b05eebe5d3cb06d5df7cbffee12ef74aa93635f50f5d32f6a563910", "commit_tx": "0xd20e1065a10d0033ce905ade1783a15f4fb41013b6b2601a022b29ebc2adcb62"} +{"index": 13108, "batch_hash": "0x698bc0460ba16d55fc7bcafa0c33b688a100c8cb9acfaed32e49d78ae31a0ba9", "commit_tx": "0xd53643bde9785466f5dfeb0d4fe5f6f1ec5427a0c5580237604fb2a1ca514682"} +{"index": 13109, "batch_hash": "0xf86ef0e6738140d25bfaf4a11973607edd023d05e43b7389e479b71b9c991728", "commit_tx": "0x77783d68e4ba822fb155e5a02f60a1abb5b77a492d6e513940c96eb5d3974bfb"} +{"index": 13110, "batch_hash": "0x40b0d0e56b3d4535a5ac997cee013b284250ebc9cba36651db3ad9b01abf3d19", "commit_tx": "0x82f486217ce7ef5574d1ae20812a43106792e84a0e8f738336eaaac8e19fc38b"} +{"index": 13111, "batch_hash": "0x29152aff62e12783b7923a4146e7938650bb21ec8e1f1f673b5e987c6f93c86b", "commit_tx": "0x2b6012f0741bb6e8ddd3c5e9e910c9ce3c2d6e80f3b33eedaee6b4ccf6746218"} +{"index": 13112, "batch_hash": "0xd27b36d1d25cb593c2a439ec07d3c2439ed0d48375e54a43ffa4e5556b2baf8e", "commit_tx": "0x46ff7688acc2543350b0c4af76404669fecb4622eb866cecc20ea52ba63b6349"} +{"index": 13123, "batch_hash": "0x18dd943c03a9c8960788798eea75d93b3614c55cb1d20c988a1858e9a4d7d2e7", "commit_tx": "0x893c985b01daafbbae701bce950e5ad7cd0d678a59f5fef8b7f6a89eaa86c595"} +{"index": 13124, "batch_hash": "0x4a6a31428a43a667b502fe8696302ecc983f73a6052f980ca6cdeaace4268332", "commit_tx": "0xfd4f52ed2cad214aea7e52569400f4960e7cf2c54dca00361978767a4d8f3c59"} +{"index": 13125, "batch_hash": "0x8326dba8e47ef3c4f36cbd80d4f5d3ca365f2c1e6804c5a17f5beddcd072f54a", "commit_tx": "0xf5426b8d5138f2a6d25e195794e38c25bd03072437daadb44d86501c2f1e7da1"} +{"index": 13126, "batch_hash": "0x1ec96e1a0df0b7754ea614a8858c24fc8890a396edbabc6bdae174257f1abc2e", "commit_tx": "0x1b2a9ec0aa6af80b7ac4fa609ce22ce5e8fd1622179ff6abfa1f5337b075898f"} +{"index": 13127, "batch_hash": "0xed532341c22ecb87ac2ce80b879b7ee346f82358c62a14913b14e3a9e2ba92e0", "commit_tx": "0xe32ce21eb89f4028e41caf1540293f004be94d607936164459cf4a1d65d4da24"} +{"index": 13128, "batch_hash": "0xf8cd84bc83a3b7f795535f9f3bc9b399d874706117a3278bc6e9a10115fafdda", "commit_tx": "0x3669f9f6d955c2d3a1b503c2d3aeee20330124961d15029def88a48b609ab413"} +{"index": 13129, "batch_hash": "0xc6b486acd8155703232caa8610d6afd4e07b79d34f6ef4b7c4964ff925a86931", "commit_tx": "0xf9fb1e15305091eb3c6c1119eccc96947367c8303c7d4a23a8eb5cb14e1364f2"} +{"index": 13130, "batch_hash": "0xa4d1d86c7a47fccfe54422f1dac918a4fa64aa32e5739de49632ce55caf849b7", "commit_tx": "0xbc6f8b495479022df1594a579666a2c0c2c069c4b309d5d201effd92865bd69e"} +{"index": 13131, "batch_hash": "0x7fccba843ffe9a6b5dc8f41f9eaaf7ae66d69ebe037d25b4d91afe91056fbcc5", "commit_tx": "0x142ae0ca0bd5c2e2f4f6df9ca7981b472c9cceb3c47fbc5c6a5e5e75ddebfd49"} +{"index": 13132, "batch_hash": "0x501ff17614d9527b22fe2441422510ba8a1b995500385c97cfb6a1aa42a1bed2", "commit_tx": "0x9a628f169d82e14bc977c75ce4da17ec94c7ca06d7739d2710006ad92669e161"} +{"index": 17673, "batch_hash": "0x286c2843e77f3b28d99acb62fba0a22891dcbb93366cca266a85736fd04037cc", "commit_tx": "0xbf1a7d8a3c977b43bde7149de0f916c40969e118e9de3e41b98f5fcd01505506"} +{"index": 17674, "batch_hash": "0x45ca37dd4faad37103e9b8efafd107b23487585b0c6045a4ca7b43aa07832757", "commit_tx": "0x0a2fe73adb955e9e1d897dab9a184e6a26dba8ad9a84ec00b574f6ff4d462215"} +{"index": 17675, "batch_hash": "0x20199aaeb0650ea1d078d095745adfe5612e2ce23dfa85fba37df81b7b4b3ae9", "commit_tx": "0xc88f8c9330cc8b88049155432b99f7529f5586f14103424ed0d8e8de6e3ac91d"} +{"index": 17676, "batch_hash": "0xa3783c199cc78ebe0e28d4f42171855fba919530c3fdef7d3d683e246832f72c", "commit_tx": "0x49c8d6ded03012b87a9112dbf958c3903c73997d5c431955aa9b47113f925d98"} +{"index": 17677, "batch_hash": "0xe5603b58d6a301db299c808650a878cc151df6a325367a541e21c585c9df5237", "commit_tx": "0xf32bb834c5301406f13c9c6c091930da8453dc185afb4d50ee04fb12a76edbc4"} +{"index": 17678, "batch_hash": "0x757535f79d7875439de4ace51ce2a0cf43f22381287d8e7b9b85d83da43d22db", "commit_tx": "0xcac08fb6ee177d9d10e143adecc1417f67562c9bb8540af5feda339bf5b14122"} +{"index": 17679, "batch_hash": "0x98342e1bbb54a9bb301ec0e7f91b80d406ba94c33b6dd0b0e08648e3c9b3cc09", "commit_tx": "0x64eddd6eb5522846ae5cf084702508a18f4697a68be18bd694b9d8088db144aa"} +{"index": 17680, "batch_hash": "0xdd303461ce9eda0335b6f4b13518ca05c3e84ed3de5dca812332498a2c7e9f4b", "commit_tx": "0xa3f800d8270021524d1996e76fdabc52a6c33eb07221fe7d2c0727c69a47cd8e"} +{"index": 17681, "batch_hash": "0xcdea0698c5b56e39dc6c1dc462bb586939bc1a213c4123264681195d586e7860", "commit_tx": "0x34d348980a3434f4dbf461d2f14c03c730dec17c14210c13904c25ab8bbe3ade"} +{"index": 17682, "batch_hash": "0xe0b89bc650c502c166d289999b4f3af8ea115ce8faeb40d29dd6cf72af55c332", "commit_tx": "0xe071dcda6966ca788e255fae8aa79afd19fdf3157b63050700b90b756301cf28"} +{"index": 20013, "batch_hash": "0x474176383ccfc5140ccd9443c91e2686b374501c5f36d025b9584d23de16b07e", "commit_tx": "0x43f89673a50c4cb913c49624c8cf273b086c33c48faf98bf0519177bd80cb55c"} +{"index": 20014, "batch_hash": "0x346a41ae1fa0081f57440092b405b0dfef6048228a949d0ca8bacde98bf1f9f7", "commit_tx": "0x0d93e017ff1f1cac2d68a8ceb7ec1fe1443f6150c617d199b3f298a01f7e6399"} +{"index": 20015, "batch_hash": "0x7b971a3140f3e94047e7ab7a40631eb14d4ff0ebec0163a63c1c275a5f26e549", "commit_tx": "0x8bbc577edc7db0259a1585900d34272fdb9325e53487bd86adf007f763fde5ae"} +{"index": 20016, "batch_hash": "0x24466782a3a06b31d10e59244429bbc9adafeb7d51d082e33c1066dcf3a5d12c", "commit_tx": "0x3fde1277392cc22211226ba10510c54af8c10703c8f7e4371a12fd630371aa91"} +{"index": 20017, "batch_hash": "0xdb0c76ed807dd9982b58b34cb88c352d9a84c445b185790429c361c030ad3a0a", "commit_tx": "0x9e82a636aa1ffe924c0eba8b83a4daed87ad8ba67efe691523f0a673d0ffd0e6"} +{"index": 20018, "batch_hash": "0xdb58c5ffd1ccedec8ed0b23a81479488112d216dd44bfc9f449179e87b6e7252", "commit_tx": "0x7312c4a79bca70f03769fec2caafe310fc21a3795ce60f033d4df54d385db643"} +{"index": 20019, "batch_hash": "0x028fb14418ccda706c38d7b995c0074fc29f1fce8d31299de61345766e5e233d", "commit_tx": "0xb00f0f9122d3c35f826c7aa985871cca593fee912dabb38330508a2b2501a488"} +{"index": 20020, "batch_hash": "0xe25ad7cb9cf6144e28784cc8c9de39cfaf980b4757e15c5455900019a8d8705c", "commit_tx": "0xb76b3335895c1252b7f6bf66c765c02e60ee7bfcff164fb15e11933a03bd4a90"} +{"index": 20021, "batch_hash": "0x1608662b82581e8bd91c2fa169c15803b2b01b3c623759276f069c5ec653043b", "commit_tx": "0xfbc9afd7b8e6dd3148d521c35b77334d1fe6252c54c50bf80bc7e14890eb1695"} +{"index": 20022, "batch_hash": "0xef7c4f9edd4a0302b0c042fb0e13c2ed00040d70b39c8e9231dbfcdf5879e9d9", "commit_tx": "0xc746c865d032b298d2c4c72cd8c9fa6b2c6a6421de0293d930eda66513196c80"} +{"index": 23203, "batch_hash": "0xf6f6fa1da4b81ea06539a2ffe4da931123fa71003ad03ceb07eb5f8bd4827511", "commit_tx": "0xd7e5ad1cb57a1b5767af12722b482eb6c417cb9569f1288e1dcbccf71ad12e87"} +{"index": 23204, "batch_hash": "0x145bcf5cde901bf4d708150f73e6bd0090a39af7b6977cf0d295538469e4b850", "commit_tx": "0x52fd30c33ef9f52b96838f70c65db5acb6b663687f3209dc970dd0dd5237d4ab"} +{"index": 23205, "batch_hash": "0xedc42ea54cb2b009fdae2e7429f5329d55fde877eace27a3f4de856e7d23fb83", "commit_tx": "0x879f877b455f0c6a1133bf5e0e8de8a4ce5b2b22edbe9f31cd573f70c8b38b2d"} +{"index": 23206, "batch_hash": "0xc81cb8ee4142e13eac53f1f0f8fd41842e7f625cfdf8449b85d6f7d60d4e51e9", "commit_tx": "0x21578f821ffe1793dab9e4ea36cc0020bc7f5c11effcb316b82fc70135ca765b"} +{"index": 23207, "batch_hash": "0xe9966cecc99e71cc92b04e7d2b2e96751fa07e947ca2d62ab46672ee164684c6", "commit_tx": "0x52655a1319a315496a092475fc06206063770cd4541ca433a7bf56b031d3984b"} +{"index": 23208, "batch_hash": "0xffc1b364d0f0bd912f06d86029b312012541c8b679a300c71bd882a9fc65993c", "commit_tx": "0x9755d5067be28bb8f881b82ad76901677d538eceffe96d649a03e3d2fb67a73f"} +{"index": 23209, "batch_hash": "0x4f8d553742d99a3bf587d989e1b90ddab45c080e985418f75fde8348cda73e2d", "commit_tx": "0x7b01ba515fe1a692e9655d3928b1fea34b322c9f3e823028f23ac481b473fd96"} +{"index": 23210, "batch_hash": "0x458e45a2413f30381a2540be69ad2d7e4adc82458efb119938423b7cfe9806c4", "commit_tx": "0xc66f9ab0f41a2b1350be203fc4367bc2c25dbcd6467a8a0526749e1e4fbd6fdc"} +{"index": 23211, "batch_hash": "0xec4ae40f6e1c2bd7e4551b8095bb58f3745c968ac0a5ec1b4e1f168e109c7fe0", "commit_tx": "0x5884d0307269931cb999db7a02b765c2003a189f9d698e549df7c1cd8c0fa26f"} +{"index": 23212, "batch_hash": "0xe1b4a72392a81f42d7d60d77f4c222efffc3a59c5e024ddcc164fa5b3e210c6f", "commit_tx": "0xa92b556a5f5e6d52ff17e39e52078d8b6b1121543bb7952a0be1c0f355375b46"} +{"index": 26453, "batch_hash": "0x8a50b400181c3e36891ca1349a80aaef214b72773bf6768bb5dec3f94efa358c", "commit_tx": "0xa3cd43aef55a55c0f4ce42ec19b4de90b9ba315a71e46c12f6a70ab2f5d222f8"} +{"index": 26454, "batch_hash": "0x39fe8b8b303f27a608eedb4d6bc112dc404902830babdd3449c6535b355d5f68", "commit_tx": "0x400f95a96378902ca2ed8f34a3050f8952a4cdab8d22756a9b87b01483dba13b"} +{"index": 26455, "batch_hash": "0xc51c6c0893b50429c3b03fd36122ce63f8cba9eb762c631b51684353c18a2690", "commit_tx": "0xe1e3b1ee944e5e02082d0169125d7743692e6afa80ea4f77fde27edd28ac5e93"} +{"index": 26456, "batch_hash": "0x8095b621debe55234637efb67dca22397445955190eff021c0ff06f17abdb5bb", "commit_tx": "0xe7c3409545a8425ffc410a879cadb6150ff6c87ef0e2106f0243014fffbe7c87"} +{"index": 26457, "batch_hash": "0xb676c27e9d20c0779491532fa46aad9e1f9cdaf073cf69010c5475aec7d7b2a9", "commit_tx": "0x2fdc2327e73f934d74e23cb7db6add348f49bdebe1d88659ba9d21c90e36a2ff"} +{"index": 26458, "batch_hash": "0x265c01ad44aa5ba90dc4d617329c99c20359f03dd6b8be7cf2ae7f1df9ee71b5", "commit_tx": "0x50844b5b6a9462e6d7c4cf10e416caddb215d7f804d55ebd3e156525671b38f9"} +{"index": 26459, "batch_hash": "0x0c7229cf7570c0426dd7792ae506ebd32915822e0c83e549ef24b42a7a9f74e9", "commit_tx": "0x37e14c12c424632d0dba1f0a2aa620f80f16b717e5401b6e1bbcecf6a38b6e06"} +{"index": 26460, "batch_hash": "0x0d5f752fb15a9a886097e6774c0b8c5bf9cb8983af3217a7cdea49c61b4d5d05", "commit_tx": "0xa333c53eecc8648ce2e199f2066c9b8e7a7925fa63a60b568f46df2082bf15d6"} +{"index": 26461, "batch_hash": "0xc07b4ca0fce7052451e3fc3a81d06b32b63fc98487a0f7f781c06a5651ff4911", "commit_tx": "0xe0066d1ed692e7c57662acfe915ea42d516180767fc3d7c7e9ac49bba98d7d1a"} +{"index": 26462, "batch_hash": "0x3d7b89cd126aef2e8daf5f72b14217d6042f619042eaec869f18fcd1fc332adb", "commit_tx": "0xa7ae71a78d55df6bdf6d642e732ee5b9579b0d04f70e7e8bf9941995879e1190"} +{"index": 27953, "batch_hash": "0x3557c7d9bb251b35f82924130cba9cc2c9ac0e7fd5709c1810098a03ee4975dc", "commit_tx": "0x67a858d4412b850797712120bde0bd6942a4daca87a79dba8595e7423e20c6dc"} +{"index": 27954, "batch_hash": "0xe00f3ffd42af2664c89bb231367ddd050705d12c53127f15245a08d5ce7954d1", "commit_tx": "0xfb7de23c84f83f378907a2ec0831a5ebfce7e4c6146a4fff7e5607445d3eb96a"} +{"index": 27955, "batch_hash": "0xcff0ed0da9833757f7345f5c84dd68e9698384b2a2de1a7be72ed8f5864d278c", "commit_tx": "0xbb77bfaa724225d70a5c6617f64442e04c29eb707955ee92615d190b7aec6ca6"} +{"index": 27956, "batch_hash": "0xc1a75d8d7c7e3cbcf00444273768e0275144ab2ac204f3b3a1417c98c024bc89", "commit_tx": "0xcb7e79b7d94509757b5bc641d64deeccf0719e445153a13fd8c069a86e18c837"} +{"index": 27957, "batch_hash": "0x2267b948b046e3128c14859d48b94506b857d7952ee3b51c8aed5eeaefaf683a", "commit_tx": "0x6472049f6fac4eae97d22feea9ccc1dcf3bbd32c62660cd92f9e59e8582bdb5c"} +{"index": 27958, "batch_hash": "0x1466dda1a9f0403ffc1d2dbce97bf756d2056011812a447172d11d5f301619a1", "commit_tx": "0x75cde631d2921809a0224743fda9088b4c0b427b151b3023405f9fa52994c616"} +{"index": 27959, "batch_hash": "0xe12cb793c6afa5e838ac78db8304379212e794bb4025695eb8b3d151dddd6347", "commit_tx": "0xce46892a8a731659a1a7758443a82ed6f3f626fb8870ef81aa94db8fe0b663e4"} +{"index": 27960, "batch_hash": "0x691a16838a9a1172cc87ed2300cc60233ea7a7ed699892d87235cc375c1e66eb", "commit_tx": "0xa9bf223b0d2ebf0d131ca7e75a7e5c45349be9ac179846c52f4cb29ab701332a"} +{"index": 27961, "batch_hash": "0x5ccf97d166c8c83df4480b3acc3d9a537f1273441d30bdcc0bbde50199581fd8", "commit_tx": "0xe31e07442be70208d22bbd17fa4aef3a1905b09293075020cff434c9a2b18ec9"} +{"index": 27962, "batch_hash": "0xe166767d1f0c816586c681b5dfde9c6f7199d247d70f9acb626b29a6eb8556a3", "commit_tx": "0x56cb1a1ee1f1f2b4b12438f578e4e3551a729fd808a8643b4ad99a3581a20688"} +{"index": 28423, "batch_hash": "0xcc02e7d32a8657731e563747c6185d67ac34dc531afba852fbb6673a55652fca", "commit_tx": "0x7858f94ae4960fefe84f20be0d874ef8926ea325ca84d2037f94fc1680012def"} +{"index": 28424, "batch_hash": "0xca33b944f46d562656ffa2c88deee1bd46889dc5f473919d3aa8a5fe110372f8", "commit_tx": "0x4586bae72a97ff3eeadcfaf63adba9fb70e9c1f9938e8743c87439d4cc7cf5c3"} +{"index": 28425, "batch_hash": "0x46c97e73d6b3f70987de42210774e05619769de5c2cb9adab76c7f0d4f544e03", "commit_tx": "0xb2182cfc5a10de119d42ef208b9827fcdb706fe6f911b281bd6e3e0437bba4cf"} +{"index": 28426, "batch_hash": "0xf5b8b7195439c73f7b4d6803c9ab5ca96b89176f369f686a4edcc21d81e16180", "commit_tx": "0xf8159496988e41efc3694d7b959653a88882e7a14b2014cdb4774f95f8afdda0"} +{"index": 28427, "batch_hash": "0x2be5ef4665866d30a36eaf98b893e7175a584fa3c7f4d25753f9e46f536f0ba4", "commit_tx": "0xd92263a8cab2a305699184bdac8c3191cb96b9f0830780810d1ba7048699ec53"} +{"index": 28428, "batch_hash": "0x264a1f5f5cb7c0fd83ff3162df2d720a7476f9ae47c7e06d35268a48a0f8523d", "commit_tx": "0x1913569b084e6a4802670b18806e1450946939c1e4f821399fc6bf5684f9b791"} +{"index": 28429, "batch_hash": "0x2515c5c6a57eb321a39af97eee00fd5fbcb419e811acabe8383c6a3d99da6621", "commit_tx": "0x6d337e960c77825cbeafa3139fa193167568350ed0ba3818ffced25fea2ef681"} +{"index": 28430, "batch_hash": "0x1f98133b4547562842c540619bde9bab82cf66820532d0f58fc6caffbb963058", "commit_tx": "0xe507e37ef7aaa602b4c887bcef398b6071a1e3a7ab90bc3e8198005b889aa68b"} +{"index": 28431, "batch_hash": "0x245f8d3f13f88d957ffb01b25c2cf113080c41fd8862b804aad8bce2619005ca", "commit_tx": "0x9f65aa577c50ec0b98137e871a112192de31447df3babbab1b5c769544ab3a61"} +{"index": 28432, "batch_hash": "0xa735602e121fa8f8b0ed2714a3daeabc4d8e32b20d0c9c0a5b7e29269ff1aef6", "commit_tx": "0x7a990340b4a93ff12910b2849fe7cf13723d8ef4a9d2ae76824f4f57ddd12959"} +{"index": 29613, "batch_hash": "0x6476b5c447017911236a9be26874978cad595ed5208272e833a3d76a68a63cc2", "commit_tx": "0x5acff3c032d7534f8b64b818e147a14cbb4fe5b08178636a0c2d6c7bb0dfe9cb"} +{"index": 29614, "batch_hash": "0xedb04ee3303774d3ba11743a9c34a6c88c500b43a5446c4ee55893cda749b395", "commit_tx": "0xc5ae96387106fea91551bc4ac6f3d446a93cdbfecacedf6a7a2ad9091bf4125e"} +{"index": 29615, "batch_hash": "0x4993762937314136c05d1072045c9c0e0ecb8fd8267f27fba2937dbb91da441e", "commit_tx": "0x9a7889b7a885e8a0cf74362f4aeb182a6dc9b2238cc9aa2223c8bd581a47864c"} +{"index": 29616, "batch_hash": "0xf4dc62517a7b7557277c9fee1c54c33c367fbbe9d4d1c714bc6a40a50841aa29", "commit_tx": "0x7fb7631a1034e27dddfbe7309ff96be3e6b99b88da2dfbde8d5463ed49f364c4"} +{"index": 29617, "batch_hash": "0xf51e11d0d2c6c6276a847a1821826b573a12e2bff44ccabf4db5ece8c0289466", "commit_tx": "0x9e1b18938e58adfc7590f267440f4511fa9c83ef4b12d3e9b584e65c8d484802"} +{"index": 29618, "batch_hash": "0xfe5610172e2c28c2f22c3457065a6632977646b616ef01035f5a0025fa5fa252", "commit_tx": "0x73123a08330fdad702bc22500f3891f0a08d388335ed92010b88962a8c40a053"} +{"index": 29619, "batch_hash": "0x91ce9976e2c5a7c5a57985f75e4f346391d8e7fd97d3abdd4b90be84ff9a9c79", "commit_tx": "0xa6e6022803139aa5687a70fd604a0c9191c6dcdd1256158631d96859d7c89957"} +{"index": 29620, "batch_hash": "0x95b30519d1e82e2435da673e8ddf9923cd7722ddddd823048be74f2f060d2639", "commit_tx": "0x108286777f23b9e7d0467dc6145f695ffd8cb99beb0511c954c904897c07c714"} +{"index": 29621, "batch_hash": "0x489e7c3b85c289b13e3fd98600428282380ff34c8d6a5a08ea0db414c1970ff1", "commit_tx": "0xac390464cbd1f140121f89694ec709fbdde9c7ab99a94527cd9b3443060de008"} +{"index": 29622, "batch_hash": "0x959c7f4a3bdb6dfff828c2c78d15d088ed1594923ba7b34df8433929c9b8c0d1", "commit_tx": "0x08b6345395dc6b26746eed8d2d0ae34e86e19456631c6e64e96db67f48d6e976"} +{"index": 34303, "batch_hash": "0x27c41cfb92e41c981c7d73aa83336ab8a77003471d35f8ca2d2605346bad61db", "commit_tx": "0x654d341cca2460df653d415438af951092cabe4ebc2fd616ed67229a051ae6cf"} +{"index": 34304, "batch_hash": "0x9b75ae51649c440e72dc9218515cbcc6753d20473bc2a7e8ee047d385c3aa315", "commit_tx": "0xb852573f2efc67d15031d4f9e803e62f72e2d5bff89f298633d9ef7d72508bf7"} +{"index": 34305, "batch_hash": "0xa8959b4668432f20531c39c4db341e1c35607cdf7c40ddd89b2fa363e79b87af", "commit_tx": "0x90c79e81f4068161dd872ded999628f21b34c74bb0be5b06a6b1bb8f802bd5fb"} +{"index": 34306, "batch_hash": "0xc0fa3b4fe3db9f372836b025590740db022afb16c18f93970741b3a7c930f8c0", "commit_tx": "0x6464a702cec9364cafd01adc773783e8812715d2c8e84825cc2a58c428b7979b"} +{"index": 34307, "batch_hash": "0x321ed4a3e5cfab657fc634c9dd5ccae7d2c921a7e34ee55f641bd49d94229d8a", "commit_tx": "0x104033b9b90912ea881aa899320c1cd4b847bfa7de08cd8bc413a1b56841e293"} +{"index": 34308, "batch_hash": "0x2e2aa436f36703f09b0f579986921aa58c6b3303104c24885663243d5a2fb3e4", "commit_tx": "0xe4129abef6a283a88bd7b13513f03b5159dd080ae51b3cdf1dd91ec9e18e4a80"} +{"index": 34309, "batch_hash": "0x9a5f64125933f770e04a9ecfba842e39954e3a783092252d0f66781f03298b6e", "commit_tx": "0xe23ddb99b87bffbeaaae7afe7cf8ef5198a161a2d76d55437d6021af9c986a4f"} +{"index": 34310, "batch_hash": "0x7e40100f725c59a16b96c9fc15abaf2f35789f6d7bdc1ae32e195d04344bf546", "commit_tx": "0x6ea24abaf92f4402b903ed9131f2f9588943905320150e4643c002f7b5e15875"} +{"index": 34311, "batch_hash": "0x8cf5ce2539548b42965ba4e11bf6b25e4f17662d316ecdf6fed2fab79ef7becc", "commit_tx": "0x568b081aa533d34509ac8eee9893c7997c6cc7dabfd472d3237372cacf694743"} +{"index": 34312, "batch_hash": "0xbb3d85266d651a93fc86efb976ec8fd6877e21a145ae03d24fe6194780cc4a3b", "commit_tx": "0xc9ecce48a7a33dd98b0d816f3bd76f0f3cf86e2d31c32ec9d5a95d4f40bb708c"} +{"index": 41053, "batch_hash": "0x355e475438f8685e4acaa8e36ca4ad4a38cc37de19433c11db9efe895f167c18", "commit_tx": "0x0aede1856ca326674ff7197cceb9bcb0f9452d31fbb541823406fc0328c9d6b5"} +{"index": 41054, "batch_hash": "0xfb04bf5350495051c6759793116758a460b4ba9db6a59caefe1dcbe2db2adc97", "commit_tx": "0x2956036708c7afb7ed0c0eee43f8d3caee23bb0dcad522afc9ba910bcb3f610e"} +{"index": 41055, "batch_hash": "0x1d359b621895b284af858b87ee4124fd9d8f2ecc3efa05eb9a8788020b6caf61", "commit_tx": "0x0dc6c293538189f4ac6fbb42e8857746c63fab016ba3b47d561ca309ff49a986"} +{"index": 41056, "batch_hash": "0xa7eb778558185fb6e7bcc0f982230b8b9806d53b2bece8d3bca2429338fe24f5", "commit_tx": "0x7c86c1472d68c79d7b434969ca1c973c98e86b032cc91a7a6e8c103a285575fe"} +{"index": 41057, "batch_hash": "0x20f05217bceb4799790e8a81c678751280413b2b2d56cfa438d373c5742bd403", "commit_tx": "0x68ad4fbe161e91545cadf5d51e1ce96cdc6baf74daeee645ccca45637b21e59a"} +{"index": 41058, "batch_hash": "0x3a02e08db7aba6317fdff6ab6ebfde7fb539c47a3eddd2bb1bdfb58e499a4cd9", "commit_tx": "0x189f921c20eadf2428219a178f118d9771572e276ecc1429411c58adc9d329e1"} +{"index": 41059, "batch_hash": "0xb966c3ecf5b53756a26e0758c4d3d5dbc42893f1e704a18e4afccff455d7349f", "commit_tx": "0x1eb40feaeadda82f8c4fefe3bab7c6fa071ee7f5f9c99574dbdd9b73917988eb"} +{"index": 41060, "batch_hash": "0xb242ad562db8be5c121ca260229d70acb93118431e5d908d0d1703b7f911f01c", "commit_tx": "0x999ba869cfc19dbeecdc39344a7b89bf34be60cf6c89947bc500449cf87357a0"} +{"index": 41061, "batch_hash": "0x7c72bf8358b45b413c0a869e1c0434501c4f65ecce26faa7f7f9ac7d7e2a4e75", "commit_tx": "0xc97fc48ee9bfcc4f68d3078c9f49ddba1df5d7b51c329c7e146c83b4b929046b"} +{"index": 41062, "batch_hash": "0xb2c1485754e2c822c53fba260a446796d44d5fb87f25fffecf35a00f97d1ce44", "commit_tx": "0x7b7edcfcc29faf2ebb91f9b8ea01ebf92cd2caa231d87ab1e7ab263379830315"} +{"index": 42473, "batch_hash": "0x71f4e43eecb60f1fb1c6ef49b9152e4ad527de9d670c62ba248264b5b24f1d87", "commit_tx": "0x1e716275d8ffe118e1e878cea6f449998d7329209265441a7414ebd26ab258e4"} +{"index": 42474, "batch_hash": "0x11161af35a69677d040bbeaf4008fc5d84ca291c81e978dd212bcccd362b98fb", "commit_tx": "0xddc76ce374268cfb69318a7b678fcce2395e83ae731d7146013e74cc40d3636c"} +{"index": 42475, "batch_hash": "0x907e432a9e3966098b0fe9fa12f1579afdf56e015cba7d3daeaa9801fa7d995c", "commit_tx": "0x0815e9f37afac496a40af0a889dfcfc29734ac12c42cfa4cac647671a91bfd40"} +{"index": 42476, "batch_hash": "0x9f6ff9c852a3dc4241e66298e049c37fd316c7000315e890c00e95e9d93ef2e5", "commit_tx": "0xd2da80d619778655fba3f9431f9f17d4a59bed8193b77dd8f6f05bd6f644a142"} +{"index": 42477, "batch_hash": "0x5f6956f8321c2f1673fbc8f99d42aa7dc26fcc47b6c3e16ac603be45eecd0068", "commit_tx": "0x1b3df4f5d10a8fda58d9c74ce141cc437bf66a5f8ed9d92dca53b54de1944e25"} +{"index": 42478, "batch_hash": "0x660fe155ca33b85b007eec84863613198ac111ecc29400eee9c4c7294c256b13", "commit_tx": "0x5fbc09ba1739a848356710f64af87b8263a691078c3f10ef21d56f90325293f2"} +{"index": 42479, "batch_hash": "0x3bcf676658f4f4dfe94113cb27553241168f69419427f2124ed06342cf4a5963", "commit_tx": "0xd623c016ec2feff63435b0b75798282c5281744d77d9a3028ac4500a02578097"} +{"index": 42480, "batch_hash": "0xe2bf99ae1603b1744b9c328305b187af5d9d5964be2f034542023378f6b7da6f", "commit_tx": "0x2d3fba8b1f474a0ecefb0aa87f350c0ae6da233cb77186df29ce6351fb68b971"} +{"index": 42481, "batch_hash": "0x884f64c528facd9bf4e21193e24367e9cb88a5049db800f738662c5912196562", "commit_tx": "0x8035fb24d975fe1f02279e1712ecdb68a3e573411c59c7fe8ce9f47051696aa9"} +{"index": 42482, "batch_hash": "0x06a002c491692677b43d4bc1dd116aba992e0334267d8290884e29b5a9618184", "commit_tx": "0x7e439f0bbb8145b8dba403f2580bef1864e913fc0582dd03351208afb5cf8d93"} +{"index": 46993, "batch_hash": "0x98d915f2553ca32cda83c7957c98d0d607a3eed44bf7d740d65d6b98d1ce393d", "commit_tx": "0x8d7c7c3be4edbe8aacf4cf5e010d8cb5e68bd66cd0751f917c89ee0631a1b25c"} +{"index": 46994, "batch_hash": "0xbcd1ae02c7d275f86c0dbd37d6510aa49508b7da3843f787b218d07daef275d0", "commit_tx": "0xe51bca7caf4dd0a6433088bc03c84ffa09d8512b1e76adbd853e257394142662"} +{"index": 46995, "batch_hash": "0x90ef5944847f924bbb31f49d3aa62f4c0082b3efa5708a13c3655a2681fa10e0", "commit_tx": "0x8dc1d5f628f634566802a5423e54f05575d5aa339100a205277daf44012e94b8"} +{"index": 46996, "batch_hash": "0xd966b3fa5eb6c82f00a39d508f5fbffeca666358e7866aa6b8339b5db8d8e173", "commit_tx": "0xb9566352d19c69f807677be6c6e72da64b5d6b4cd5b5271278562794f176cb11"} +{"index": 46997, "batch_hash": "0xdf54d8778e755ac12326bc6fce6f80adf3140e7f0a574c6f299f0e1301ab249d", "commit_tx": "0xe80a63de8cacd41a1524a3ff4bf3dc591785fe4794d45bc78ecc6c5c730b0a9d"} +{"index": 46998, "batch_hash": "0x023ac50deb4873483d305fe2876c3f88c55e78a3d597de924474117de4d494a0", "commit_tx": "0xdb1cadda5bc651ac53ba50cb496999d1dab246f766fe230d0b84b152b35ea6a2"} +{"index": 46999, "batch_hash": "0xba404f0b389f88581765d85d14e2cf8a259191f5ba0e2e062dd61c401b9bee53", "commit_tx": "0x7d1ae6dc373da61e76239cc79845952434b3392713dc46d7b33752ae1767cada"} +{"index": 47000, "batch_hash": "0xe1816a29e1d4e83b4390fd6a536cdef0c6198788a25bfb962bf51954280acfe3", "commit_tx": "0xe0b5f52395b58f28f84e86944e34b2d57591acc8b7976af92a8b23c2c8eef49a"} +{"index": 47001, "batch_hash": "0xadd287470885fd82155c07cc5aefd0055942a0ea5ac51f0cdc3d5d18ccdfcbec", "commit_tx": "0x77cbfda940246d37462fdfbb1f90871da3d5561f1ac7a182ae11620af130e13f"} +{"index": 47002, "batch_hash": "0x2134f4e219baf184e58972f83abb9b5a1eeb43ab12a9ce93b8ed66913691f15e", "commit_tx": "0x7346a9d418c6449b76b29a62d53721d1ecf097955ce3e76b7894536c49516806"} +{"index": 48173, "batch_hash": "0xc93071ed5cc4be2997b5fc5359298de57d1891f541cce3e3e22f2804445b5224", "commit_tx": "0xb8fe1e48514af32b6f6566f806674e41cba2b619d9d9ecd01abd5944308ca510"} +{"index": 48174, "batch_hash": "0x3e023e32aafb1068ce4256077033d931e714a2460ad72c8fb29083e98f32de18", "commit_tx": "0x0bc7ba5437fb339b2ca15eccacf71a13498ac076c9ad4f6d165bbfb641673140"} +{"index": 48175, "batch_hash": "0x73002eb34ff2b164a83e63047fd9fb4095ec6d5f3fccbb2f3c40998d5b10ee20", "commit_tx": "0x48dbd892fd7ffaad57b0115b87efe657b0e603188e006edc96112df55a544c48"} +{"index": 48176, "batch_hash": "0xb31980b8784eba79cae3566c08cb826cc00c5e14a4cea8eb185fa2b2c77d2cde", "commit_tx": "0xcc693d662816a99775876c2d95b48d135f5a6f169eddff36f1281efdb7fb859e"} +{"index": 48177, "batch_hash": "0xb2c4322d1f5d157c9f10f86d948d349933bede66ec1ec05b4be42d29755efdcf", "commit_tx": "0xfa8dfbfad131e3915463febf42ad76985c925fad1d32e8d46fd1b6e5bfca8431"} +{"index": 48178, "batch_hash": "0x588d6d9cc14bb4c274d46dfd637fb6c3212f1b270bbaa1693ca7c4ce41b3052e", "commit_tx": "0xf683c3d505711d25ecd382f0c8859c4817d7217dd95f6b73ed39c584abd0760e"} +{"index": 48179, "batch_hash": "0x72df79a6b8caa82687d98f0ec4dac09b2862d084167bac5a235226eacee45d48", "commit_tx": "0xdcd4c62ca38f2327fbdd249afff5fa24d830c39bb3d8e8aa66a520b42fc2baa9"} +{"index": 48180, "batch_hash": "0xc19a57c9c9c55c7f1210327da8c2a0229b4bef1da906a64b751e6323e9c1d362", "commit_tx": "0x760ca4c85752d8e3a8cda817512b87ab806b52963d1c011609da3cce609e960c"} +{"index": 48181, "batch_hash": "0xdf8b3fe3a3f17e28acdfca1b639b3d941961fd906bf0381d35554d77fb11df08", "commit_tx": "0x9c6f08c12866113f232dda26921f8f74f3083a58772e09eecd789dc623041017"} +{"index": 48182, "batch_hash": "0xc7663bc156b53cbb663873ca7bde0a69f6a81d47fa2bb5104cc039f644a4c2c1", "commit_tx": "0xc091ed6fffc575603fbe386127ca202793a83af4be0a459d2142ecfc101c56fb"} +{"index": 49003, "batch_hash": "0xef973f193a375003c3788383ef58e99f91cc72bf2f81c9bda283704cb323b22c", "commit_tx": "0x6a8dd9252244b8114b40f13aeaceedcd0aa730fe74a06837dbd981cb37174978"} +{"index": 49004, "batch_hash": "0x9a184bf46134dc4c06d9602d2b88c4decb2cbae1cd76974b1fe87e744ef4804b", "commit_tx": "0x930c35af5e46f5a77b8c011d2868c7375b36aaec544cf452f06fbe47aec1f96a"} +{"index": 49005, "batch_hash": "0x735b3c5ba98acc84fe206f555b944f6c76c63ac661a2014b509aa3c14b24315b", "commit_tx": "0xb81715f148147d7378331268b318e11c68d417ece3b405748ab2ad030a7d5481"} +{"index": 49006, "batch_hash": "0x48dadf4907631c7e01e961841c306321fbd91eb687be88ca3eae4b2ca89a24f9", "commit_tx": "0x273d81c64cc84d688494609f0105e85b2b790db5b0c8b9988328f03790c01d32"} +{"index": 49007, "batch_hash": "0x49c84400e06c5eff02d7326c88142d752c088fb8bb4f79cdd18845b34f7b96f2", "commit_tx": "0xc848d754de7787f091b530b2cf0a84e4d2bc5da2c834b21f538ceae171287895"} +{"index": 49008, "batch_hash": "0xe2ef5c473eaf9d8946020f4f5e518957a8ce0d6979fe99afb7e46be6d588ba55", "commit_tx": "0x878fd4cb558c959891e59a9acbd97df9866b0e22704a22c32c3f600f2ee6b3df"} +{"index": 49009, "batch_hash": "0x0e43de61bb263361131387a25157b256d8105d1db18e0e07271f6a97652f9240", "commit_tx": "0xb65b7edf35802d57366401f7931fe65b812a07637dc0c40fab50cd9e02cf4add"} +{"index": 49010, "batch_hash": "0x2e6b5dc7a79fd667777aba32fea232da62c3d856f36bdee526fde47f54f53f10", "commit_tx": "0x4dc51bb8cc084688d3c6bdb5774812b3c4eb5ef6fe6af68b27931befbbe9c663"} +{"index": 49011, "batch_hash": "0x9e40417b2cab51e96f951a1417626c84d00cd22d054bc35b3c711e5b720841c1", "commit_tx": "0x3fd08253996c00fbd4b6c7dda468ed9ba4f82a6517084190e608272c981f09da"} +{"index": 49012, "batch_hash": "0xdcbb80ecbba36c9e908e805a6a42be19a7bbefa12faad2c54d26dd49473b1914", "commit_tx": "0x98eb0bbc06d8c692a0daec01fd7e8119e182d803be82015e1dd78729e403267c"} +{"index": 52123, "batch_hash": "0x629ea351a8a8e928112f134997914d5487cc2f7e19bdb9d5a0d92bacef9f8a34", "commit_tx": "0x4742b8a3cbe3dd683e35638be95e3019c6492ed87fc8dfcb86709fbc70d3b1d1"} +{"index": 52124, "batch_hash": "0x3dd8c7ffbd55bdcdfe2bacde951bc85d7d572360f2e7ff86187ea6c3f5d4100c", "commit_tx": "0xe5cdeecaee54da4ef26f4b36f7269700ec5530778c87b8f147160f06344b5cdd"} +{"index": 52125, "batch_hash": "0xe65684f4112a8b82ebb5d3574b3b8033e1f56f3e0e67009c9308532c45d81d0b", "commit_tx": "0xfca334e3320db2c1a7b4b023140e105901839189867c6bba1ae2c2e80e95d346"} +{"index": 52126, "batch_hash": "0x4ec2bea98badb513cd1b066d74a04dd39f689222befe543d2876f6597a168c3c", "commit_tx": "0x43b5b5304c3cfeb5430714bf9e4c1714a6cd8dcedcf79bf2a9b941471e609153"} +{"index": 52127, "batch_hash": "0xe0af84b2f57d2de9936f57650e0f2d513c92e8584b8c6694f3e3beac4ab7d59d", "commit_tx": "0xafa6d9d9055e4128adcb833fe467c10be5886d7c3572e3a41def747a88d253e7"} +{"index": 52128, "batch_hash": "0x8330e962c0c4bb074c30cc64ac53d4621b5136a5d24e913bc221e0853e997ca8", "commit_tx": "0x2c87dc43c5149afcac27f46fb5ae9024e89756cae37587f5c62969da4df6c9ad"} +{"index": 52129, "batch_hash": "0xc23fa2752edb5ef46072e735b6b90a2e1e7542d90b95cc5521428ca2427522bc", "commit_tx": "0xcf50a5f47a62c9062734a9a488b349343cc23a138c0cb1cd96845fe68e6a90fb"} +{"index": 52130, "batch_hash": "0xe56e25c42e8d6553bbe5d085a4058937961234b7a7517cf3c585897ffc1b4983", "commit_tx": "0x13ed1850dc886eafdadf791eaad4cb30193b8ff450010958d16131d4d2abe694"} +{"index": 52131, "batch_hash": "0x0b4ec9d1a44bb3ff58918e92a754966430026aa71fc4f42578a91e670e00d714", "commit_tx": "0xc1483eaf5417f2d9d4279e61e7640a2a10c2af7c2ad5f88d022a620566294ab7"} +{"index": 52132, "batch_hash": "0x86c4f3f9e4ce99e92934b498ec4dc5f000649809475add248f43c32addf1e02b", "commit_tx": "0xc444a4afb30a94b28a98f2adb5e0ebacb3c7d92ab29c08161d5f0f29ec6e5fe9"} +{"index": 54283, "batch_hash": "0x7142443e4bfeebe44766c1c292f049011e5edc0c62f6e156ea5bf92d87025ead", "commit_tx": "0xc809a88cbff53947afb0e136913af8906c297a5ee5391f85c23591f104685b8e"} +{"index": 54284, "batch_hash": "0xcc93bced2866704aa16bee7df70f2d8641073617a0a3a7ec888218c0176b02e5", "commit_tx": "0x690a54fc03912eea7e5cba901c70ba1a0bfefe030eef8e67cf8c51b309a60c45"} +{"index": 54285, "batch_hash": "0x29a68c12045ba6f02359513d5a7a39cc3f1a0221d0abbd68303c18b6b409756f", "commit_tx": "0x28077f05ca6d60c1d5613a2fc6b590fca59b07cb60b43e3aaaf5732a43a23e8a"} +{"index": 54286, "batch_hash": "0xee01de6618b7915ddfc3fb733e9a43ae0ecb1dfe43b36ec2515a26938841b997", "commit_tx": "0x0fdcdf31704788592653d9a36eb4b859146d6022b5d9c1ef97b19558a9114339"} +{"index": 54287, "batch_hash": "0xe2ef2fbc1a487698203fd5cc35e7db9f87695a2e96a5e7f1510f549affab9a95", "commit_tx": "0x5deda6c92876210b22feaaee8ae133f7bf50f4690eabf899148d9f8914fde25c"} +{"index": 54288, "batch_hash": "0xc1c6985cd02797217be6d3e8ce4e5f448cb4fa352184a8ef22ec379ef484d1b6", "commit_tx": "0x0744e30f8604ff0cbdf008855c3ec442292cb5174e375e549f1b91fb382350a7"} +{"index": 54289, "batch_hash": "0x2a89fc389a1c326e80b6ed77849c338c90376bff83e19eb64b7d72580bd1bca8", "commit_tx": "0x634571e5e3cee736f2c9d84163d185e63126fd6eb629f02344ef0fb387ebf667"} +{"index": 54290, "batch_hash": "0x376dd60abb3d75af5ce405d2ccd57f8fcff810f80f329f8f08578386381bf296", "commit_tx": "0x82ed9e947738357d277f97036792308618afd0c5ec8f95b36f94f29570564a6b"} +{"index": 54291, "batch_hash": "0xddca464d58cab421a4171e9608466acdbc3fb44bcdccc8c19fb191d53f9c3bcf", "commit_tx": "0xe3f999a67c182e32f9bd1f3e47ec705574bf4e39d7ae4737d5845d0829af7b63"} +{"index": 54292, "batch_hash": "0xa79ef83f32633cc54d4b333d55526bb0cce1af6116938ee39df33e508be94e9a", "commit_tx": "0x9c431abef9c0182b71b98ff8554d3337d9bc57a78f916d991aad9b0e8a5dc9d5"} +{"index": 57213, "batch_hash": "0x67beb9b6812289e4a398f17a05eed6e51402f4ccbcd5a3b1cf996c6db9515a10", "commit_tx": "0x3fd60db72acf16cbe8fbb53e9afc0de6ddbb72be336d7c613a05f55a7c4f0fac"} +{"index": 57214, "batch_hash": "0xaff66f68b7e753e32aab4cad1d738e5f99ec19da3ec938141f190128b81b542f", "commit_tx": "0xbf4b05497443660a4828547375077389f062017a14faadaaa2adeecdabafa530"} +{"index": 57215, "batch_hash": "0x9fb4aa35571f2bc02bffe6b8793aa917c23fc51dc028e5e389677000d7d38dba", "commit_tx": "0x818427947a655a9aa3f2423b4f82fdeec97d39aaa365a649ae4899958ea5c573"} +{"index": 57216, "batch_hash": "0x09812a44efe3203546af93728ee38bea0f83b685699b946f5858796daa058786", "commit_tx": "0xb661ec00b37b78164f7df3b67468b41699c367150d510a9bb40add7045f9aea6"} +{"index": 57217, "batch_hash": "0x63c2b1337d9ef2313fd4ebfbf662f308f3a32242fe4ffe118e3f40c23be0cbff", "commit_tx": "0xf02bdd8b8339d9bf85d2e02c2c3a8feda7aab9aa98fa22810f9a88dcee17b46c"} +{"index": 57218, "batch_hash": "0x5a88299aa88d73130b6ddfb994a271990b7c1d9b5c8ebe80ab542f4ce53f1012", "commit_tx": "0x096f74c91dfdbe6e891db484013fbc054072fac079ebbb8888f2ac721a437c90"} +{"index": 57219, "batch_hash": "0xfd5f6bccd9507542454b4f3b32adc14d70edd9b2158637aaabe16439e8f3f8e6", "commit_tx": "0xc0186bebba22a97c093e9201e12a668336decf932bb110800267fb79c577df6f"} +{"index": 57220, "batch_hash": "0x3c1883c156d2e1b0b913ce62206bcf8a4dd377b7f3853feb69f0bcea4e37e345", "commit_tx": "0x787dae327f1d7d95d91fb76842eb4d8a0a100272f4e4287315cd6dbad824d783"} +{"index": 57221, "batch_hash": "0x03b2259cc100087de5d029df4305c0129b17f4a16fef535b6e4d7af53360bb59", "commit_tx": "0x16767c26a5c3daaea262dc9b81051abf90a0ad6fe952a9fb4a7500fc07816fed"} +{"index": 57222, "batch_hash": "0x09754b608738e9f375f960a9fddd366c879bcbaf230346ec3e5c00b78cd88098", "commit_tx": "0x5b41d71380251c6e8792a7475b26c26c66b0854038db0872690c8dbe8a4462c9"} +{"index": 58283, "batch_hash": "0x41e9283c3153422d6a56716d364dc17f3a052d3e742434a59871b43df18ea485", "commit_tx": "0x4c68fc4e838feafb35871cb809cd3ea4e1254aeb4271410d47a51047e953557f"} +{"index": 58284, "batch_hash": "0x0220a3a5c2b7df95e95e3e2fb3b6e9eb79d20b60807908c30772296304c270b7", "commit_tx": "0x636b8c16150815052b0e0e38675a7b96b691482486a60ce3445aafe42751a30c"} +{"index": 58285, "batch_hash": "0x99850c14ca5e0e5b63a5967cfa08da4ece712d10936da1b3235c5a2908f967f0", "commit_tx": "0x109e1d3348b932f304579db97f51ca2cd1e7b7505ce7e7cf3400e5d24b8fd006"} +{"index": 58286, "batch_hash": "0x87ec77267f2139293aca5a88986bf88a7bb9f4668e29b266ed01727f2f351685", "commit_tx": "0xc1b9acbe1083d66895e2a6ee82b30adc5a526309e8ac72fde96a83f79efa83a3"} +{"index": 58287, "batch_hash": "0xe11fb693777bd3b6ddf95375161c3c84439ac232c1dee26cf53302ee63e44786", "commit_tx": "0x243e363042e2ba6b2d960b2a0396f7138d88202901171f006bbb6422f63974b6"} +{"index": 58288, "batch_hash": "0x76ab1fabb4384c2eca03ba5b94be72430d0f04b8a2cfac2c6f29ef682dce1b39", "commit_tx": "0x3d32e5b50b27274ecc13b603de3040c3970be4a2ee45c924f56713d9fe8cc9c1"} +{"index": 58289, "batch_hash": "0x015d56f49144f0e800b5279e24f79b8c06eb526a378f8bc2903ffa01298ee1ac", "commit_tx": "0x8305b1c3c9f26e614d5f80415dc84ac398b6185b0087a8ba0428cdcfcecdd844"} +{"index": 58290, "batch_hash": "0x0103f92b5cfc1d8e91907ed9ce9aecbcc5151bd6584d3c24d62fe10f5ecaf791", "commit_tx": "0x91a69cf76d1accd81e8c400f20ed741105d09fb90f975e1e5b29b0e55cfb9bfc"} +{"index": 58291, "batch_hash": "0x71bdc8bfb34bdf660846b6f3a90f5f560d8176a718b980a5482b1f00c243e3ef", "commit_tx": "0x3eb1fed58793257c56c0a27e9daff293ab6023cb9db82302dff048051ece2693"} +{"index": 58292, "batch_hash": "0xdbfc916f86d86b0b4f94866c4a09788bbfe034cda7631489711f665fe74815d6", "commit_tx": "0x5548ee8cc58f16f62f03a99d76845be66edfeaf51c18d4fbd5f805b9b5e08278"} +{"index": 62473, "batch_hash": "0xa6695885704cf1ce2225a96ee0ca938d8f3e5d49c1adf175a4b5c76f1a597169", "commit_tx": "0xe62a04ea73276dd3eda1994d62901bc9385c72eddb9e005e0d8d178ed8f75831"} +{"index": 62474, "batch_hash": "0xe704236ed53a4c4762e3040d6481e07dac6f3d4e29c9bb5a41dc8533598a8b5a", "commit_tx": "0x52ceede8e8911296d31a130853f5eb7ebb181eb692a75d4cde7157790d5cf52c"} +{"index": 62475, "batch_hash": "0x60d2db9088b2eaec18a710faa356c41f1be7487f51d15c57cfb6c938730a9599", "commit_tx": "0x90096c37f7727cc241724e66f524e81016c19240ddc1b741fe761fbeb9110b58"} +{"index": 62476, "batch_hash": "0xe9588443303e0297e12f4531f08b5bb18a826b88c66ede6ff4c4dde81b52d4a9", "commit_tx": "0x55fce5bf91ec737fe9db250a4027c89e3fbffacdd3a115b5816b1062756c6d04"} +{"index": 62477, "batch_hash": "0x162566d01514d9456153383d024041a34e67c438f8de03b494a9c31c3c4b3315", "commit_tx": "0x15c7f54705dca4f4952e6009cf071c29e73567750454d590900dbe1706e8e3db"} +{"index": 62478, "batch_hash": "0x962256ffc99a53e8683eb8e4c15783877dce162c74fc8774b8d7196cf4f14b95", "commit_tx": "0xbd1b21b7d96c5109b931ba61a64e1800962a92689db1b9305f07c757b17445d2"} +{"index": 62479, "batch_hash": "0x3282cdc8fcdb412248470d3bc855f144d30d0e81df7177ad9cede81e4fabe372", "commit_tx": "0x410befdf82cdd93a04d077791a149d4b332fac51fd5a641e0c059ff5d34f8735"} +{"index": 62480, "batch_hash": "0x93610055d15323588771c29edda359089c7821456638985409d7cafff3e72fc9", "commit_tx": "0xa253fdf5384ed263e5a4d655b43ce67de04dd407c76f9441c15390306c97b813"} +{"index": 62481, "batch_hash": "0x85b45e085cb4b5cb6d41f4568919168404b0fbb0aa78b37789912a8a980d3432", "commit_tx": "0x4f2cf0395f9e208ff22f7748d9273a8c19d20546238febbdf8f1327baeefa28f"} +{"index": 62482, "batch_hash": "0x1b5b826d5aeb9960790a2dfa4901ce26e620d4f602146de3a4fd7d8d4ca6a12e", "commit_tx": "0x3719f89abeb6b5cb51d42b22f2e9ec9485f839e75bfc6c68f38a7046eb03cba2"} +{"index": 64703, "batch_hash": "0xc7286b250a6684687cabd47d183531d6f88411512d115ecb17e090104ba444ad", "commit_tx": "0xf38b6bcf2712947593e555b11ea5947732aeb3494683b24e40afba4038c96a9a"} +{"index": 64704, "batch_hash": "0xbaebb4a77a1d7539a2a40f06dd93d419fb9fc20aca30af170b5fb32a6870342f", "commit_tx": "0x19043b81c6da6c8ae7cae691e72fa99321bc3394e77962d33fb15ffa06558fb5"} +{"index": 64705, "batch_hash": "0x504849a219079bde4d3d9219fed7a23f05405b1032086149c054efd24eacf5dc", "commit_tx": "0xf66605cbae5ff4dc0d195c2903dff62509203cf1efb15f48e6638f315b04ae66"} +{"index": 64706, "batch_hash": "0xbaf9d4a36e4779377b94272b82d67564cb4537fd2e54a0e3852b26a0d48875f6", "commit_tx": "0xcaf4a14393fe49cea4bc921e452ddc6d044068ef099be9a40b47d39d8abe7360"} +{"index": 64707, "batch_hash": "0xbde4a810c46186cd793fa7fe3e8814b23b8affaea71b8fd21c0c44a700ffe649", "commit_tx": "0x7a9cd8702f3a45f123daf43a48440c175802ace4c5cd4d29fe610054d6c88f26"} +{"index": 64708, "batch_hash": "0x6b92777aad8523ec8dd5b87043ee1d475d8ff5942d04976d65429a792001aa5a", "commit_tx": "0xe470dc08d4062d8f565dfb313c904a1e4b4989d6458a2fab8cb05723c394c887"} +{"index": 64709, "batch_hash": "0xf953efc21d4da1f41a795dcd5c0577a7af54338876a71690445eb1b044980215", "commit_tx": "0xa5f82a19d54ad5eb69a0ebcec7eda53d7448c6c710298901d394a87a74953505"} +{"index": 64710, "batch_hash": "0xa0c48f931c3b95c49642e83b7bb076494ae286180cb1822888bc14de882e781e", "commit_tx": "0x35b39e62ca43e9174da7e42dec3c3c698f0ae957c6693665443dc0d3ce72a231"} +{"index": 64711, "batch_hash": "0x96bc36044f4fd41f62ee144b9ffa19b39870ed7741a90574658dd90afcc50636", "commit_tx": "0x3239ab52fa197f44a1b924c1c7a12714dcaf216aac98d9905c53c1649ddb4ad8"} +{"index": 64712, "batch_hash": "0x0e3975ad1725cf413bd7abe73e7d8269ddb8676df91812ca57522c619d16600f", "commit_tx": "0x43cec28e5b9785788df3fb8b957cded75dd8493ed6df669c3c97a259b911c5ea"} +{"index": 68993, "batch_hash": "0xd0b6aed754a2dc0b9615dc97b698e7ae646c21834a408d792db480a575593601", "commit_tx": "0x78d702267972030c3bf3700b7552018f632b627c1400ce455533e4b215bc4b89"} +{"index": 68994, "batch_hash": "0x6a6fe1f9e3f5a6e74c2a0fdce37fc09649ed515ce0cf5bc98d1c3233a9cf8413", "commit_tx": "0x06da05856099222fa3c681b0f354f90419a45985f7f0013a83d7e4d6dccb2418"} +{"index": 68995, "batch_hash": "0xfad10f17db34285ae17a0991faf304e95506e520a06f1b450da0fef02e389378", "commit_tx": "0x2f030261f3cf99928cd0ad337c63b4f0b6e9d6ed74c7d05a3fef6dc316038977"} +{"index": 68996, "batch_hash": "0x1efce44bc37251d7a56f923d25100063c2c3199669b4743763e610fc3ac51eb3", "commit_tx": "0x850ec46db2da526a1b5ff33b4deff6797aa2c855a749c62b3ee79f0f121390c3"} +{"index": 68997, "batch_hash": "0x3a4de1317dbab22d03d7e81fea555ad8ab70cd36fcc45ae7fd72cc22cb89e4de", "commit_tx": "0x8d0a5d24c278ea1627683d4358842fdbe47ed62a0bfa70847e5bd83134d6f22d"} +{"index": 68998, "batch_hash": "0xf631379d79fef7623be41a47feb5ddc62960beda283233f5850bee3952226412", "commit_tx": "0xa5863a6b676afb884d3b70152186d95f0820e1f808e8e5391820792cb9030956"} +{"index": 68999, "batch_hash": "0x407b6be0f799e422a26c14471638faf8b381b4ced6aed466398a359da4b6db5a", "commit_tx": "0x318a22d64795e90c746842589175e16a367d6cff2c2840ed8329ef7f366ecc09"} +{"index": 69000, "batch_hash": "0x30c4dc9c157faa12f8e0a7adf2ab9001439df3c3d058cda242fdd8f4e19bb931", "commit_tx": "0xaff62ef2ae1388484abcdc283dc85d1f3d272e395eb7a044a868e383bbab4ddb"} +{"index": 69001, "batch_hash": "0xe0283d1f31ed36f82a2d4db25fa9c288df54e5d12b6509861063a19ff304c5a4", "commit_tx": "0x824ce1c294c8d3590f23326c982ee107b573cecb01b61eae8884f1a15fb3b8f3"} +{"index": 69002, "batch_hash": "0xa72f9f60d14543bf72a314a58a1060339ca7d5ab36b163ad0d9330d96bd286a1", "commit_tx": "0x71ad3f91186358811f24bc6279171e4d0ab85432ab35689e5b55fc9b5b25e8ab"} +{"index": 70123, "batch_hash": "0x6285b78d5aea488e4be7199df01a108ed1f132751cef0bfd5a9711dafb92fffa", "commit_tx": "0xf9b927d82b2b8095f9478f2f0150e3e3284dff48bc9d6c7cd58cdb0a5b52be0a"} +{"index": 70124, "batch_hash": "0xf305586037a1b2f92fe862c155965166b406780e9b21c5b4e41aae888310b7c0", "commit_tx": "0xfc4c0d142832f0eb5476a6c242dc9366f6ec3a74fa0ebea7cc732d54174c346e"} +{"index": 70125, "batch_hash": "0x849721d6ab044323bf0f3cf5958a3ebd736bf26823ad8ff4a0382457931dbd9c", "commit_tx": "0x0b45bd941c61454ba70d51e70960a1c1c7b573ca682ed1f5b3a5564930090c4e"} +{"index": 70126, "batch_hash": "0xfbcbe5842907a9c734e952d24c87123f6a72bb3b00f3a4ac3677a32d337f366c", "commit_tx": "0xd8bc170d9edfe2d16e3cf8691b0562faedd306f6606cc0de0190b1b4dfbb2efc"} +{"index": 70127, "batch_hash": "0xe4e59033bf6482ec5ec2327e007fa95d13bae97dd2ef96c5e98dc1f83ede872d", "commit_tx": "0xaa17a0fa97c0b06d1e5479f3d5d1a5f26b527a72085d5790d6beb94e4dd983e6"} +{"index": 70128, "batch_hash": "0xfbbf7667b7521bd8549321b6eaf8a6bda8e07adf69a059a99443afd788fdf699", "commit_tx": "0x33a299b45b7af050f4392d80fb21215bd00bffe0b67b0d1329504d01eb515a19"} +{"index": 70129, "batch_hash": "0xa0337541ad1c28a43ad714c80e5827a565aa9745ec712df532cd33a4e068b30c", "commit_tx": "0x3ca3610caa7ed819d5610d9a11ebe0a8d3f0dd60d69220f0d7ba9c0c6adb030e"} +{"index": 70130, "batch_hash": "0xbeb9247ac63298e23ee72de8636cbceed720120e7d16fa111a11ffe2a8e26c33", "commit_tx": "0xab6d5a259585aab41f144e75937beab6c529945cc7581f40d4f611a653adfc9f"} +{"index": 70131, "batch_hash": "0x14eb93b6c28bacde2da2548039706a03bb3df8e4891f3f03ad3977926b429e0a", "commit_tx": "0xafeb8ab64a687430d27243608c762c213015ccfe7b5b211fa0ef7bbef528ebfc"} +{"index": 70132, "batch_hash": "0xdc94a8ca7f1a01aafb5257b156c90b46a1b3e64f81ad878d2b24e1c11ccf5802", "commit_tx": "0xa7f62702c3ff8a1ad8f29de0c1e70f7aaf0fa69fc9068c68e9435d720d240887"} +{"index": 76343, "batch_hash": "0x13204129b548ffbfdad0c0c1018e831d6c4619a7a10febd7f0c276149101d4df", "commit_tx": "0x45df72867fe3a5a6adeb14730e49a813f4b2862743d6145273773fbe19f44584"} +{"index": 76344, "batch_hash": "0xb03ab3de4ea692c9978abaf3826096c6541a216b177ac40b6eae9d01f8d07b1a", "commit_tx": "0x3e2b753dfca48918a26a94bfd2ac9d259656b93a95b6c07797b1a897260f8651"} +{"index": 76345, "batch_hash": "0x47f30c56c51406102683ebbb0bcff6e6517eb4de8906dde57f8662a9745e5996", "commit_tx": "0xc7bd9e61a52f35eadde78a30a3fc5c2e6d1572d33cf96ec626537ace819c49ad"} +{"index": 76346, "batch_hash": "0x5c92f53e79ec66fdbb552c571bf6c106e14fa446d4aad37214a860c3b29fe326", "commit_tx": "0x6b575e7b3573622b49de44842b677fd0f6aaac29c66aeb0fef98dffaa2f72e14"} +{"index": 76347, "batch_hash": "0x5b312c8c4c03d844d8c2c143eb8998ba86a4301f0f5475a8b3ea18f4c57639af", "commit_tx": "0x0281e0aad26cc0729e341b6c0f494fc591d5389856f69ed30c35a185755424cd"} +{"index": 76348, "batch_hash": "0xc2111e90d18d7b6a1ddf5fa3a3740a493385551d436c2ee4b3e2d11b9434e887", "commit_tx": "0xf69cf3488eb7d41d4b1f37b78678e277a397928fe918fc527e6fe32ff44a6972"} +{"index": 76349, "batch_hash": "0x89c7e1af0cd202abeb4da2a6e81d937a0e10aa81f8f6ff0ff4455ed09a20a577", "commit_tx": "0x2567a9e70c1cf827a56b72b95a5007d30cd3cb3d007f2f77ba94cf1e40f941c9"} +{"index": 76350, "batch_hash": "0x1db88704585d1c0f0f9b448f3c55c0a340eb076294f5122d9f578120dab168a5", "commit_tx": "0x659b3a9f02ce70c73a0d012983ed16feff1316243f8e89578827cb0388f83b2a"} +{"index": 76351, "batch_hash": "0xfa391620edaf6185abb29946edd171118b8de5c497c10b9206dc3b26bbf488df", "commit_tx": "0x29bcb6531b470a1a76cb6ad1981aaaf322573ab242af086bd72e2852f8cca68f"} +{"index": 76352, "batch_hash": "0xfd41de7885faaa3fbd93099c76f88eefe1347efe5050c3bf6d67a43f81ffcc6c", "commit_tx": "0x89165fe7f09ff898c53938c27ed5a491ca84fb4a20faee4073d2942c930a4615"} +{"index": 78293, "batch_hash": "0xafe9e32914396d697d7bbda482a626c61f0cce96ab42ec5cd32976cdb9fb7e7e", "commit_tx": "0x8aa3e8006eb677138679f6026f2887a4c5d82d205ed169cf8608f671da6a2eef"} +{"index": 78294, "batch_hash": "0x6835511f2344529a17a4d97f8a5aaac3159448edbb16ffc22e670c16b2566145", "commit_tx": "0x9af5453b50de3d835ad2e7a71069a35484b80ae9569f377c00ccf7d7e6558874"} +{"index": 78295, "batch_hash": "0xb190096c7e0e76a1bf112089ada14c28227b24460d3ae99052807997196a1ccb", "commit_tx": "0x394eb5699f45b037a074b2d14953de65eb6fe0ca557d13540acfe56c8e1c5dfc"} +{"index": 78296, "batch_hash": "0xf1e1700c36e1072b14d72c35de9f52c9bca81085df5e0ab6cd2b7d350db560c9", "commit_tx": "0xd1068ba8861cd3296509fe53d656299a6b789f16bf15eb49c7a995420ae37f52"} +{"index": 78299, "batch_hash": "0x765194d5d1613c0e93b06d24e06595883f93bcf9db696f97ab8a2d38373f0342", "commit_tx": "0x0bee64db7144099ffddf0590f44556a79e740080107bfdb95bcc890b8a695775"} +{"index": 78300, "batch_hash": "0x3b0b5f4ec64655be05c3e24f2d4551d4a8bb9bbf2b0749087e56e11a5890a099", "commit_tx": "0xb3269b4c244f60af717521109028819384a308e0a4fa361e5c4a74f76ab23a61"} +{"index": 78301, "batch_hash": "0xd7592cf55c65769a09e3dab362c9d66b826e658986b66a9e92b5dbbc7b7bda61", "commit_tx": "0x7153a31b4e0d198f33a0f43a7456ff42d6c8fa21857691cee7cd55ab15082c2f"} +{"index": 78302, "batch_hash": "0x4a5cf0cfc84c9a735ef25e23e87b6fc0ca32c3377515210d9107bdf8701b6df4", "commit_tx": "0xee606b562bf6dc2089f8793b1ffbacf1752445d6ee2d9fd54387256cd30a5a72"} +{"index": 80843, "batch_hash": "0x21bc440097cf4e41e7e53f4befe4b37b3bcca9457dd7423b3e11647a3f2bbb9e", "commit_tx": "0xbfc2910218ebbfd8a17a6d8fd1b85fc635220b9bfacfd2a35e79a9e6395550fe"} +{"index": 80844, "batch_hash": "0x8ddb7434db1c4a1663ce9748dc891ca8ffb1ed8817214ca5ee1d2ce335f714eb", "commit_tx": "0x037f93c528ec2ec22bdfa1af0502bcee158fd3c222f18a565feacdc12e4df85d"} +{"index": 80845, "batch_hash": "0x1a7d54035c2c65f59e05c6b33434eec82bde6cccf2a29f35379a116aa1342a44", "commit_tx": "0xd81efd6dae92d29d03f9fe85435798e52943d9606dcd68439ce2dbb736caf7b3"} +{"index": 80846, "batch_hash": "0x2b796ca9f97d049ac5c9ad1cecd1e1665e5804be45c748dada8838650c8e3961", "commit_tx": "0x663c5d6e957876de4f8b252b4860782004337aca16f7bdb290679f27d553cc12"} +{"index": 80847, "batch_hash": "0xf297e2b12ff6c0b094671457567dccdf01d7e5a57e7a5bd754079c67643421a5", "commit_tx": "0x8f0e4f38f6a41dd53a7911550f0d1c6fca2502db660e68a3cc6b758533818345"} +{"index": 80848, "batch_hash": "0xef41fa5b5a1f78e1f1c00ba5d64134b7aa5ca1ff5286127ce9219fb1596471c9", "commit_tx": "0x107977c8538f2e1564e31f99e51910f793eec7820e8dc4f318f39db0a395141c"} +{"index": 80849, "batch_hash": "0x7f74288854db37fb00e5b28688aaa33a8de06973384fec87818de303ced474d1", "commit_tx": "0x37af0272dbee0d98f3f182a948ea6f906da908073dc9f4f283c7c87566fdbaf5"} +{"index": 80850, "batch_hash": "0xfeaeaf02d69d9f8d9d3eeea88883f70bd995187bf787232b2781a862a500819a", "commit_tx": "0x0291f23c3cd4277dbd6030fc463a526fc61e7125e18c825533d32ec1d6ff4f9e"} +{"index": 80851, "batch_hash": "0x2c49ecc682ab335609d6ca86c4fe3ea785647b2eb5203233b56e3ec0a16f55a5", "commit_tx": "0x6076cffb4c77ebdc87e5246d7bd4ac57fba25f2546ec92a63a36e60df3c424fe"} +{"index": 80852, "batch_hash": "0x4cd8f89f0b04f600abaf7c6744d013d91d72701bb0ff536470bff09cd5ab8d32", "commit_tx": "0x89f4db417044657455075753296ea50b67af440aa69a281cd8d9006f31586cfe"} +{"index": 81233, "batch_hash": "0xc644e97d5f34c6143d779b953a24d3002bf522dd60bf7d60e6fcce0d8fa15a97", "commit_tx": "0x579bced11d0bccb86293036b20bbbb796f7cb3c078e43ab852dfe1a0a303d817"} +{"index": 81234, "batch_hash": "0x006d40f0e90af89244cd8f570dd3102c6a9e7bc4a6f2619e9dc42d0d443692cc", "commit_tx": "0xf203263e420d1057510b974507fbe84c08b36537e70c9cd6ee2ccc0c24c73e12"} +{"index": 81235, "batch_hash": "0x0534fe28fa7a0c5573d524b315a2e16de16a239c2e4449289b5e890fc31d035b", "commit_tx": "0x7dae3123b03157150ebdfbc52039f3742925fc574bdcca67f965152955966d69"} +{"index": 81236, "batch_hash": "0xa8226732e3f4e2a404397b0a1862f9bd887d27a96c47d499685a42b7eaaed35d", "commit_tx": "0xcdfc01f5256548c4d2563486559135f92ae4aa52bdcfb40294100193998db101"} +{"index": 81239, "batch_hash": "0xc70163a51e0c726167315c66872e668ee03fa68dc771972fd70c0deadb12197f", "commit_tx": "0x62508ad3c30606da12ed9353b49760ce72d23ffe0dea17ca846c59cbfdc4c6cb"} +{"index": 81240, "batch_hash": "0x4f966bbcc5a8ca654540438336126d7f37a12a618b17d80fdaffce94c9e44b9b", "commit_tx": "0x6a93adba2ed7cead409040652a4abc64620b413ae0f674799e910242d0a11940"} +{"index": 81241, "batch_hash": "0x5c2a21c65ded25577d1de5e550161d01b508eb467938b8aa33f3249cc206f936", "commit_tx": "0xf0ff1cbb0443c38c3427b08004413a9abc7e0714e2ba621bc6c85db2e447e694"} +{"index": 81242, "batch_hash": "0x873894d26f1bb6c82769a8a5c670c54a08839d430e05f0bcbe673aed558f646f", "commit_tx": "0x9e0bf1819467927d85ba999c4c4d299e74fea929433d3cac31b06bc6ea05cf4e"} +{"index": 83313, "batch_hash": "0xa924ea449e7f5c5bf57e0e4734a7d7d7aa2e9264f4ff3270653e764d1e4f00de", "commit_tx": "0xf01aa8478cc8d377b50d29a4b7aa193f547241bf69f81ab570df7fcd7240a682"} +{"index": 83314, "batch_hash": "0x8f64f53ea5c2a4361cf1f89b014c77f24ff4d1141077e92aa488ee56739080fd", "commit_tx": "0xb69665b2205b4c8546d5edeef7463837db26074e3fa1a075041fa265768f7fab"} +{"index": 83315, "batch_hash": "0x9f26813180f43709d115c7d40e8beba491af438c0a4f8dfdb4e2de11595bfb22", "commit_tx": "0xb722de8d20f566b7b9abd8c82f05a81765a3ec27ccaaf86f2abcd18af9f81b7b"} +{"index": 83316, "batch_hash": "0x0b691836f3b24993f7cd342da98327596b226ca4fca004dce91abbe3ed06878e", "commit_tx": "0x365e3f0c9ff0185dac4c4668e98e34052278e3b954ac93609a483b1fe47e7ed1"} +{"index": 83317, "batch_hash": "0x93c019dd9bc642ade9d704fa2a65cb9c35e65987bd26b1016afc99b78c3d720b", "commit_tx": "0xb956bd822dceff4420a03b6f15e3aff52e85a37f27090ffdad70a62a666e855d"} +{"index": 83318, "batch_hash": "0xe873fa917c1cfd2e3349d82ee1c00ef03e535309baeb2a485b265fdd46485a32", "commit_tx": "0x2b2fd569688b6bf079a45e501111ac1804ce86a357a9f1418e8356dc8d99cb76"} +{"index": 83319, "batch_hash": "0x79a958c301da8a380c9f2837f14d2bbece1e1f87046e32e9dafc7fdf12b43138", "commit_tx": "0xe22f20dd328d889c37723e891ded395aba396bfa9b2ac915996dfaefd80b13fd"} +{"index": 83320, "batch_hash": "0x2ac154f8b08d4f2794d99766774ed98b801a1fffae95defac80501a622b1b2e6", "commit_tx": "0x07e0c3bb35e944370c8941b96fc7d35d875828312a59066dae0a119a87548540"} +{"index": 83321, "batch_hash": "0xcd1f2dce31b930a1809b68f6071be3bbed5bbcc135dc82db8049bc0df0f0fb50", "commit_tx": "0xc968dc2e3fe61f59961159a6979b041454d6cb949b9cfea347db18153dae2949"} +{"index": 83322, "batch_hash": "0x21b4be3236e0bd7d2d5c4cd4cecaab00470eef31491733766ad95bad43ed9270", "commit_tx": "0x477ad96a0fa4a2a4ca1e481a6be023791569f1558a7c98f8287d75fc8eb3a481"} +{"index": 84543, "batch_hash": "0x9140fd598d36e7447c051eca7361284fdc6c8da8e44d1ad87ca22d8157956636", "commit_tx": "0x168c3baadfb72a7e31f08443897920c000001ea66587398160e7e25af4d2e841"} +{"index": 84544, "batch_hash": "0xa85dee2a8d37537c38bb87b21bd2348a31a2c5c6747e2facc3eafb02bcdd9b5f", "commit_tx": "0x6be1a2d4554149286d34260f59cf0f5a95b8dca04554a7cde7bb05fb24e94e07"} +{"index": 84545, "batch_hash": "0xd8627ee0a1076485d7f4f67e587eeeb54b7616566996679421846751a5d51660", "commit_tx": "0x28a25839fad337c09f84cf3a03433f73d3f42bf021074a0a0621ddcda13aeb71"} +{"index": 84546, "batch_hash": "0x6223caabc086b6b68c8f11a40e8bc0631eb6ac782623a5b29b834f174d4ece90", "commit_tx": "0x87a1d2e8b9014d261761fa21bccecb1b9e4a9214579db6ae141adc8451456caa"} +{"index": 84547, "batch_hash": "0x760f8c261074965aa11a2a33ff150cc19e6e564c31e0e782008a0d813c059542", "commit_tx": "0x8b65fe996010716b39d716adaefa4d93d8908d8d604aa7850efd332c626e96d7"} +{"index": 84548, "batch_hash": "0x9cecdc426ea74362afc84eefe91efa595044531e44b089c02238f2725c3d155b", "commit_tx": "0x71b18cc717bdbf33e22ace1391a0af4f52f1e04ba41b5162ca36dd70528c7609"} +{"index": 84549, "batch_hash": "0x865cef5248e559052fb31a40456a077f17af894c4b330cab44d9991185ddae61", "commit_tx": "0x4785d4d6e8af105055e42dea51eb913087f905f7b03f2f3d29c8ebfc8881a184"} +{"index": 84550, "batch_hash": "0xe6a9448429788b38b65c971f24043c44b7c1b8044897b9de19740f22367579f7", "commit_tx": "0x0667c39ebe93aa73484fca026c19f74ed244e1fa575af4bbeaa410324fc5074e"} +{"index": 84551, "batch_hash": "0x28cfdb72bba2643dfb849cc85abf586020032f619b26a783825d9b4b7f242b6d", "commit_tx": "0xb51ee2e221647fb1bbbd49c7aa43952882025034aeaf506b6884124f4640a119"} +{"index": 84552, "batch_hash": "0xd486b17a0f3fd04cfdd9585eec20333d7fd2c80437db0a7c7f53b6354bf0f4f5", "commit_tx": "0xfc9c0c87f72b94cc1e60cfc82a5e9865387049090937a944d9234d2e6d3c8338"} +{"index": 85543, "batch_hash": "0xaa416d97bf72e3c8a41de1bd6f10f433765987d119e2abf17f94a5411e6dc5da", "commit_tx": "0x8993d5a0b8568c8cb09cd6e9961440429c7bc69df4528342049abec545ccfc41"} +{"index": 85544, "batch_hash": "0x398a8b5222e793e392193000108e7e1618ea4c1b8663f6ac31389e11c387240c", "commit_tx": "0x850d845dd9fba423dc5757e51c7c8048062e5ede544f80ee9a3ffedc1fd7f12c"} +{"index": 85545, "batch_hash": "0x9213db0fa01123c497eb85fded765ed3dd763071c0f850f89c3d820ac04a9ee1", "commit_tx": "0x432795547278bb0d7cce3d42aecfe3a8441c3cd96ad65652f6ca51f3aba819bc"} +{"index": 85546, "batch_hash": "0x36b5dd1417f4d82b029bb04258640bd0147b37e4203bddc34fa620c9d8fe2d84", "commit_tx": "0x833ccfc4769efbb5980255f53a8fe0d44d090c824c6867e3662b462063928502"} +{"index": 85547, "batch_hash": "0x47d5a501f70726649b071b00ffa898d8995022b4772ca0eea51c70b00f630502", "commit_tx": "0x248149c9cac2cfb23b699482ab17a477b25cd987bab77da52dacd5ead439ccc3"} +{"index": 85548, "batch_hash": "0x6e67a219ddcbd9e3722e509856ff89c3d1f032ecbcba92f19c35c92419ff79b4", "commit_tx": "0x96ac6ad13ce3e2576caf402ba8d576335e6b3f7e91d242a262f607ec07d99181"} +{"index": 85549, "batch_hash": "0x8616c0e347a207335cc2f16f5a474683f40300563c2149a3d7c881b626a5c295", "commit_tx": "0xcbec5ad0e7dc6da404aae46484d3614fb020ff4dad3588a5ff6f7e9280e1a79f"} +{"index": 85550, "batch_hash": "0xbd9cb7d8cec6d82cc0f7690222974a62cd1c8c3822e7d4825ec9bbf8cad4f863", "commit_tx": "0x85ce3cbc9818c6d3c75fa1091dd6997af6ba979114aeac072fdd98ec07756c7f"} +{"index": 85551, "batch_hash": "0x784ac5b1b916f583c8706080f47ec50c4235f6940946969aa9aa19460a18485e", "commit_tx": "0x16d698cea6e3ff89616cd9267e665372025ee8fd1a107788fb02baa96c57cd6f"} +{"index": 86113, "batch_hash": "0xbe07be9c252af9de721ecdbe09bbc1ee3c5ae66cd0d3c5eb32cc9ddec469ad77", "commit_tx": "0xf1f08d4192274e5376f471c29c8098991d88970f6e73c340995d6da31e2b873f"} +{"index": 86114, "batch_hash": "0x5f2ae29fe28eeb9ea70f66b0717a503c17ae90b31ad47bc350ee59d896ed4a94", "commit_tx": "0x234b69f97fd280c09156643e91d07c3cba0d0ea44c210d3d08198e4ae576aee5"} +{"index": 86115, "batch_hash": "0xeb53aeab67427e1ffea7e759d4ec61d1b5d63539a32763178bc3b3931659bd76", "commit_tx": "0x40fe2f7d2c55a1c23e48810ec07558b9ffc6ef7a3d505250861decda4e6d2a59"} +{"index": 86116, "batch_hash": "0xa4cffd3bfd85e107c3822cd3fa5fc39ca136475ba7f13e5151807b38eecd6225", "commit_tx": "0xbff72b7f4398f014a59621bb61dd6e39c8089490f584ad7571a144964403e995"} +{"index": 86117, "batch_hash": "0xd9f25d547509a2c2e6a4b6559bf53a15d58b1f149dd193d620ad796d5edd06a4", "commit_tx": "0x362cff1ce4a852879fce510faa0955343d45f5038e94964b338a9fe1a88bf0a4"} +{"index": 86118, "batch_hash": "0x0d8652a2021a100322f943184560fedf65dbaf408028b42eded42b0adeb53f8a", "commit_tx": "0xbb35991cdfda2ae01c37ec776fe2f2ea11d9be64ff32cd72aabc0e5c6649fa8e"} +{"index": 86119, "batch_hash": "0x872feb28ed4f903e1e39229043bd9a39f9055f1c502bdeac8d725792aee65e4b", "commit_tx": "0xc534a3aa837e4edeada156edaec689b5db2fda0329a91fd7adf45db4db14c2d6"} +{"index": 86120, "batch_hash": "0xccfa0def8058d6438a28498d7ffed77deda22c2a56fafdf552284ecee353d9ff", "commit_tx": "0x412da78a2fecf6eb1902cae75c8d2e1b17dea4bc6b763c363d1a1a7dfbcad3ef"} +{"index": 86121, "batch_hash": "0x5f7c13c997d578f81f07690cb0b6da5230f7cbcfcb6be76457a1c0c7468a2f30", "commit_tx": "0x630cdcaff0a9d8dda189101aaaaa441529c9ad61831336e41a5188ca73866d6e"} +{"index": 86122, "batch_hash": "0x08909773fa8a77ca3ff768c9f6ff970cd5e535487c50666e3e56ec248fda424a", "commit_tx": "0x681d8b4c3bb01e0566dacc697bea04286d492dbed0759285157393e64767da8f"} +{"index": 86213, "batch_hash": "0xe6cc4990bcb7437fc3c04a74c55ae7b2b73a2c7a1b9a4ad2023c874fbeec9b03", "commit_tx": "0x09ae6bf4a8241d042e09c8720abb59d7c92d9537007ed3d0b78fac4c7132231e"} +{"index": 86214, "batch_hash": "0x65247ed198709eec4231d1526b0bc15a0455f0d6644fe5b4566a810918893876", "commit_tx": "0xd98a05ff3d84c24f174185a16bba3f77933adb75d797e3b63297e13dcac38a71"} +{"index": 86215, "batch_hash": "0x70421793664d16f80c717a58f45dbeffdbed666c26f7c0de7bcc71cede1fbe76", "commit_tx": "0xd9bab04ebb901ed3ade94a1bac62b7a2163abac8696d149a642727c8ea197503"} +{"index": 86216, "batch_hash": "0x89b5c5b4ee126a06b81bdf9dc30729579d751ee44151c8e238c21ca5102e66df", "commit_tx": "0x6a57b3bb20b433e5b15df43890828a4a80af791ceeddd6d351bdd29d77f9f7fb"} +{"index": 86218, "batch_hash": "0x8ecb6045d8367c07db5ae025c161ccfee120c8e498649f72ae9494f620904f2c", "commit_tx": "0x5e169287893a25a18be03dacda558c3fab58d5e788e706f1146d84c93c7899bd"} +{"index": 86219, "batch_hash": "0x135e3032bc3d279ebd8ca172f95debcff1699ef9afaa2a014eed3f39c8ad32e7", "commit_tx": "0xe6c9fd1dd5c32f77e883b49421754aef8e9aa90981c1b09ed22d0468d25ea4bb"} +{"index": 86220, "batch_hash": "0x84e20f0ab25a10aa44b563f64e434aa34ee91c70d2c2cb4a22aac8f57b7a5068", "commit_tx": "0x483a0f0c88dc5cad10f3fe8630e2832a88643d670b62237f71d1f69bb3e6639d"} +{"index": 86221, "batch_hash": "0x34e5eee4d0941c75d268ab3c15efdbb9f9f89ee5f54fbfbd22c7dfddda7fc652", "commit_tx": "0x6386472a331b1086f88d683a5337bcfb512a1a9c3a8b3a62d07219678b9d93b0"} +{"index": 86222, "batch_hash": "0x3521f05810bfd1b8de3646431c3e5730754ff36fbe9a867090b24219d12789a3", "commit_tx": "0x30f47c502b05aa14cda6ce151ddc33ead496bbc2e2f3ee616e120e4fdf135d08"} +{"index": 89383, "batch_hash": "0x5036a3f27d72122d70e2a42cb7a70d62ba273c6f1ac2a4b26979b6f2ca4309c2", "commit_tx": "0x9a4e163eb4f665f4921795c4e2a80b7ae0bc60fdf7616c62bfa048cce3d6c109"} +{"index": 89384, "batch_hash": "0xc36a1b50260fb81dde0fc9c7d428fa213740affc269b742f88a37d66868a0135", "commit_tx": "0x0d1e6f1dbc94b2135db993245b138d0d3c08e2f80ff6622165c8aa070978c2f0"} +{"index": 89386, "batch_hash": "0x70435ce8c19d58dfcd940af0083400f126ff46b8ae93533baa4e4e38116291f4", "commit_tx": "0x27a4c82aca27ff5ac781325257ed186055211a629ff373205c5cdd665bd86670"} +{"index": 89387, "batch_hash": "0xc668ec1da0f18d79bb470ba5180676783f54c27a76f4bad3575fdefa05cb55ba", "commit_tx": "0xe0afc01f6782fbd49a6b5abc5414b3b65db8f8483e94098a4fefcbd7f6fbd601"} +{"index": 89388, "batch_hash": "0x1fd96bc086a60b4d5b2c099e18977a4f8bd6bfd43908431dc6487086a1cba0c2", "commit_tx": "0xd27ece0027c6c8050531a158895a363b02251b79579ae349a6df3b7fef513d2a"} +{"index": 89389, "batch_hash": "0x582cea67d5dc9e610ecd3b961a7fb49fae35b20095525cc022b2d60866784e8b", "commit_tx": "0x2aed4f95b922c1e7c3922d8f12c27a54a34fef14e81ffcef6f8bb2d46eaf706d"} +{"index": 89390, "batch_hash": "0x50294826a93dbd2c36731fbe8eae4e59573e432b730f33b9695603e3711cadba", "commit_tx": "0x34dff07f35a2ce456c7dceb974b5903e7058015c9521aaec143b0dd62e1e9e7d"} +{"index": 89391, "batch_hash": "0x037e5389b739b4f58e68ab1ff7636aeeeff4da35843d23c0cf9b1b7295a5f8f2", "commit_tx": "0x6600598948dc7a86ff513709fa67ecd2643c11796b5e5e789c93eac1fbff8857"} +{"index": 89392, "batch_hash": "0xa0f50e178714721b224e9d89e6afcd662cbee38867afcb5553411731bca4f0fd", "commit_tx": "0x008874dae4d93815a96f048bd7d4f63a288c708c022f18272c134697b4df59c4"} +{"index": 89913, "batch_hash": "0xb51c06ffee5de0579d82cfbef1ee38d31c7e66502734cb5a6766374daf99c157", "commit_tx": "0xacf02dce004c0b9f40d50b885b9aa6f19c5645d27c811edfc2161e92a816ebaf"} +{"index": 89914, "batch_hash": "0x3782a1df439efc7610c64b8fe6946447be8c56faf3bda4ae7172357869e0b51b", "commit_tx": "0xc7ef0af7a8850c12d0bbd5853c0a69a70f466402c1c3db64fd59f2ccc0a04082"} +{"index": 89915, "batch_hash": "0x69249e299acd5e088dcac5ca28f80c6df02c819890335f8a12050f8346e1cf85", "commit_tx": "0xcd978ec0dd388a22e70a616f8afa8f148ee8060fcd82b41b942beae899af6330"} +{"index": 89916, "batch_hash": "0x9b6b391e42a4c7e5de4cee3dc9da0e91fb93a384b2403796edf214bc0bc55689", "commit_tx": "0x9dfb4f3b85d979d412a0661df1334e31a461802af29bb1b755a5aba61a603ef8"} +{"index": 89917, "batch_hash": "0x08f4482950dc3a30103f3ceb3954699681ccf10dc1aeba09106f211cc5df19ae", "commit_tx": "0x53dca18a07dccbe7dbcc8cadf994ee2311a600e91dd29090f03b4a3d801e8810"} +{"index": 89918, "batch_hash": "0xedb2cb4d15e488ec922114320e7240662d5c404dda1375ccc820386b20cad1d6", "commit_tx": "0xc2330b4b390f43fb5ce93eff530e63ef0e9e12412256a25c162efa015e3a83d6"} +{"index": 89919, "batch_hash": "0xbb7debe68ca8383f15984263fbe989dd5a1237a07a6d55cd6e401678cabed3e6", "commit_tx": "0x08091e80d7eb7bd5585e2c1d90429cb270d7429146f7a0fff9826d4bc01a6a59"} +{"index": 89920, "batch_hash": "0xd46db1921d23ad5504bd55dd971501562f232fdae9bddff30bfbf549eed95350", "commit_tx": "0x5b4275d737e43917c219e6eea5a03ca6c9975cbd122c4bdcdc580547ff275641"} +{"index": 89921, "batch_hash": "0x2b01a872d1669b631ce1ac505e135793f306bd5a68ff81ea37701859f07bb631", "commit_tx": "0xb7e547a0c154cbd19021ce9a1b7f9ace7b1e127b3cbd1797fa0ce82865caccda"} +{"index": 89922, "batch_hash": "0x45a60759b7596dd2c9d900bd828795b52d8c795357fd88bfd3fece97e6a9ad95", "commit_tx": "0x07037f6c5512507f3cc56e7ca96db1c84e16fff2508aea24165106edacd4fe26"} +{"index": 93333, "batch_hash": "0xd39a2521dca68c2a4132c0a2a82793f2643d5728ed8b50e889e255a3323dd689", "commit_tx": "0x2e54224b184f968598a28786152d5aa0554823715b9a3051a46a5340c97427e6"} +{"index": 93334, "batch_hash": "0xa511d572f0f33d087d56dc9c05d69361e207889dd439e60ddcef6d16e2b99707", "commit_tx": "0x6c4de9b70517879dadc46b42699d9c33eba48a4323b135637de6a36936a5e383"} +{"index": 93335, "batch_hash": "0x2933ffe456747e141088214248963ed2e0a36d58ee8c765f0c50b081e681a886", "commit_tx": "0xd9ccd641e5afa2899ef56132430568e7447975a6704d1ca903d1303d28e0b01d"} +{"index": 93336, "batch_hash": "0x59fca1076adc6d1d26d1033156bfa7301fee1496c0d2ccd049c19943d9eac666", "commit_tx": "0xd9a4ed5932324c2afe3b4ef51a7a439eb18b823bb76c0ffaaa4b61e2b78fb214"} +{"index": 93337, "batch_hash": "0x0c514492bf6a36b1092743481b0de283605b1f7e169cffdb11bd02203073a244", "commit_tx": "0x5c6d0948544e48b3e0d18a2d165fb624919ff26ccb4ab9f19eae60d8d7c8c007"} +{"index": 93338, "batch_hash": "0xd53ab3a960fa40db11677499a3966edc23860672e954039e187798c30178b245", "commit_tx": "0xa624014eba5bd37f9bd9c698062d81fcdf9a8f095bd374c66fcda608613e69bf"} +{"index": 93339, "batch_hash": "0x32f7c2ff77fa178906e535264520b934be3c6f28ac8d8f35d99243a9e61a3d25", "commit_tx": "0xa37634e4d2ba9a19008901f42b850b8cce727a1a07102db11ed99398aece9195"} +{"index": 93340, "batch_hash": "0x7124ccdb3bcb97e4570cb2607c7e20d439d6498de607e1d4500b62434624b4f5", "commit_tx": "0x8a22ba5d9591e3d4326cfb8fcde609efb06ab42a800f044a421c3a41bda37c8e"} +{"index": 93341, "batch_hash": "0xc2c98e1a2d2aa421b5d9ef1e3998de1a21b176e831214716b6c121ee1a45784f", "commit_tx": "0x965a66405f5f24f33cffd0b3ac5a032f607e17b0cc403a7e10843a4e4d50ea9e"} +{"index": 93342, "batch_hash": "0x8e70f886a18a28d77c09781e328fc2f7140be38c9ec86f847d8762b797a05a1c", "commit_tx": "0x016608c448650b09ece0c6628724d452d43f89e6a069a55b6da17e56671de084"} +{"index": 93713, "batch_hash": "0xd30450f5f57fadf495d77061d0be95ea2f26e47e605fbf87297086eef932fbf5", "commit_tx": "0x8d72c908a1dc2d202b8aec711f1ce79822c792ee76ad3498b0982bc54042154a"} +{"index": 93714, "batch_hash": "0x2556494aa2c02f02c9a4371e22941fa24488560c1c77e0fab86fde38c2320ff7", "commit_tx": "0x708d9466b29597ba1c5af614458dfdb9f6c8c989185adce2f9641abd75213041"} +{"index": 93715, "batch_hash": "0xaca6ef67769c1534f345d973e6e14b16000c8e592271591e172c80a39ab27407", "commit_tx": "0x5a784a885f92b8b06b0adb4d3186e167e4c45149b8979a9ae934657f7b6b5ebd"} +{"index": 93716, "batch_hash": "0x86c8851c1ca3a8db418f0dc325d4ffbc407bf58a53c85703658412f2ef112234", "commit_tx": "0x204b05a800710c9cedb451419ea128d7f5d4c15267a6a338a8bbe802e7c608b7"} +{"index": 93717, "batch_hash": "0x0635f4c893a2cdf7a09fbf7d97bff985d5be4cdf4127bf13351c50f5ff34c8fd", "commit_tx": "0x3a20e578cd82e9504360fffff7e7801ed17de8eaf17ec5d0facfbd77c838dd6f"} +{"index": 93718, "batch_hash": "0xa97e9c2e5d046a452056135b420c9953471f6c9f9d069935b96ca94d4fa867c8", "commit_tx": "0x24e8553549eeaf5331077471da61990a9caac167432360bc0bdfb2a3c1e7be9b"} +{"index": 93719, "batch_hash": "0x6cf21402cc4724f9e6d36af3e139df9e311d7d3e8da5a3cb0a07b1557829dfa5", "commit_tx": "0x53f1cdd263a3dca21ad408e067fc1bdd8de46444492daf657250e97a65409d8d"} +{"index": 93720, "batch_hash": "0x37eb3ddadd0a7955244c81e1e84162822352e1a99aae0c87603fb0ddfd740eaf", "commit_tx": "0x082ac08f577c8cd9ffd552d4ea235058b4380ad72fe571b309330e8b7e0f225d"} +{"index": 93721, "batch_hash": "0xaf9e6a8f543869145f927b7ed19ceb21dd85add07f757b665be550c95ac2d4a0", "commit_tx": "0x39e2e602bb085c0598e77e225edf6ed86334426459219a942e4892c4860a1595"} +{"index": 93722, "batch_hash": "0x389f39621a0854a5e53239e15556914d66fc633694a9ccac4b039e5bc4de2614", "commit_tx": "0x03f81ae51e16b66a0a0eb15a2671c9a14ad44cb3deac3dfac3cbff16068c7ce7"} +{"index": 95673, "batch_hash": "0xc5c64c2817035c0da58d72b5664bc33bc9703140e7a3cfc07bbdfdc03c6f6452", "commit_tx": "0xa0cc9bb66e25564cf8a1b273886b4376ae7c534398b38d27d87b6455dfcbfae3"} +{"index": 95674, "batch_hash": "0xfb02c405a699749e8daf3c6acdaf75d9d98921bfc33b53f196efc8fe7fd00739", "commit_tx": "0x3338ab74ce1bb3231430dcc40146d9686cc5aee097d386571984eacce7a3c409"} +{"index": 95676, "batch_hash": "0xfe3b234518dee5f34e476b5a173f05d094ca5d1021e60cc616e3a3150fc2a30c", "commit_tx": "0xc2d53711445f5d47c48d12e12f4a7d615ca67bf7b5c7c6df83a99ccfd7be1077"} +{"index": 95677, "batch_hash": "0xd721900b6ccf81b95b8e8bf787e1e40fcd0a0a63e6cdbeff4e7afe0c32acb486", "commit_tx": "0x16998d3a879aa107282d93808b46a83d3714f5ab58d1c3c66b605323106b17af"} +{"index": 95678, "batch_hash": "0x40c2fd403ada1fca85b4e2131b8b2e5fdd7157d2c227375fd8c3caa4664b74f2", "commit_tx": "0x4ca8ea0a3ce882a6f1eaf8620a4bf7f7b6b74974c51418109d637f14385d38d3"} +{"index": 95679, "batch_hash": "0xebea5fbad3be45e8ff163b1471fcb8520fa22dfee9b710b2b781105dbebc66b2", "commit_tx": "0x691113e3c5497f73d13984df58cf67f233610757753b83a5f17e498931ef8a2f"} +{"index": 95680, "batch_hash": "0x095c5f3f402b7cc3220647ba076fe0e2e85ac7ad2e62a0703169529e26b8eded", "commit_tx": "0x490243867a6192cbfc19ba0f35b80749c808bc1c5562c71275419503ae50a4a3"} +{"index": 95681, "batch_hash": "0xef77108d88cc8e1839125e2aaf02071866a778d381dfe242788a9c4502bd7178", "commit_tx": "0x6f935f3cc60ba2355a093a9d2f21d84bba6ec8b4837b51dee627e2960e96f765"} +{"index": 95682, "batch_hash": "0x5c004718001ebcc20d04f646620967f67da9b175ac81249fe3c0adce001dfcde", "commit_tx": "0x95de11556255bb511d8359a66764765d7daa90f80f4408d98bef4ed3f96645c7"} +{"index": 100883, "batch_hash": "0x2a3d2860facbd7afbe84d7e10fdbbae8ce3de401ca0b3a719dc21a5b6f08da76", "commit_tx": "0x597087226a9612dca933b0575826bb4f0cf6c59fd6fbb427afeecc5a7eeebe46"} +{"index": 100884, "batch_hash": "0xb054c088a160fbb2adcc62fdcd1f51b079873bb6770caed2791f08a2dcc3ef56", "commit_tx": "0x95c712b0c8b810a38946908be22c082f253621184cc3bccf202ebfe5170872e8"} +{"index": 100885, "batch_hash": "0xb5e96d66ba789bd1c3f99a86840110ac1e4eb64a04618eac68e460219bdcf2c2", "commit_tx": "0x3cb8f070c06c3d31b0b79f58ffd0243f69c4d1b03579d4d763c1d86a9e7d9d1c"} +{"index": 100886, "batch_hash": "0x4543fb2a4826c7412e5d83ae86165e9722c8ac0c72d5a819dbaf0b4808f3aa2d", "commit_tx": "0xe3966835ddb5a4e15611a3c63b2d0c842fd70767457d0c3948620b1bee3004ac"} +{"index": 100887, "batch_hash": "0xdc95a82736e584b0345fe6f32c072308b148d4169b994883b46c2834bace5489", "commit_tx": "0x85f84390a5ebcf57a6d47dc0e8ead41e7f9734f09871fce177dcb1f4e649ab07"} +{"index": 100888, "batch_hash": "0x81f2c96020db2f8bc844ca5d5386a9d8bb240135c93ea1555576ea5b1649a068", "commit_tx": "0x74b970956a2245e66fe972a8f79475398edd55595cbba73f1585b9afbccb938e"} +{"index": 100889, "batch_hash": "0xb41e55381d6d50c28ce0499d4cf75a4ad4e3f806af8dc104ee978079b10d896c", "commit_tx": "0x48b8f4ccf80faa93290c24ef78a88aa76a7eec53227c75bdb73b46f54ff027e6"} +{"index": 100890, "batch_hash": "0xbb04ffb181a4ae8231ba1d6decf4074f1a5d75fb48300015cdb4564c0126b901", "commit_tx": "0x2b9950a33c087e52cf1a1b7dfb21a1d6629520bae9632e424203d85956293416"} +{"index": 100891, "batch_hash": "0x1048c8f18e8d5de3cba952fa3270c24fbfde72509da0130acf8a303170bbf271", "commit_tx": "0xcbed636402d35ccdce5a892f586c96e0db04d696524691635d4746da97ec3ee3"} +{"index": 100892, "batch_hash": "0xdbc50340bf8d8cbc67827eab8526fdd1d143b446f238e7c8d58a682e474a57c5", "commit_tx": "0xb3c3ec2cc45bc63d7b0b6255b1e6c0fb20190d39514f77e04c6cd522d1b9a3bc"} +{"index": 102503, "batch_hash": "0xf0c7d15bad8cb6f8be043cddee29afb671b0cc2717013fe5f7117e6e635b3e55", "commit_tx": "0xc9e55d5fdf0bd9f280b51b04d05068b81b6679b1622131a3c7daceb55f6c1297"} +{"index": 102504, "batch_hash": "0xe4cfe56f1e8b76e0d85b43ea4075cbd8f3aca30dee365989002767ff07a71e30", "commit_tx": "0xf631f4e5d27a974a34872082bbade1e95dade5bd3f3ca9ed3ace7f74d2cf195f"} +{"index": 102505, "batch_hash": "0x6f159c378ed48c8cb7bd1dad3cfa5ef57f17da275ff170e83344b43771d26f69", "commit_tx": "0xee7aabff3b68d6060398735aa9b0cacefd821de4c48bc19ceba81b0a492e8772"} +{"index": 102506, "batch_hash": "0x27fb12d0c0200d63fb82809f6f16e393f73be4f8cd6bd59ba7975c7e9ff52561", "commit_tx": "0x24b8f89ca2a2ae76c9984b2cb527a8419720a3572cef0b34b3f6e45036b8d872"} +{"index": 102507, "batch_hash": "0x063242cc829d2c9a08e64c1be0ac8a18fbaa9bd1635809315cccfdb148c02df8", "commit_tx": "0x50bd977ab9f8ff287d0ccd0843b274b1608da7c4f5fcfd5675533c1694f0df02"} +{"index": 102508, "batch_hash": "0xc3654be81bb1c1ae9fabf0975f9b009b61ff0de1d5dd2ce82fae98eafb3fa9e8", "commit_tx": "0x04361b4f06eddfd4a09955071432fd4d39f2144e5ccc54c99a7c35a4ab6ca21c"} +{"index": 102509, "batch_hash": "0x8ab4ba7881e1af745b40a99bc2af22513d93df462d0b196be1af12b6b1eea236", "commit_tx": "0xdead47601ce85990f75e2f41b6707348f2d83d16bddd630892a02e66da613be3"} +{"index": 102510, "batch_hash": "0x54a371e32f6770db7f9de48b59e80654b9918fcf0fcb71674f035363d80fff12", "commit_tx": "0x38a90b4db26e77b152e78d3e35aa73cbfaec86272120709e8cd6b162b596a494"} +{"index": 102511, "batch_hash": "0x948cc3f9812afe115726b1a89d7dfbaf8669ef502932261c232db588d5dc4bb5", "commit_tx": "0x31be9458f845afb5cfefa4ad9ff02e6a1f78ffed6ff45e73418ae7009c11938c"} +{"index": 102512, "batch_hash": "0xc5eb3255fb0221542ff42ad91b1281a3621781ea87c6775f754fbf1644cb1230", "commit_tx": "0xa0ff5f6755aed551a1e7a8283ba31ab750d2fb0c276f71aa940978a4d49304e8"} +{"index": 108393, "batch_hash": "0x1a46c85016e1dce8f3adf19cedc3f2cb1aa8da52cfd05c34655cc1233ee94981", "commit_tx": "0xb0f317f3e6802487c82bd0b2da30fafe4641684914cebcc33c9062a524415ed4"} +{"index": 108394, "batch_hash": "0x8e228b0273e680781fadd466fcef31690ce5d28d9849ce1c271f30942c31a20f", "commit_tx": "0x846aa74fa618f8327437e75df4a1d47c98ace76361477b75e29108178e444209"} +{"index": 108395, "batch_hash": "0xa5eea9928c39bd50d4e3936221328a48e6fbd9ec5dcfbdebaaabf586876150f5", "commit_tx": "0x15295ed0da213ec2ee426269143ddb6b225e0fc9306d192a6af628ae7bfe1fe0"} +{"index": 108396, "batch_hash": "0x92c86079260550a4c84cd34b27a54bc66d94ac11b50e7ab3639c481247e169cd", "commit_tx": "0x7d6a349fa8d191e627fde7c24b4efad4c18fded03aac30244743cc4ccae8a810"} +{"index": 108397, "batch_hash": "0x9ae0ec3f13b1d57019aebf693874f9929db61bca6fb275b24da6db3f75ad27f4", "commit_tx": "0xb2a832d247bed8371f5a9e6526ccceb160ee001d3edd261676f17a998b1eec86"} +{"index": 108398, "batch_hash": "0x509cd87ca7e5510242416be7464c1fd7051cdc3dbf452806cab1c883751dbdb6", "commit_tx": "0x960b2aad8cfa3a73c8c6dd88f53987a110d5ff1e0a2cd2a53bce4b1442bac789"} +{"index": 108399, "batch_hash": "0xf171e87a736c2c4e02653bcb7806547742631a251228c0ece60600c740c48083", "commit_tx": "0x53ad61461acbe483b260decb47b2b7f3154fd64274370d6643ec9b20c586af6c"} +{"index": 108400, "batch_hash": "0xe1a54c5c5365ff3358ae1b13449c8e116f8d43e3ce0218ed1779e9ef3bba2072", "commit_tx": "0xe15c265a9cbbc7e295bfd7ab0654d235ccf220751a71979e9342193c21e07fbb"} +{"index": 108401, "batch_hash": "0x8a7e5a7987719b0cf467c35a7562942f3d52623d79e19c64201ca43871eb2ec3", "commit_tx": "0x6459027770def2f4d088cc92ccedbb656c0b73362796ebaa439445ca34e68328"} +{"index": 108402, "batch_hash": "0xdb7771258c4bd362caf3649ff0480a28eda62fe4259bac7c80243498cfcef72e", "commit_tx": "0x94150a95b6b5002f6b6a5efc045911460a4a5b48b6a990fda0917ba01be23029"} +{"index": 108463, "batch_hash": "0x4c4bf3c90466baf0bf2b59fb32648f61349e334e6e1368c969f92b8dce16026e", "commit_tx": "0xc610104841b1bdeededf195caed4d9ae0a0de14d544e97473ca0c6cd49ce46f8"} +{"index": 108464, "batch_hash": "0x39560f49f3dea2f38cb50cdd5cbaa9122f1189ad076a6191c4ae8bb457a0e67c", "commit_tx": "0xf2b2b28fe43b66383c76f516192b01336eed12893e5c397f40193fd104eaebc7"} +{"index": 108465, "batch_hash": "0x83541be7e9899537fa0d887d8426269f72ff2549d9c1a15f9de37fff1a6ad21c", "commit_tx": "0xb304c4a2e2e82336c04ecff79653dbd30957a54e8836c76ffa3ece045a807c9f"} +{"index": 108466, "batch_hash": "0xcdda84bb6f2ddc7e51fa771383c07f77f2da6770e60a81d631392a575a9679f1", "commit_tx": "0x52d13b026615c673454beda7ee25aac5794b4e582e8425d68c7ff9ca38dfd4ae"} +{"index": 108467, "batch_hash": "0x41b295e9a1f5bbbc0ee491d376254ef8a3c53bf6477ecc694366a10c1d72df3e", "commit_tx": "0xd43ebd5fefa7339d57653fd953b4adc1a51fab9717123620494e298c8a822046"} +{"index": 108468, "batch_hash": "0x5755f77f01a156040fbb9e867c8588f606a6e9da5622d520d641beddd5846681", "commit_tx": "0xf9d5dd262d05428bccb3a986b650411085fb326acecda1079749fc79b62314c7"} +{"index": 108469, "batch_hash": "0xafd2571eebe21a556a8888d4e42518e62f6e032f406c3f32ebd013ea766423b5", "commit_tx": "0x12f0b4f100367660a2604fd7d3cff7c4610650e36fe6ada71cb8ea00defc2086"} +{"index": 108470, "batch_hash": "0xa70e39c2c49ac2cedbe8123f12f4ab99594aed5180687563defc13e757ec381b", "commit_tx": "0xf9ecd220ec5df4cd467e0f7d724be4424cc160eb55506537cc5e25278560343f"} +{"index": 108471, "batch_hash": "0xe87e6e3a22093cd0be8db5183151db307ca097a7222c2600686d4937325de115", "commit_tx": "0x19edfc54f01ead0a057e40b184aefa2c0dcd51642fe191dc0262ae6d3f90f225"} +{"index": 108472, "batch_hash": "0xeda9b8b6ddfad345256ddb13ae8a84c7ee75fe8f290f7a1c0fe3649ea27bdc9d", "commit_tx": "0x3057cf93d8b6c9c28094c4d04e83e192db59a3d64db5d24c27bf01a6adbe01d8"} +{"index": 109653, "batch_hash": "0x5391cc31aebcce814e89111522aee547d66fdf1428e46a461b0781f8800a4f7b", "commit_tx": "0x606b21983ee9e6a0832271c4d9aa7b18e6930d5249e8364b170a3f896de4d452"} +{"index": 109654, "batch_hash": "0x800a8d934ab1701d3f7ddbba7ea7a5a0086f39830c3bc70dd84aace92f81f9fe", "commit_tx": "0xdb8b22d658c6ef3c654f66c3d249d2e96f757ef7e7a876ac9f7a069d4f8d1b62"} +{"index": 109655, "batch_hash": "0x94c16a5d277e41e4e7096bbbe6544ebaec15594fb03c7c656c7186bf0498e147", "commit_tx": "0x4089e0eb262f58fcbfb4da09582167bb8febe316ab66448d234dae797ee6cf04"} +{"index": 109656, "batch_hash": "0x0c1b47c4aa12918253c100b98ba392694b91e13d088c54672a9890371848d91e", "commit_tx": "0x2f353688d4b9779113f8cb0b3ed98bea2264da9d98e87a92fecf9516a5b3811d"} +{"index": 109657, "batch_hash": "0x38886b7380980d505239052305c756af3445e8c0255be42e07f081be252523d5", "commit_tx": "0xab42b05f1a48bbf9edf160a284367f4a613db906610efaaaa5679453a64b93f2"} +{"index": 109658, "batch_hash": "0xb6ef6d37b57e4595cb987669274430116a2e3a696d65fc772771663421a9247b", "commit_tx": "0xd2f2db9db91f0a70f9d59ee06fb527fd0705326b03985df4997759d115e3fb72"} +{"index": 109659, "batch_hash": "0x7b568ccc74533f556d94d417c89b7facc11b7d7244082c6fc3c825ede519a8c3", "commit_tx": "0x1d144b080c7e0561f8f0b0ec81a1b14bb798bc15a95e30515e6b19bb64e9dc98"} +{"index": 109660, "batch_hash": "0x51ef5a6ecb43bca237731bcd9d39980082d3b96cc98e9ced99a7f0c88bc4a105", "commit_tx": "0x493312eb585f286481dbc3be0aed4532f80ec38e6411a9ea63757b2256f486f2"} +{"index": 109661, "batch_hash": "0xa1e4b459cc0a3cd82ef26c3a76a08683948713ed51a1b4a58b67c5bdacb3db10", "commit_tx": "0xf35c8566030b2e932245d787ab94fd7fc5acdc274cdc82f9d45caad140d35a8c"} +{"index": 109662, "batch_hash": "0x9c29ea2146ea4cc47aac64fc42dfe68c5cb8b729cecfb777fa5b877fd56f321f", "commit_tx": "0xf40ac08d0cfbe40cea38a26c9e48e8624a846565c81f7f609b29356bfb2b0591"} +{"index": 109863, "batch_hash": "0x9c85dd4fa21dc081b2b8405a50312a06c22bdb594a8c5e7e1edcd5d9cff05aa7", "commit_tx": "0x857ce5ea46b9ce43ad5a21deb9548f45ff4acdf5371c4e73381fd45d63c4c62c"} +{"index": 109864, "batch_hash": "0xb33742370f04e2b5e665944b624898e1a7bcbf81fa0d863154a3ef831acc2994", "commit_tx": "0x30b6389f613d0773f1bdd883a413576651fd8f2d6b2603bd73603af230597baa"} +{"index": 109865, "batch_hash": "0x4c27c3f5bd49c3a576bffa13f7da2a71233a781c042e6874a4bdf8fd2f035bf9", "commit_tx": "0xfaf6a962151afeb9d15e4c65494bbd8d0d37c0425fa808b1cb1a2769d14d377d"} +{"index": 109866, "batch_hash": "0x76c9a34b6de6261ec8e39ed7556478ff6f4fe955592b7fd26577e95d128f9560", "commit_tx": "0x834c0deea073548807d0c1d3f8d4086c905163c074e12d8ca534e11d9b1a365c"} +{"index": 109867, "batch_hash": "0xe0304b90e1a07961f43ff33dd584eacd08bf451e8adf906f005249db3814f7cd", "commit_tx": "0x7f33838f4bacb786c38e37f1a69b41f3082091b75caa5a9ab3acf079b839c07c"} +{"index": 109868, "batch_hash": "0x8b27c89b49f7731eb287a0d85e76a835f395d38c196b7503e0fa42a64577e40e", "commit_tx": "0x821d678e67085c07b63bd3ed11fb6a91dce6af84dc3e2542d37061088415fe90"} +{"index": 109869, "batch_hash": "0x11f233e688f804eb4fe839f73022b466a7038f7ea2851f4a4d47c51d9d6f9890", "commit_tx": "0x3f2e568ea46974d472483f853b195b3de2649d7b4104c9cb9e19d381357a2345"} +{"index": 109870, "batch_hash": "0x182ba0c2b906612e3463aaf68160725144eb4b34284b30b7a899c1a0060ad28a", "commit_tx": "0xb15cfa5f2265a1eb3f613af759290188fc2a5b1774c5518b44e626f754112712"} +{"index": 109871, "batch_hash": "0xaa1fb4ae3eafb1941f28c7f90b365f0159cbd33ae951dfb0277eab06f9fbb104", "commit_tx": "0xde239f590d5d11dcc22193d3b8a6f7df3de806eb7da393d67b0204b24943fd76"} +{"index": 109872, "batch_hash": "0xec40b31b65d4e5ba294f1213c26fa3125bed0c6f975227a1cbc9259fe930d5b5", "commit_tx": "0x9b911712e40c46f4691b9eb38d9aec25e524bacc4997bf1c90b660dcbc5144df"} +{"index": 111123, "batch_hash": "0x3346773dbaa0fddef9cbe7b9a38d289d419c80110a19ec857e051dcb638ce34c", "commit_tx": "0xad2653bae1d28e726c26bc41f46be7fc518ab2d988fde7f882431dfc820a65c3"} +{"index": 111124, "batch_hash": "0xe981cc98e0647651befbe2f9dacb7de794075ffd92c4911d2aaf60693e8c682d", "commit_tx": "0x6f4d4ddb90eda491d2aa34f9839454d393fd2deb2295039d539bc5459eca2f80"} +{"index": 111125, "batch_hash": "0x26273311bcdd72de267059f21e17511e7cabfd06ae68e56a4394ccd1738a4ad0", "commit_tx": "0x5e9c7b3663bb04eb06dbc11193020820811a35eda4ee9a46f8f54ac88e9f60f7"} +{"index": 111126, "batch_hash": "0x05f8906899e17df3c50c7b570d736dd9d0a2cffc868df486bc550a806b19b8dd", "commit_tx": "0x5a4896e200ad76131a3c2654c5b591a3205e0357777629595c83e27f1c686b49"} +{"index": 111127, "batch_hash": "0x9d91158bbd63832305426928d9ee28273f26f172cc45a6a9a3d5c70b8b8eaf99", "commit_tx": "0xfd3836a3d3d16b04a50363b64fc0374b45b2549b7810e2901a15a41b77e84b1f"} +{"index": 111128, "batch_hash": "0x3ccf6b4c8dcbaa0cb5e2e625e097bf3b5ecca7d5fd2fd871d0f69bb1c4f5b0de", "commit_tx": "0xd97b52dbdf07c8a0cd8d8ea24bca444ac70433b29301e1c56be71997d31460ae"} +{"index": 111129, "batch_hash": "0x005e629164062df7e69fb73009d6d2e8acb160c8b903cd5e543893ff74fd713b", "commit_tx": "0x69551d7e9a4c19bad5ac53200d263f2bbd47e902e890242597aea8fea38b6a69"} +{"index": 111130, "batch_hash": "0x4f3bca78aaa73b287631f352ff217b028d2d0dbcde2d6f1ec18ff72d57ba680e", "commit_tx": "0xdcb9c5d6c51abf48c91044bbd72b6aa927b528f5b0706444a8dd71a2531ed2eb"} +{"index": 111131, "batch_hash": "0x5db04a198f341ce62e62151dae7c18266dc45f4142045a6bcb8e9f6e282c6072", "commit_tx": "0x7c21742a19c46971a77a7ebd4f4663aedc3bf74ca34b066c0407e46656316b7e"} +{"index": 111132, "batch_hash": "0x1211b98f2bd8ae4dadda44d8922040b9d866853f40968fda80b3d874ce349c68", "commit_tx": "0x0321276efc4ca198966a1e64338d1fb47eb1db2d7ffa68ee62fddd32075d01e5"} +{"index": 118343, "batch_hash": "0x577fd196b6826d283b944360f953a7e419ff7b4a737f48b4418de96187937b8a", "commit_tx": "0x3e457325215c4094c7de7a07bed9232bbadb0cb1b39b2e8028a3336bfa097776"} +{"index": 118344, "batch_hash": "0xa2f79e555b1d4437ab550f4c1c5f88a8158fffb9fbe7aad05584950884a5e173", "commit_tx": "0x2cc938cb2cebc844b2d1cfeadfff52f79080067daf725915be636f9e0d57ee6c"} +{"index": 118345, "batch_hash": "0x57a2bf7b57607ec733b4ad0a7bbf710cb94a9aaee305d865d50586bc2caaef15", "commit_tx": "0xdc12952e03f4916a905000b750f48716b9773d57c74a0eb5e5387a1e6dca6ca1"} +{"index": 118346, "batch_hash": "0xa1e7ce270bd13f9ffe4d3c9968d7878a399bb61d28929e9b2898b7dc21e96151", "commit_tx": "0x1f82e5f3fa43f86df43c71f8a03bc3c5751c929b1c99cc0fd4caedb5d962a0da"} +{"index": 118347, "batch_hash": "0x8abc4941afb8759d9840fdf1ea6d7f7d5b2a6d991f946f3becf4973d895c8aea", "commit_tx": "0xc1683d440966944a7ad297c42411c772a024c9fb76b569c4712dcf3a19fb78d7"} +{"index": 118348, "batch_hash": "0x3cc9963574c79fb622d0cabeb8c0e249bf8430316b7871498d8c3829a29ae592", "commit_tx": "0xa184a3fef49adc43ead046dfdce48d252f0a6a7b8f3eba0f6ac4fd0691536d48"} +{"index": 118349, "batch_hash": "0x33230c6da5396544e673013ce1be229684320744f924a88392e90e2f8c554dc3", "commit_tx": "0xe88354d1c93cceea9098294d8c76b3dad015d10bab69ee86d258b7deab48cc90"} +{"index": 118350, "batch_hash": "0x9f7a51e459b02297d35cab499e4ee422913b6fd0ada527c4518fff4dd69f062e", "commit_tx": "0x67f92ff2f6a1e875c37b3173fbfdace819223dc785f555d1e6970cf908360c1e"} +{"index": 118351, "batch_hash": "0xd42a23649c0f67898945fb4767db5b3967f0330aba41a2d6d426d0389505433e", "commit_tx": "0xc40baf701d222d3175e1a0009c2822fbcf1e5ea14607076192949cd4f3f84f23"} +{"index": 118352, "batch_hash": "0x90e57437aa3a565d576dbdd0b145581b61a23c78e9df08a9ecca9b9b7db4c588", "commit_tx": "0x4b2725f5d4e2e746ba53c4295005ae1fe069dc03077f87d32ad85d03b1d47262"} +{"index": 118843, "batch_hash": "0xed549befff4f53ccff1793b7d175d1a94f876410ee1f052bcb7e24fba7ab29ac", "commit_tx": "0xdc9460a517ecd315a0b25e9335f62055ee0809c0fe13e5a70416ad606c432c7b"} +{"index": 118844, "batch_hash": "0x315e7539ceb9b323f476d23dfe6567710ca56190d7a63047d53a4c46a25d61cb", "commit_tx": "0x39186e56f1e17d6d4aabed40ad39e49147aecf320ff2596d63e824d006a8c68d"} +{"index": 118845, "batch_hash": "0xd3575cff1e388ca297aea4885708bf4ada3ff1c858c8bb73a888e0030ad89641", "commit_tx": "0xf0f33c9d5e308e5fbf6339aa120ed66bf6e3514cd636a27b3762cedf70fe2d6d"} +{"index": 118846, "batch_hash": "0x65a7d42f423283c0bb90bb6d06eaead81ad19b05f266e0e78037e1cfafee8645", "commit_tx": "0x856337667408e985a3a76447631ae7e3dc5f3bd568fa9419b7c78f683d8ec51e"} +{"index": 118847, "batch_hash": "0x0fe4f995c1fe02d38e521bc8fcbaed38ff35e412ad5917a2fd9b79ec744c1aef", "commit_tx": "0xa4eb09308d9a572c02a00a58e041a526df787dcca93c6a02f247566980931e9c"} +{"index": 118848, "batch_hash": "0x890c9cced4f23908490f7b973a765c2619dcddb0a9fc276d496a06a433f5c040", "commit_tx": "0xbb5a4b8e5a69b8f71cdb8edd73bd436afd523ee413fb840e94cc530a3f18cae4"} +{"index": 118849, "batch_hash": "0xbda4c33deefbaaf15d95347ff921bcdcf29da38b90829c48a4941d601f154222", "commit_tx": "0xde6f5104e0580560d44f1c65d6612a68bf7a60f83129811f933291de50f5b531"} +{"index": 118850, "batch_hash": "0x176290330082c5bf21bc072683b4bcb9108e75e99e3805a31375345da1985d24", "commit_tx": "0x6aec8956ddd4004633aafa0f8427fc0cbb7f27b9fc18637125e3733c497a28bc"} +{"index": 118851, "batch_hash": "0x71f825eb2c835a54fc6366d05436a1e12d39744260a372e3cfd0f1c25e065325", "commit_tx": "0x988b7776628f0aa32619964abd34a2887b1e274636dd7534a775a2f7113dfcd0"} +{"index": 118852, "batch_hash": "0x89a44785022b073642b8a4ce2557a56e6833de7eb75bcf9c12b8664ea81e1697", "commit_tx": "0xf374b472aef4afc6bcadc85be70f460da9de92093a9121ed4603c8045ac5819b"} +{"index": 119693, "batch_hash": "0x8a7331316693e75f852fb7fce148178ad08ba171e8c5361379ee8852cc3084a0", "commit_tx": "0xc5f797470409ecb7bb3a6f400e752bfab8aeda062c21d12edee1625b6d9c3dcc"} +{"index": 119694, "batch_hash": "0x821ea4404a15ce048051f0de4605ca0c35976b45ce932f0dafaa35f831df860d", "commit_tx": "0xfe25b0da465c414ea2cd4f64edcf9da9dab3324fbc254dd96122f053920e528e"} +{"index": 119695, "batch_hash": "0x831ec2036e6412ad01238da3ec38a366a9dcab3764c89e2df1fbdf95b38d89c1", "commit_tx": "0x6e9f027cc8a7d005c643b373a7cc96db7629050119a9f34ca07efc95c8d1afa8"} +{"index": 119696, "batch_hash": "0x5c91ea3d95abddcb5eea567cacf85a1579d006092d8c78045d864ffd9c043a5a", "commit_tx": "0xbc9f93a9817b107a72c6c697e3b8c09025e31c620f0a73f664110873e7709eda"} +{"index": 119697, "batch_hash": "0x5ef4d0e803ceb2418ead15259121b30541999b37a0cc8cc7b23784e493489925", "commit_tx": "0xd16cc614d7d367506ea9fe4b571bcd103bc156f6d9307509e9b4d46d3116d41c"} +{"index": 119698, "batch_hash": "0x7685ee2cf7a84d71dcde765c89c8e0025413e874aded9ccd6da477869e117dc7", "commit_tx": "0xefd276b2a517b6fe11766e748a262a68b11345fdd1f997ae5a6bb846712f96bc"} +{"index": 119699, "batch_hash": "0x5b52a3a7b9634038f2f13e44bd5ea9f2399abd53fed337b4f9ac15341d75c24c", "commit_tx": "0x7cbf60e3028c459e1395a4c9a17c3021de3b2c41b86520ee3856cebd19a30e36"} +{"index": 119700, "batch_hash": "0xf7114007f7929bc5141bdbade7539d1d63f35269f990b723423c0fba6dfbe70a", "commit_tx": "0x92a415e217d6971d14aa3e34d398356f33731f0e86f902dcf7fad1df3388070a"} +{"index": 119701, "batch_hash": "0x45f6265fb693499f65a44c9bd89d8e6a972e0e51d37f5a342f50828fd4edc8eb", "commit_tx": "0x449d1a8f4ffef8f18dc31094c0cf2240949ece280ac4ce23aa2b6e40a1fdc4e4"} +{"index": 119702, "batch_hash": "0xe8d3c74ebb336feae3a1da9e4074063840c11a89ac85c104a6a146fa3037ff55", "commit_tx": "0x8fd4ecc3cdf2d87eaf8bcd3b74373adc00edba204bfcc1c0fada5d62217e7d8d"} +{"index": 121843, "batch_hash": "0x89aa0e6ab8d2345c19522628b8f5b05530c971afc849d4578485060cb1fe9254", "commit_tx": "0xdac5b8a2df1bf34845434f90d8d8ea0acb29658ed37e9db3d7a4303729e3edfa"} +{"index": 121844, "batch_hash": "0x7819ff51143a8aaa72d937e35f881004c5d78266c53c63459e5cb27a7650a4b2", "commit_tx": "0x1916ea82bbcb7ec70e6848afb91cb7f124ecad03a4202d0a489400cdef372930"} +{"index": 121845, "batch_hash": "0x089661b72557db5c32e121b7b41fa1831b377d8d26e5425faab846963cfe98e8", "commit_tx": "0x063d460dcb266f825ac5a94e36bb8d5b5fdc3f8ec894b04b943ad0d4d3eac831"} +{"index": 121846, "batch_hash": "0xa0f85953e06a080207147654da8ea41aaee607b6e63fdc46072fedc4f87637ed", "commit_tx": "0x4de67ac3c546a50e8c7f1c6e35b87c4c6656c28aebf13a151020c69dfa9f6c78"} +{"index": 121847, "batch_hash": "0x0af9d14b41d181535f1047270df79d840cf41da0f6b970ad142129e5c6a30541", "commit_tx": "0xe6529226eafac36907b2af96bf95a25077ff2f4fbf75a7dc486ce67ce77ba355"} +{"index": 121848, "batch_hash": "0xcc10ea0b50d95c59341caeac0fef36ac1006085b20849cb62833fe4891887121", "commit_tx": "0x7c8e967f433083fdf181cfbebc1d2cbbfcec54b63be96352cf9aae2dc380c146"} +{"index": 121849, "batch_hash": "0x478cb3c95a6fe0d010efc31511de26254cbbdf8d3366bc276e21754f014c539f", "commit_tx": "0x87dfe513ae02c85e4f7211b6f2db70460189ce0cb84965eb7e53ff10fc170e87"} +{"index": 121850, "batch_hash": "0xdf1bfcbbc27febb49d8dd544ca4ffe2cfe59a16cae4292eb0891c7b4e956810e", "commit_tx": "0x579cafc7c7ef9533f16ee4cf509f2e97dcdb0caa29a20ba848a168177a0c62e8"} +{"index": 121851, "batch_hash": "0x8797a0c44348c4f84968dd96fdde82fb32059dbb21821c17638a342f25fb009f", "commit_tx": "0xf72a86e6f419fd28ccf83dc358b91af1c53925db530ee32112370938025cc70b"} +{"index": 121852, "batch_hash": "0xce14e9ac07e98fd20fa87708b03203bba34bb30513254d937a6a8b64dea31e0a", "commit_tx": "0x391132b405f8cc85c7ebcfcaf83141c03cb4cc44465c21c871a4d8358523ece5"} +{"index": 125643, "batch_hash": "0x68c961bd6d4abd0c88a02fb44ec15f0e26662f5e33aaedd8a46dc85943681a11", "commit_tx": "0x1d8558bc02cd6334dc2d66196591df375d67a0e7fea8734aa3e8d81c65e3bd4a"} +{"index": 125644, "batch_hash": "0x3392e042d98c9ce743a40e1e41a10cd1b5f8742b567897f09c95a4ce0678e4c2", "commit_tx": "0xeed8f5bc29e156dc73e504da1fcab0616a8d104fefe9e6d078b926e6cca05882"} +{"index": 125645, "batch_hash": "0x91f5bd9bf89cf695d7b1e1194d059f0b260fb1637869865534e2ad2ae4124c2d", "commit_tx": "0x22053b21c86c844a382688fe682acb7a149f99b0b27b2a8db5c2b936970ac62c"} +{"index": 125646, "batch_hash": "0x239e5fb2bd8f6ed40a8b8da3555ce5bb1ee28628cb65167de650734351f1205b", "commit_tx": "0xb5451ba839e3de29a637304e657a8e892dffb7822e59e3ee444e9591a451dc63"} +{"index": 125647, "batch_hash": "0x898363279d343d542d92db16387d70ffe43ea777a0a3c250d813c9a46c5d7df7", "commit_tx": "0x46529bcfe3c6be15cf2e11d38f466ba856a252a1458d63af86fcfe724c641670"} +{"index": 125648, "batch_hash": "0xad09c652a16e18f7cb3617f4a24c51293a946552ff9196354eb6f132bf3bb931", "commit_tx": "0xf1c8ab636e2348e7d6388b4d39438f6807d942f72eede75b4e25bf0e34edc6fa"} +{"index": 125649, "batch_hash": "0xf71bd1b2e9ee472aaa6c26e29f6d0bbe81ee256d40380f19cf6dba45f1b940cf", "commit_tx": "0xfc536d16a764de3e1158e193b169c61dfd39c269c49ea457b6b9b68c8645343b"} +{"index": 125650, "batch_hash": "0x625d2526558096627398ee613889822be15b04d6e2dc6cb73718eeee0108d6d7", "commit_tx": "0x0443a217c2a1ac90cea87f3c9f463d499bf839c924a70333f50aed2132c2a9c6"} +{"index": 125651, "batch_hash": "0x8bdeea7c68cee1c578f5e07ccb55158e9341095e356e5933d97d64bf9334e5e6", "commit_tx": "0x55e7efaa218a14514ea40424f9654959fcb754e8c6c6c74650f2a61a1af75e59"} +{"index": 125652, "batch_hash": "0xc534e172d597a1546005b4f4223d2ea0ffdd2930d9f4435c948f8f30801daca7", "commit_tx": "0xebba9775c8a0807bafb7602d2017a8f16b9d8de326b775822b719aefb5a9f14e"} +{"index": 138853, "batch_hash": "0x67d451c73cb5bf9b4df67a929d75cd9eacd3549e65f15c4d849ff3022703102e", "commit_tx": "0xfb3a501bb72cf3435beba2c32ebacdc70d19d538b139c2701334a0896f937430"} +{"index": 138854, "batch_hash": "0xcac22017ba283106da8186fd7ab827f50d823d89b68e89cfbc360f12ea5bd249", "commit_tx": "0x97c47612112ee5f3c5894595540c11ee67723d5240cd6f6a67118a1aee65ae6f"} +{"index": 138855, "batch_hash": "0x536e45a66d97f0b309b992adcbf79b107ef4ab1dbdfb24bdba3567b22b152536", "commit_tx": "0xbeaba74738b6f751855feb72160f8ff0aa14784ba6698477c8597f6c7f5ccb17"} +{"index": 138856, "batch_hash": "0x3091a9a8260d882c125da50298609ee1c0507bd96865fac622002b182e00a609", "commit_tx": "0x329923737bdcb1801ed645b755d8d781409625e2aa6183ee36db9f160b2ddcbe"} +{"index": 138857, "batch_hash": "0x7b8fcf9c7879e3659525749d41f160a2c6621ce333739ae8a57075f2c96570b7", "commit_tx": "0x07dccae51bc870af36f28b4004f51fe0533fc4cafda5d88390cd81c542d2ce24"} +{"index": 138858, "batch_hash": "0xada47889a2d682c95b0c3f56a0a03bc8df2c15c8b8d0fb61d48d11614bb6c5d6", "commit_tx": "0x928a1eae242c4346a93fd29e971d5b6de33a056c2a044d1b6dfd7e45df4f6495"} +{"index": 138859, "batch_hash": "0x2598a16781fcda16c6b4aa7c99e0fb60b4e7f86cb1afdd0be41dd83b10521f25", "commit_tx": "0x6c51015042ee56161439d13484589568a69d20900d87e00b5124a590db47f64f"} +{"index": 138860, "batch_hash": "0xaae96de9a3514c44fca01ef6035c88c02ca782265e7cdde416e5edce3b527441", "commit_tx": "0x657de27de6554f11928b066c65a9848df5ba563c2516c70568cea6573197a31e"} +{"index": 138861, "batch_hash": "0x0e2a3202eef8c7d9cb133ac1a92afb4c7ee5405d95f64b108cc2dfe8370e15c3", "commit_tx": "0xa0adbe26873b96e213484c19e4f5efa907ae754644c94c62bc265363d8fcbc46"} +{"index": 138862, "batch_hash": "0x15a4aa639416c1b9784a9f359b9a38c4dd079dac8d4573a020641eb21e1b0c6a", "commit_tx": "0x81c04fba2bb281a191b18525ca527d4096f80ab7f97c39d54cdbd178d22dce4b"} +{"index": 143943, "batch_hash": "0x77c41a7e6446fb5ec9648e2a37c216895190c3df247aca1eccb4ae754a36115d", "commit_tx": "0x163c4b60372467f4de13351a3ff54db56466ccbe445c949f8dfa4cb6b96b7083"} +{"index": 143944, "batch_hash": "0xd7935de1e4f1d0c4ad127ce24535d1786b5e929ec418fcf796473e0e371f5adf", "commit_tx": "0x83f56b5a264c0b68297c2392be4fddfc22e08d1782ce2d1101e7748e7bb6c90d"} +{"index": 143945, "batch_hash": "0x6e1e5d850c1d9ccc626b1659cd6197298bd7939c96352635679b59ef393cbe1a", "commit_tx": "0x59e64589f5339450b3abd9a5312507ff12504388ce7d18284a479b86539fa5ef"} +{"index": 143946, "batch_hash": "0xcf709ab03e26beebdeca2f6d2b92029e1b8e37373bf696b8f145807914a3728e", "commit_tx": "0x982dac6e26fbb393c7a9c18a14ef1b0231181eb610097195a6d50cafa5d78baa"} +{"index": 143947, "batch_hash": "0x0df6fbe8264ea7941f41a1f04cff3188ea494cbec2d99a14df3bb4d9472aa941", "commit_tx": "0x57f6830681a2609f1028c206d8cf95e34de1ff6ba7e64f34291106ab39cd5377"} +{"index": 143948, "batch_hash": "0xf00561304989f798a1cf63e2bb0387aa7356e6b2879d0f74d6151aacb40ec3b8", "commit_tx": "0x1daeda09d36b7af3619b9c05a96be5612e2de09e936ca67f29e695439a4a8d81"} +{"index": 143949, "batch_hash": "0x64530c0099fea9669899a5e4a915029b250a95e57ba83f5e90b2b10b5ef634a9", "commit_tx": "0x3bcc376c70ba70e65e2cee955fa82d1775346a05956d97eddb0118e9fe9c2a6c"} +{"index": 143950, "batch_hash": "0x498944fcb7a8715c863f6dcf9a3a051ca2c325ed575444a340030d4f37fb05b8", "commit_tx": "0x6e06d4c28eb9a03fa2c37beff1426a2d25662cbd16348d6217e75060e0223c2c"} +{"index": 143951, "batch_hash": "0x24f745da1b336a0a18d8dc5ae5c111f6dfb555eba189ab2d249fbf109d4a8b54", "commit_tx": "0x5509bac96aa6817e1f1cfefd14ff8168340d90c5286a32604b3d891c0532bfcf"} +{"index": 143952, "batch_hash": "0xdeea39195d1b6a0b96cd7e97e7704d1268e811e053665bb75b3f5baeeb077ba4", "commit_tx": "0x7b9f11bffc703d3d32d1551eb910ad656633db5f7651f022591068d9a9d5a807"} +{"index": 144023, "batch_hash": "0xa189ad0d3debe2e5c5686e7c93b64f807d02ffe8c96fa87a0df6d59659ee823a", "commit_tx": "0x35c91149dd33c7e5ade4d897dbc484c276d2a43601f52a651902bce93ca14b2f"} +{"index": 144024, "batch_hash": "0x20c6f6fb71a374e82c7fdd569533d5013ab1443b41a43a8ebc92fa6ffb785cf0", "commit_tx": "0xe8c3c00461475f862a0fa24bebcb09946ee75aecbfd35d7a2b6c95af7a0a6f9f"} +{"index": 144025, "batch_hash": "0x7b7e5c8aa04debb973b4e6a2bb2f09f0e17093fa131dd9b07515b91565ff255e", "commit_tx": "0xfe8aa8538445ac7bd4a843e59e77e9ce3c9c4896e429c359796f1c38375b289f"} +{"index": 144026, "batch_hash": "0x1b8d12d9527f8b407a10a5627120e75b45e41c3100666223c1573f76c547dfcf", "commit_tx": "0x9bc523c24da0d3b87e81376b35969b1852013a5a681e073768229cedd9678673"} +{"index": 144027, "batch_hash": "0xd2bf3b3f2249e42e6c78c84992d015adf89b2ed72f33960af02f0704b30549aa", "commit_tx": "0xad3ddbe369246d77c90f144889124ce8dc3cfc43d3942ee3307e27b2fca89974"} +{"index": 144028, "batch_hash": "0x951ba921502491252b384af155d6aed2b6de068fa9d6b093080c03177e74dda4", "commit_tx": "0x754539f73fb4ff186a8300ce20017832d4277d6a7b24759eea8520891e9532ee"} +{"index": 144029, "batch_hash": "0xaf26f4d8775c27d3d3552f35afa88a97f2837648132a64e403b7f24474b18ab1", "commit_tx": "0xf02a827aebdabdf6acc14faa885466af4be2784ca252074102170a92271f443b"} +{"index": 144030, "batch_hash": "0x0f46c67252b4777d2ec844ddc927de17597b48a6229ad6dc03122f725c0b793e", "commit_tx": "0x99e8c8af7167a2b0a66a404f0b6cdb329e1a31b40416147e36f368d19da622a0"} +{"index": 144031, "batch_hash": "0xd1369a3e4ab4bdf911646c5700dc8a968a6328bde01eecea3625fe5b7102b564", "commit_tx": "0xc90cc0a5632f99f82f5fec25881adcceac83d787b23475ef1480ddc7ef5494cf"} +{"index": 144032, "batch_hash": "0x62812ee2e89949f9977cb079d6696bb301fb5836fb7c94064e7d1be343d3d29c", "commit_tx": "0x47f0675b70753b5714d0a341fdd7d9ea071f812477a43705ee0a25d831c237d3"} +{"index": 146013, "batch_hash": "0xa53f6419d58032b992ab66f75180d5249c637909ffae36dd34c5cbe648304f58", "commit_tx": "0x0b07b98a9713eb450bc4e9ad3eb811b9995c6a38f7633c24c24f9d5cbb2d88a3"} +{"index": 146014, "batch_hash": "0xe45cf4bed12944928f08bbb0023f0de60b6538299545132a9f3f5e18d5f4949d", "commit_tx": "0x58c14d30e39aa419e5b76b839611d01a773410c220d3b6101f8af89047e74a9f"} +{"index": 146015, "batch_hash": "0x1ba02d7c2a28c75d4af94ef3f23234da16f3c94453b3630c359bdf3dc824b50b", "commit_tx": "0xda5d643ff0e3de50114ef0a2a18a923338da87d4a9aa8501df340a61cb0c4745"} +{"index": 146016, "batch_hash": "0x9471350ad2f1bc00cd61b10f64bfb825006c7f399fa9479a46648cbd666b9dc3", "commit_tx": "0xc3d03b029a1f565052e0ccabd5ed3a07b6f70c66713c931006fcb1a961b89ad3"} +{"index": 146017, "batch_hash": "0xad95592f740c437499e3c0e5071fc2dddf1b76637879153a3e63bbbd4dfe57df", "commit_tx": "0x9dd20fdcb5c59a22c871d66816a4fd49cb371ee5f01520ad63950099f6a48d51"} +{"index": 146018, "batch_hash": "0xec65317520d601abd36b580770c36151c77e3febcb9901bffa81cf269c592269", "commit_tx": "0xda25adbb8f6eb6b9531562959eb1d758beb9f4341ffe99e380b8dabe3692ddaf"} +{"index": 146019, "batch_hash": "0x966118112e39089f8bae223f8fd4ce31fe864f141d68a7582c3346044f9f37ab", "commit_tx": "0xe85ae075bb6eea6defb575f2b25bc5add3ff3af26becb3245c9d5f1f083a1c7c"} +{"index": 146020, "batch_hash": "0xe0f8f461e3746677e8a9e7e76f19b201843ee3b684b347e89cc4c786e90861db", "commit_tx": "0x9af9a3a2b7fe461c52b4585c49383ff6ffc283b7cee1fe6df95d205b20747f32"} +{"index": 146021, "batch_hash": "0x22103c23ad1934f5853fa29ba6db1e2cedb30f16476fe217f5b9a2ac5043d7bd", "commit_tx": "0xacb3031ffc6dd0293a912cae09d21dae1ff9c0d45ea446f61ed5c9ca3f70d5a6"} +{"index": 146022, "batch_hash": "0xbf922479654117789a71fc1d8794057c16bf1c992707b3fbdfb854cee1105518", "commit_tx": "0xbff61e3dc35a44985213921729fcdd96510c18690ae32fed6a3e01c41c4a54c1"} +{"index": 148483, "batch_hash": "0x1db0cf9847d27eee095ae9f2780b52645aab0cd08e4714013e7b9f5d42705e60", "commit_tx": "0xa7e1308ef8eec2049a374344bbb77d67e7a974d106afc3aa19692c77b1599751"} +{"index": 148484, "batch_hash": "0xdf012ec92163f3d2aeb27e8baa607eebe223ed8b40c71e8718e03deee7f6c225", "commit_tx": "0x71161d578f82a7f1158f2de4dfdf6aa9b57eda6b8dfd1bf4f570d799ffc5389f"} +{"index": 148485, "batch_hash": "0x774513b8a73988818e3f4366403beba913f81bfb005c69d3084eb99b22ff005b", "commit_tx": "0xfc94c3e50fee7cc551d32188ec33081df8a0f33ea198f6d1f863059d646ec0ae"} +{"index": 148487, "batch_hash": "0x6a7a98b41f0f77568730d03cd417a331ab0717e1426e7af401323918b874cf40", "commit_tx": "0x1b4cde0e065862f2aab26dcf3d07848eb87e4d913d40cdb95100334ca92c5cd1"} +{"index": 148488, "batch_hash": "0x5bf6e408e6f93bd659090a3a0ea280b415b33668faf1a74b78b910314a31b272", "commit_tx": "0x0835804e9bfd5020bc076eb9a1d684415e44d4913928006a416550f6d671f9c4"} +{"index": 148489, "batch_hash": "0xaf9955d47bffab0d38b1b29d3197e5160bdd14b48a9294c62a16ae5402e8afa3", "commit_tx": "0x9a6bde6b5995d73a3c193eb8708469e49581a6ffd3c98f085dcc177741634af9"} +{"index": 148490, "batch_hash": "0x6a76306ed05877c82e0daeb5f4feb69331ed1bdbacee4d28f5ba2a702336b90e", "commit_tx": "0xd198e7c75103e588cdc22ed006d43130f6fc83f74985edefa969fc961166fe0b"} +{"index": 148491, "batch_hash": "0x85ba38731c849203ba1006ce43ce2dfd40293204beccb77051fbbac72c5cfa9a", "commit_tx": "0xfc930002d9f15f3f88867c0cfd2f493b942e07ea0ebf1a3224ca2f8839ce4bba"} +{"index": 148492, "batch_hash": "0x7799b1147b19eb6aef7db2201bf47e6eb42c5c570d0e9f5f55457dc6ccb2343a", "commit_tx": "0x7f772366dbf631f1055f656fac4eba615b69e7c54efd1bd45b49e3c708424723"} +{"index": 153583, "batch_hash": "0x22f811b07ab647899284eb37636a87b817254e3c9dce892c4ddacea7e8f9c6f5", "commit_tx": "0x3a8e923bb17a2cbb3f716b190850bc8aa1d613d08ca434bee33883097104b80f"} +{"index": 153584, "batch_hash": "0x45de76e6b64bc0fb50a55c21afd5b9e394f6735fce49b22778dbd31330eba368", "commit_tx": "0xc003e741a8b6769d6f41c7e6b39375e783c3f8a7963d58f82033a76016400394"} +{"index": 153585, "batch_hash": "0xa03a0ff2d1a728f437c95fd5309b06dc71d278915a16ed81c47d171869e6d823", "commit_tx": "0xd46aca18234b727126edb66dfa4a8dacea43b992e8e846bcbcc2b28f6ad1009e"} +{"index": 153586, "batch_hash": "0x0416e6ab688b4f4eb72db7d375100ffec3383f35e47821618d1d1a75f704f92d", "commit_tx": "0x1b700052e901a04888b43db008bf7608ef13bc79e86dc328b0594aa12890c3aa"} +{"index": 153587, "batch_hash": "0x66123ae6159d4f5ce8abe922e2a8af5a6e4af40d159e582f12d447f7fb665834", "commit_tx": "0x3dea0d6a0b061a7ca6cf3c66ca20008e3a878c6c715f1aa718f578fee160fdc3"} +{"index": 153588, "batch_hash": "0x3f57fe5a5b8edaa60a1af544798fb50d748f819a386f891e0d9b65702f1089bc", "commit_tx": "0x52391c13ca99e530c8a35b343b4a3dddfad436df187459646c20f08e4ec6c5cc"} +{"index": 153589, "batch_hash": "0x2b83f575973a59ced9a0f1d6859e1eaa3df3c9c3effa1aefd8bcf286ab9eba61", "commit_tx": "0xe92a4cc483789ba846d34d226609164b135431f13e8c3310cdd092bcbcbb6345"} +{"index": 153590, "batch_hash": "0xd2ee93ee7bb7424ebb165830cbe350f9b43152419c5234df8a04a08fb4a461fe", "commit_tx": "0x1b28ceb97efe6c5cafa45f10e335a0b047d7171edb3e542cb078c6578290f8da"} +{"index": 153591, "batch_hash": "0x2cc50dc777eac5f49efe6198c8c6cf5ee73c3fee78a48a1b69ea7dd8ecfbcf4a", "commit_tx": "0xa274410579f15d5fb8daefa084f82f90336f3aebc55a40c931ea0dc0ca212380"} +{"index": 153592, "batch_hash": "0x5d91dfaed3c4a4162590908e9a45f58575a7253a2c3f5e87847fbddb004f77f8", "commit_tx": "0x2034d84b0015b84c237422a9f02da495b43dfca9a5c18f52445784d3d6c3ee55"} +{"index": 153994, "batch_hash": "0x4b73d237cae3128838b7bb161cf1019d22ddbecce3c670842ee242278c6c9d0d", "commit_tx": "0xfc755b68571b105b33c7f260ba9ba901710206fd5ca4d242c0b3da23bef24eed"} +{"index": 153995, "batch_hash": "0xe5e51da11b2cea222904409ad176f380f42dae765e93f75dba4f5558eab493e0", "commit_tx": "0x5cd10f0dba5608c16a7657a064026bbb687e343e0463ba7479dcbcdeb33a9fd4"} +{"index": 153996, "batch_hash": "0x2e00e106d995b49336354633e6b592c75e039300376d6fd401ea6f2a149f2021", "commit_tx": "0x808f68a14be666415aa57e9a6b9adb46a7f0c3c55de0bcfe522e1f60496730a3"} +{"index": 153997, "batch_hash": "0xad008b6717341f84bf5c7371463f96d5da9db30c2cad49628bbc62cdef19a12e", "commit_tx": "0x6740be9a8178b36d6d8b5c5205a35eacc98273017eda35e5a27cc43aba84fb2c"} +{"index": 153998, "batch_hash": "0xf27e85127bd616745b7043ffb3e31c8249cb90ceda7aa010ccdeb6df011bb014", "commit_tx": "0x6a895f02f09699f4da728b6d820c7ea9850834af13e60af228bac321e1778e4d"} +{"index": 153999, "batch_hash": "0x3916800655bce31b28fd04ba1a9021bad0566669bf652c8f5c3e35fce20dfc41", "commit_tx": "0xa0b1a8f54e95867cd54f326fccebfc37324265390be286e9fe891a173d4073f2"} +{"index": 154000, "batch_hash": "0x019aec56ce20179211f06c7b303bb0caa4fcfe973705000d40ee3a3a7afb2113", "commit_tx": "0x2ac011e1bbd303f28bcffff097fb250dc7987050ef67df37d68939b8152eb224"} +{"index": 154001, "batch_hash": "0x09c403da97a196211f64fbdb9a93042d4d60f638172bab1cef31f620cb81dd7b", "commit_tx": "0x4f4d798f066cd58cf476d81f3fa9e68053db9a5a73b7993cd15401db7447a0b5"} +{"index": 154002, "batch_hash": "0xe1f292cb50b34a6f5030e8d3fbe65f9f05ea182afa1215d2a23dcd1a672f524e", "commit_tx": "0xadc94c67a8b70ccc789b28c11e00d0bbf5a887a949fe2e396d85506b2bfb1d72"} +{"index": 155963, "batch_hash": "0x6fa0a57c2ca668ae8b6429de9b885569809019122873544f3d6213a1afcb37da", "commit_tx": "0x2debbb68035433db22ea6cbb04f6ac6c2b6011165d4dbc1693fc74dab49b63ed"} +{"index": 155964, "batch_hash": "0xfc9a2557652f137a2b3d21b3fff30b97889f3646fbac167b5b76910c0c28af58", "commit_tx": "0x75755e495961b514a350989f3ac3505ed183943bc5076b9bbb3afa1ae27f5a20"} +{"index": 155965, "batch_hash": "0x3e6a4427062ee3b3428afdd218e4d163ec14733285a7361cecd0b69101b051a0", "commit_tx": "0x612210134a8d286d6e00f863d4136f7c48affbf92a87af2e3e8a773e6bc9fd4c"} +{"index": 155966, "batch_hash": "0xe28eb67e783083d775229794f2c8ee800638e56827b8f9457fe40a80bb5952c2", "commit_tx": "0xda6351ff429a4a1c62ee8228d413f838120471d60e072c41e36c82e6e4daa5c0"} +{"index": 155967, "batch_hash": "0x8910b246ded56979146e30a693b7782193edcf4d2737d7e6d5de7d0823cc5fcc", "commit_tx": "0x06f85c879dcff856c5f155bc6461b4f453d99225b27e79176bb8413e59a79664"} +{"index": 155968, "batch_hash": "0x17803150b8811aacc3ae6a439da8e7d7a44ccd0d2a430699357f17c4134f652a", "commit_tx": "0x9ae81f5739d3aaf51013aa874ba13a4b5e28d987c0931815022e2b2ba2663cf1"} +{"index": 155969, "batch_hash": "0x798a815fc313a9daae6eedcf788748bbc5346f5c747d1691485f356d9848638b", "commit_tx": "0x59a730020862f2fd8c1e1ebc60b70190d17470898f1bc81169cf78e1b774eed6"} +{"index": 155970, "batch_hash": "0x0840aa993e3352ec8e1f8f6299243b0a72026d1614bf82acbb2adc6fcdd81759", "commit_tx": "0x3f608b1dca892fe7be51df883f9ce5c9354ca60f1ddaa5037ebf6b744b79b048"} +{"index": 155971, "batch_hash": "0x52ead2361d6ee87ac0c26cd0128bedef23b59b2222654c7d96bc2393bbba210f", "commit_tx": "0x3cc1a7fe1a651331cc2d20089802ebfd7ec41281edfb3cea3678352aae5fa00b"} +{"index": 155972, "batch_hash": "0xcbe02b593e312d8dd15d02d84ec3f172ad500d74b8bbca969f457d499769e3b1", "commit_tx": "0x4d7e849086c31c2f17c70f041db76453c50e4a060eee2cd2f3321118b3aa9fd9"} +{"index": 156513, "batch_hash": "0x068b8ee8e7df6483113e4bbceb1a21a4e2732e194cb7e7bb26e82740957f3961", "commit_tx": "0x748222208f33a26dd346fe87af2596f73a971bb13f11f684ad59d5af9c68cf43"} +{"index": 156514, "batch_hash": "0x6024d7a591a19c4494213dd16b64e139ed62c6e86e8337878d27769f8ecf1a8b", "commit_tx": "0x35e29fa54e02fe75e62019b24e632e30774b90f4860fde056debbf5b7d4de575"} +{"index": 156515, "batch_hash": "0x674a8f450dd9409854f2cf066d2ebefe6931965e36ef2b75ed67e1c7867d4a99", "commit_tx": "0x3b3eb508113286d8db6ebd0f50ee138e37b9f2386e621bdf5301699602454e73"} +{"index": 156516, "batch_hash": "0xf3179eb64a3fa9454093b6f02bee2358725683de9be7b1c684cbe1e7f66fdde6", "commit_tx": "0x8cff6f2a9fa516fabf0ff8d2edd57ff940f7791234d6dc79bf7bef6d88bf763f"} +{"index": 156517, "batch_hash": "0xe2b6edfb4840d3f89a826ab5b2babe8946e4013c8b4cc94ded65b7b48ae48710", "commit_tx": "0xacd0548a4044a1ff709ac73cfd9dc2c146e2badbe9a06f15e620b834c7a68e2b"} +{"index": 156518, "batch_hash": "0x68346a8edfe2aa0a459f1b3a208c9e933d88a7d10fa17cde302d177049934d86", "commit_tx": "0xbecadc1279a64160c8355a25a5a3ddbbcf1189e420f1add5464c5ccd19b878dc"} +{"index": 156519, "batch_hash": "0xad0ffed678d4c2635846491164841352a422e46cb5708ec75fc48d90af5adc8d", "commit_tx": "0x2107dde4630ce5c798dbf0543ffef9c0df6da8199371c6a41277423bfa6b1831"} +{"index": 156520, "batch_hash": "0xb062d48f34ae80bf644254e0225851f29d6ea707bddca3d420ea77bf20276fb5", "commit_tx": "0xf684706f4c5f8805948c5ed07a78219eaf7aeb1abe7f9ae6355aa31e84a1f3fd"} +{"index": 156521, "batch_hash": "0x0b0bade5fb37f8375b433bc253241c27d7a3f4be77a0de9a91ca06223914c14e", "commit_tx": "0x94b89efb8e4eaa0a91bed92ab69335084212d869a4dbc9fa3c09dc99a06e47c3"} +{"index": 156522, "batch_hash": "0xa16bc536bc81b6b304ce73a86c03f90ddf7575c99dd6c32cce1578bceb6145a3", "commit_tx": "0xe9e13aef1da6d169a627c79c3b67cd0b86216eb123857822ee4f359111be3828"} +{"index": 160363, "batch_hash": "0x71cebfe68192debf9a4001ee47de36c7b029667a202410d113cc2b598f9e4484", "commit_tx": "0x386ef914bca2b1ff57089f14c2b89341ddbebe23408a3ed373eff4f7a35da8ea"} +{"index": 160364, "batch_hash": "0x18399a5a724e1806fd2c3f8ad0507076dcd0395a53f49dba6d7726b81a8c74ce", "commit_tx": "0x35428c008ffe317b63dbc4eb9a5c5c505e70a02005a2b1ad104a4159b98742f6"} +{"index": 160365, "batch_hash": "0x9aa71f4cd6fabb7b997e2e4ee921ccf81a924ecc5505dc5770530a8b4e6c5f5e", "commit_tx": "0x70e12937b3bd6750594f78e23ea922d799041b686312734acbc0b70b3a544a94"} +{"index": 160366, "batch_hash": "0x337f5bc921447db8a8b76df49b169f6ce2854e887d9fbc815709e13d5187afa8", "commit_tx": "0x5d706018b8f57bc9255ba290234b50f5b6b915126cc974f233c69682047f4ef2"} +{"index": 160367, "batch_hash": "0xf839c60910b200e4a69e33d27957424a784404bad423f78b84a7571c94ba2e0c", "commit_tx": "0xb94047a04fb86ec34d6efdb9663d2ed020f8eb1c48208a6979deedfa7a84d65a"} +{"index": 160368, "batch_hash": "0x5b9b65d35490b4d6c124156e8555cbcfea176378ede13c4588338dae48e5879c", "commit_tx": "0x0526f2aa36fa5818edb7fb88bba7b8894bb3462c0bd9bcd640939c5cf6320b52"} +{"index": 160369, "batch_hash": "0x03bb46e849a1da9290ea84ab118cf020698b7f58d701a17c2c6f9bbe3e5ca86d", "commit_tx": "0x63a9fa1da15d759d7b3b432142b63a82f630aed3034fa32215ef546900d26bfc"} +{"index": 160370, "batch_hash": "0xea424b1522477fa99ecac4081e4911d6fe50a790f1596b24ae55a26f9b19a59a", "commit_tx": "0x043623a06e7069398e30a3a37c7f92724de1bca1c4cad71580d4e0a545ea6c05"} +{"index": 160371, "batch_hash": "0xb5f21dc5cf91e2c4866a7c43085ff70b6bc79665eb2a89bd29c31f7f2ad5682e", "commit_tx": "0xac1b635bc5c92609c84f294c3f1f5f4ed8613f8d8b21728fb3a77000747725f0"} +{"index": 160372, "batch_hash": "0xbd78180018d633fa9bd0b90302878c2ab4f17c0a8382acee4a09c2000d1910d9", "commit_tx": "0x3c8ba39ac1271914acb1ee1766634ec0f2dd2f9e2d78620f736f470074d0f887"} +{"index": 170623, "batch_hash": "0x48adfcd91bb16bfac65a94aa3dab32c5b9124d60a8563f9e4b8d906b4a1860d1", "commit_tx": "0x01b5be9f50d3b0a03a9f3c9fbbb5da5202398370c9474779702d7525ecdbb347"} +{"index": 170624, "batch_hash": "0x01f71fc83b2c935b72537a70654c70bd34b7e2a17662e5bc0a5221e6aa2369bc", "commit_tx": "0x3ae0da3596b64284bee4202a303673e18793fcfb276cb86dffd93c676178a654"} +{"index": 170625, "batch_hash": "0xf7a90fac29c216ab5016cf19613168a8a0030df9bfc50f01682761338535201d", "commit_tx": "0x6bd4c8e30b9ac9d6213c7cf1c9a5e14b5c4882ce0019b222970bd4853576987d"} +{"index": 170626, "batch_hash": "0xa86c7d1cd703fba0e3a943aa696110b3733b47749277a4d230b750323f5e48d1", "commit_tx": "0xa71b0d3e736ab921766e86f8f3b7082e168426c40f418d0c1d4364c1345c8937"} +{"index": 170627, "batch_hash": "0xec01174a5fc4e5bfc374060fedc39b0353321a87a876a781a4c984b4781cb74a", "commit_tx": "0xedcab54a7e9726ad05f141dde014a0681f33a9c517bdc9b3832ce525f0974c9b"} +{"index": 170628, "batch_hash": "0x3dafb6dacdfb9f53ac58d28e9827e7b55e2724a15ece14928cef826bdb5f4fc5", "commit_tx": "0x68d5f1e9ac80edc46cc561c0b16c7caedea89da7a2967eb402cdb133f0775041"} +{"index": 170629, "batch_hash": "0xe0b5c6ad86a8933b15800eea2d64e5fca181fe66fa7a1355a7bbac5cf879baa6", "commit_tx": "0x0979cd9d232d37f22387a79bfe966315d1bbf1eca69d24d028d54201a81fa9dd"} +{"index": 170630, "batch_hash": "0xba49b31548d9071440c7e7d98e478f2e78494e25c70382777160d921b917d2e2", "commit_tx": "0x7ff7cc0134e147bc531eca9bf8de6d0d7cd179a32254b122cfc44eb765f7b3a0"} +{"index": 170631, "batch_hash": "0xcf90b67d8c5cecf558a60263c9faf874ede2660de2f13a8153a39bb1e017dae0", "commit_tx": "0xc7e2861894eacbb5e152c530c012ee59f6f829ccad4b2fface41c9f548bf06ca"} +{"index": 170632, "batch_hash": "0x67868a0eed6b4f620da34e9824b18b8aa6d9f79790145ecff8517f35be9a7c55", "commit_tx": "0xe42f5f7229395298b92d889177c998b2d98f1cdcafa1e1801e57396ad9ab404b"} +{"index": 171172, "batch_hash": "0x97dced595e307d5547c251f2109d4cf40a5e956702e021162fa72259ea2fe0db", "commit_tx": "0x94046e71b8537c60bf712b1d4346848be39c7ae1083c79b9efc3cf682e022078"} +{"index": 176353, "batch_hash": "0x6ee6132d9d9e2839598639f0a2fbe2078cb0b2a37efad2fd69721ed6fabecedd", "commit_tx": "0x9e077b32a597ec97d4f56adffcf7e0fe497617b70dc33aa2e46f7c17b1f4e73e"} +{"index": 176354, "batch_hash": "0x40a311bb1cd86c2b908cefa2bae7da95fee4c8886b5368090c6763df0657a555", "commit_tx": "0x98930ccbe6ee45e74b9cf3141144086b106d434f48bd59977d1afe5710d7228a"} +{"index": 176355, "batch_hash": "0x7de908b72a22aafa60583e1a1613efc9532aac85d9b23748df6470c587f2cb5d", "commit_tx": "0x71c15ccc22df89cb27795c6a3b1501d0e14f18350faaabd5907547059a3f1239"} +{"index": 176356, "batch_hash": "0xddaf3f7d0074f6f924785d7c451eb83352f468e506b18b40998cf359475ec7ba", "commit_tx": "0xe72f4fa4827e7333c95cadd776d94e7a78f8edcbf4a7b86cac4df076b98f2f0b"} +{"index": 176357, "batch_hash": "0xaca2377dcf2b2d67c93f11072493165f6e4009f6b1f9d92cd70e9773d210a4b2", "commit_tx": "0x7d163cc4c5400328d34320fbda6d5905dcc26005fc3d67c242abddc601480039"} +{"index": 176358, "batch_hash": "0x143a5d774fa4151d87ab80a552025f886bd92d32b0109d4f2c1518e77b900cba", "commit_tx": "0x3e9293871d2e1974ecf3b27c8cd9fba0e382055d29befed77fbbfd64374fbae8"} +{"index": 176359, "batch_hash": "0xec360bf91adc16de820cb868d511b9747fe9d43416ffba0f97c21086f9e0bd7b", "commit_tx": "0x98312c2c76d2fbf8d9aca67281aed5246e41cae03f478b57576bb50a15ff4aa1"} +{"index": 176360, "batch_hash": "0x27490a1a078bf3c101fa5f87e1bde9dd70c7d1b44ff2ec7d0a9373c3952c9488", "commit_tx": "0x8d3ca0d06debc5095e4a50d3fe217ea3664a4fd417fd6971274e2f38b2ee67de"} +{"index": 176361, "batch_hash": "0x932876f3e82ba17ce2768f95b1636217736465109c0fb938d960ef2afa426f8e", "commit_tx": "0x73140cf277f82aa975dc0c69be1029f6038619da55e1b17893d5d280b49d51e4"} +{"index": 176362, "batch_hash": "0x21bddc89a6fced07fee9b5e6bbbcc90507bad6ce21e247694d4b21323fea8241", "commit_tx": "0x39354fb6b7131c898741b2e1797b075f7f696449ce9cd668be1774571bcdb4cf"} +{"index": 182903, "batch_hash": "0xab7fbac4fc9d428589aa3ddef5ccd178a07efe193b4f97324c7f486f41f678ad", "commit_tx": "0x91ef90de2f2d3aa0815ce88f72c940b53c319af8d8e89d3724caa36bb1fde3aa"} +{"index": 182904, "batch_hash": "0xcc50698a906629664b46a1abefb1b702dff6f326f3e5bf21fdfb70cb52bd0bc4", "commit_tx": "0x505ccc8f8c914711a976b61d1db7ec981009a7705db0b2c2cfca1d4cf5ba3ee8"} +{"index": 182905, "batch_hash": "0xa0cf153c4361f62d508dc5fa20b97c1040a62413929f22cea2c0a376ed1c158f", "commit_tx": "0xc8d87e201fd8072eeb79a7ce66a11097e5acb5faeee6cd1a60800c06e480c867"} +{"index": 182906, "batch_hash": "0xe67fa1137f8c66f1494d13c7442969b30fbae93a961d24d66940d99b81d0379e", "commit_tx": "0x755ba1563971fe85fee41903ba4451c88fae83e09381463bbb54088948dfc058"} +{"index": 182907, "batch_hash": "0xdc11e94aae33921518cd3e516dd9a230d0ee98ec86d24accee78b5813fcd7561", "commit_tx": "0xf297b463f25474aa6de00ffbfa786dc2105840fe092a84af51834bc8bf1d56fa"} +{"index": 182908, "batch_hash": "0xdc15472aea7ed23399fae47af6f49cb18871e98139b325631a4303552cd8d298", "commit_tx": "0xc6ca52ab1b89875b36ad79f43f5f68835c1c182907d15b3cd301fa2e88f88005"} +{"index": 182909, "batch_hash": "0xcff17215612fd7a77f3064ee2ebe41c1729e343dc41c7a96351f93a79df20a13", "commit_tx": "0xc375ed525f5df1bc4122e143a50777438c987862168c6369b78a3f0de77ca5f9"} +{"index": 182910, "batch_hash": "0x5a46dc4dcf6b83a0fdb5f63f5a3ab3bf10e3d20bc2d63d294c9f8b6779aa243d", "commit_tx": "0xa44a5d862cdd9e19195d3df3e0a9b558c3086c8b761ae17fa11578dbb9d1f9a5"} +{"index": 182911, "batch_hash": "0x0cedbab7864e031c1729948ef094d47888098e9c974418b628e00801d26618e3", "commit_tx": "0x5cc8d970af0ee1dc80a0f2682186fb2d63fa919a6fa32deb8b19c3261ed3c093"} +{"index": 182912, "batch_hash": "0x3677e2b02129ca0a0bb60fbf40d21d9028bcc43a5de380cddf07253b7c95e8ca", "commit_tx": "0xd4345f185e134411e9415c0c6ff095365a793adef7747de15e686c6dceae4f4e"} +{"index": 186604, "batch_hash": "0x837539353f02de8cd5436d5ca6fc8e8f44d7c278cfdb0f4ab173f6d64232dda8", "commit_tx": "0xfee9acce93eb220b27365ee4c69575b1732b51249b51adcd60dbe9a0be0b8492"} +{"index": 186605, "batch_hash": "0x56757c31b45684eed0b23600b9db9c29c0b7e6b1349a8ff5b9c3c09a78e82c70", "commit_tx": "0x02f7de345354a6b0da4fb4b7583aaa12778a093ca00a4699f73de0fa98df63e6"} +{"index": 186606, "batch_hash": "0x27c61903b39992ad167573a743184c1cf2d1c212e76d6c6fcde4f09cae064a1a", "commit_tx": "0x85f01e05891d23f0bf052814acb98adc678b2c2135bb8cc33cc0c18578828f8c"} +{"index": 186608, "batch_hash": "0x1b2cb4b2f924af0323d53aa9556d76463b1c1a776c6e0b89f97ae4553815cbee", "commit_tx": "0x59fb6a3ecc775fda0bf6e7fd2380210c822c3413b380973279aac1000ed57ccd"} +{"index": 186609, "batch_hash": "0xd3efc9e90e4f846ed51cc2c785a42a17c75800a57de8114efe1f13f78b4577c0", "commit_tx": "0x1c397de91fb7e8a0238027c5dbd0788ee24d177b05dc30f177839d77b1c3b872"} +{"index": 186610, "batch_hash": "0x280fb85d43e52762dac5149193a20bb314c0c13f5c65435c73883f2beecfb273", "commit_tx": "0x3b6649a03113c21d3e26e142169567123fb78e019a6c49b6946650572d7658fc"} +{"index": 186612, "batch_hash": "0x7a292652df67bd16e6b3e307390d810ab46da113ba5ba2b979be352e99195ee3", "commit_tx": "0x4ad8acd266a9f1fd85a42536fc05e2443da54b0fe61b7c85ed3d3f3f3391322c"} +{"index": 188913, "batch_hash": "0x129a7b1025eab8e65e545ff3374837dfdaa0ff58cb08d9fcb5d71f095af3eb1d", "commit_tx": "0x0ed720308b4f478e7726a3999379c52198b255b22d4f16a2de9110ae1752561a"} +{"index": 188914, "batch_hash": "0x7dab8c95067283354a290e122ead6960ce9484f36bf4d62fc17c30d89a432b8b", "commit_tx": "0xdbf369845c726e567adf73362e78d743e6d8f88e711245f857bbe71b1d2773a1"} +{"index": 188916, "batch_hash": "0xf434f1b8b8c7dc9db2f6d5d7b96ba0f9d6b5f020c3ae904d4b45edfefeb49f85", "commit_tx": "0x5995794a16018b57b97cbb6db5b4c5d6473ed38f1aa7cb65577402bf6dcc714c"} +{"index": 188918, "batch_hash": "0x7431a37930cf2a5354dce285d0993af5184f26803183986090076ab1e1087719", "commit_tx": "0x207bfa6a5b06240a4dd5ceb889a62ddc6496ca596a111fb2fa4a85aca7b56556"} +{"index": 188919, "batch_hash": "0x06f6fa98aed559fad0d0ece11be33f6797f7bc2589305384091c4135a4e259b8", "commit_tx": "0xeba44001d35693c973ca42d8baee12bfc64e857b330d182b2545b6369c035863"} +{"index": 188920, "batch_hash": "0x85506c35deb6536a1e958770b55973efee4527f5bce44869896e9ba067f50c54", "commit_tx": "0xb0dbe7967eb3c693b517f3c7f92e0416c45a0e5b9659ad978629172d89b4a336"} +{"index": 188921, "batch_hash": "0x98c3b244b41bde4e4406b91e611ae7a774158382807ab03e2420499c411802c2", "commit_tx": "0x114b22cd97f940a2e7da9254c90407a2b6947f1e7f365671e84edc1a3a5fbbca"} +{"index": 190413, "batch_hash": "0xa336b3ad429a841a43600376433731bcaaa589c3bf3842d5deb38e4a08ad9310", "commit_tx": "0x7c9f24da61dc355b3d43f88b0b6f12b291ef29e01a222518afa7adb40af04461"} +{"index": 190414, "batch_hash": "0xedd87962aa7a553c9ba4f957da2bc3f7dd48b6a8fbb458d80eb0d0d130b469cc", "commit_tx": "0x4e278dc3c689421d35a776ff0340a93df0a5c432cc58ac49487462787bbba615"} +{"index": 190416, "batch_hash": "0x3d5e845ba9fd11175a07cea8de7bcbb724cedf282991f8a880d65b66fdfde2ec", "commit_tx": "0x6320336ff953ff78219afcda745be9cf4fd496302be4bee0498cd13e04a3519e"} +{"index": 190417, "batch_hash": "0x46c0f1747d97b98e01f10942fe329d976f6e1d5528e5b61afe5c8251a8e163e5", "commit_tx": "0xcfd198bebe83505de478ba8588bce9f32406cd16757a9115dbf3266a7efa096a"} +{"index": 190419, "batch_hash": "0x1937f9f1adc09d8bcdf2654cfcfd076eedc8dc6fc7a9687b4e6b8bc166e1608c", "commit_tx": "0xcdf9014847d93dd3a22b1a88d9b05a665a0e4a4dcfab361c060b5efd88b17ccc"} +{"index": 190421, "batch_hash": "0x447293bdf0a78eb788df77fb34235fb171e5d6192b52c0fb01933f75cbbbeb49", "commit_tx": "0xbafa00a046589009a4f5b85f9f250f7d6aca5f7cf349459b76b023cb298e83df"} +{"index": 190422, "batch_hash": "0x9a3da3cb17ccfbaf6def8e0f542c689b924412673f01415b2e5b70948251702d", "commit_tx": "0x9d75514cc4e490984f5cf724135a522afd9c06ea1d19835b4d5cd2268ea4a53c"} +{"index": 191883, "batch_hash": "0x010cb621fb735bbb9be6b47c35e611131cd71bea7de0b84731dacf093308a7fa", "commit_tx": "0x5ab7203da57a81e726decba689c0a4af294c9ae5e19f37e54ed0517d9c2b2dbc"} +{"index": 191884, "batch_hash": "0xfbd1e1a0ef2843e1b35e46e34c831f280177f959e4d63477a2e2e5aec95bbf74", "commit_tx": "0x4c1cb2427ea9bf554eeceb5b30c3f8a9611d77efa045eba73a60e9017c9f3b36"} +{"index": 191886, "batch_hash": "0xde8cdd7397a65078f0b4b93a2914b738e860e5cbd4eefc25495b5856ead2a7d6", "commit_tx": "0xe5c1bf075574a37140bcf822ea043903b53981f1b5c17b97e61c004f3b33cc51"} +{"index": 191887, "batch_hash": "0x54cc8375fc07dcd4a2c8c1d2ae82467e1b3ee662102fe7fb7df1bdc1d4c7d159", "commit_tx": "0x459c05a4cfdc49bcdca1ee50444cc9cdf46d17ec48ee358039af333477dee47c"} +{"index": 191891, "batch_hash": "0x9642110f9e1445a1b5fa05d04a5c8a01709673831edbc9305d7f3b52445e46d7", "commit_tx": "0x671ecff6333512c06b1fd8ffbb6c316f35b61d5e103670b8075e6140d0fcacae"} +{"index": 191892, "batch_hash": "0x7f2dea64efa45867fd5b1d9df5fcf91dcdc8c571be4410aaa287c2faf1c2d4e1", "commit_tx": "0x30b2c8bf750230a48cfc7199ad6ed2774cbc17eecd4f4ea677002abe3735f1b0"} +{"index": 193533, "batch_hash": "0x5bb9ba73c13d46140c89f65a85febd1be3f6f9512c36e45de4a58233b62b39f4", "commit_tx": "0xb5e5bae65919f34984aa2104c2dab3edddd10e2ac4acc4fe977aeec28dd4b568"} +{"index": 193534, "batch_hash": "0xb8d5a140a3c15cd7a858cf022b4d03c0ed39bfbe32709407076d6345b66a3a35", "commit_tx": "0x86017ccca3624e2fa8bf0556db726dc27b77583cb14fac577be5264cf3f30a8c"} +{"index": 193535, "batch_hash": "0x88202a6991233a4926bfadd5c9f11cb0467e513513e2c108ea28ee26dc2eaa9f", "commit_tx": "0x6ed7b3dea944c6f86960bc5b91466c9d54c27a11786d1181c722305cd0d5a76a"} +{"index": 193536, "batch_hash": "0xbf8ee1277d898de19494ffe0ab8a606318b4e01eb55d7ebe951068bd2b778a1a", "commit_tx": "0xd5af1d8bed205f714a47011666bb26c3fab85de12bbac332fc0be76bb6866387"} +{"index": 193537, "batch_hash": "0x60060e837751106b6be346aac30e46e41cdc294c3972cc7346ebb77794207e84", "commit_tx": "0x96221bf5f82885c4ea351feceef30be40c22b5b4fe0ea622ec68bdf5772ccb79"} +{"index": 193538, "batch_hash": "0xbe5e96a5c978248b9e135604265aaf0190558375a0a93b2984d2231d21cb7237", "commit_tx": "0x21c915dc0b133520750ff4dc530187f90ae94642c33d2ad909f9d1f686bd7bb4"} +{"index": 193539, "batch_hash": "0x65f30090cc9244a270f41e6d779bc5ed8eb26d8620af756608f1491c61bd4913", "commit_tx": "0x345734be57387c2e85b4fd2bbd5df75a16ea9c028fd4f6f93a21f7b86066f5a6"} +{"index": 193540, "batch_hash": "0xb151ea71c1211732f2db355fb815633b16025c9f09718210d9621158267a5fc9", "commit_tx": "0x729dca0598bb24cacbd36be181cf252c19b3968a0a17716f516aaba5bf2f7229"} +{"index": 193541, "batch_hash": "0x54da01fefe1d190f5d064f5ed2f53583bbb5c4e5d922443731bd9c8a7262505a", "commit_tx": "0xdf5da94530b211dd0b20d5f4d65205a459cc95d74479c3251ddb96dcedde6f37"} +{"index": 193542, "batch_hash": "0xfaf8eb92b42a043f951e89331f9974bf101c2802c4f3fc72b51ccba94e5e62fe", "commit_tx": "0x5d0f1384cd6b2c38ee109d404296536038e23a35166af94ca3d3f13adf09c699"} +{"index": 194753, "batch_hash": "0xd8df6187d66380a0a17d4c6b051288d7b322cb5228bfad6bba25c4776bf0868e", "commit_tx": "0x9d47aa4a879d24c8569c75a2ad700392bb8eb28099860fe7960fadfd340e1bc2"} +{"index": 194754, "batch_hash": "0xccaa2f9161bcbdd71db8fdeca9e0373e5f60de46a8197bbbce2c4c510f20186e", "commit_tx": "0xef0b5a878340ae4a2b26efdbc6040a1dd4e07ba4a14ef51e21c07d3ff9ecb7ba"} +{"index": 194755, "batch_hash": "0x411f0aebc6770d7856521028e711796e8a71c93fd97ccd6ae14a8ec9ed515092", "commit_tx": "0xe77b2b437294089d96503243ede64f2c663ff4ed90e34f74e54c5dfe18deb293"} +{"index": 194756, "batch_hash": "0xf64530337950f254e71c9227b2f47b0e54325075ac4cf35531c53ff9e41a887a", "commit_tx": "0x700d6b5fe16b6744882249c617ea76ec259e7f460a544c6b4b9a80d053cb872f"} +{"index": 194757, "batch_hash": "0x01c60daf379ad63bec10fd35a8af3b2f539ebe6669d9e4ad50b5c1fb76771a90", "commit_tx": "0xbe6908c1248a4d02c518003e07c0f608314bff287325bec88ca2db25e8d58d6f"} +{"index": 194758, "batch_hash": "0x28331756007a8fc22a6c10cbfa09b159ddf80c3b14a2679b879db980afb49c7e", "commit_tx": "0x6b7ee11766c4155d45cecea7c1c1bc89870719c678d01967776d641bcd816f5b"} +{"index": 194760, "batch_hash": "0xb54a7ce97d072a68d77bf15563bb87594aec0a620786a0585a05af68c666603a", "commit_tx": "0x2a34a69804c637b4c310e9da7eb2cea05028895fe9c8872887653d48a49fa3db"} +{"index": 194761, "batch_hash": "0x48a69f0b29dfc5f629cb406b69f536d6134bedcb321fb4d124fe807de6d7dc60", "commit_tx": "0x5ca330e15186355efde01e2a1b7045cd67f45bf6652691acdc9851115fbfb434"} +{"index": 194762, "batch_hash": "0x7d26ac322aa90422ead5f2ed03cb8884524900e4ceb052a8017a310b8227e9d0", "commit_tx": "0xf2359c981dace201db292a056f1836386ab0422058b82e08f61da2de3e02fad1"} +{"index": 195213, "batch_hash": "0xeceba4dbf16db1f7d50bf6642e438e00aa8a4a8a4bbeff6a129911bd9d788a62", "commit_tx": "0xee0921b8dcf4507864bb6b67a24a83df2dab60e7acc4d9a5e7d1b7033a6ba70a"} +{"index": 195214, "batch_hash": "0x97952a19f553e3ac48b3ce0c02e34ea947f3616c474bf1efe4446cc29d4ef8e3", "commit_tx": "0x1477bc5d38fe4d944a81f07a48bc67e2ec83e6401de2982fdb66215ab93fc8a6"} +{"index": 195215, "batch_hash": "0x26b820523adc066c8c15510708b9c667d92523b18d9b2480b4676aade8d7731f", "commit_tx": "0x4dd82429af3739a61cf3cd56ce0e3b82ee2fc161308a1a5de9e2bdccea254905"} +{"index": 195216, "batch_hash": "0x05bf12f6dfb8a91281750b7909ef5565c75ad83bed9b9665d3470643814733d6", "commit_tx": "0xa19849ca8816e47926eda4aa05a5c62f6c0f8a6d3c45928da3fb0621ae9138ac"} +{"index": 195217, "batch_hash": "0x687a26acdd9e0a67e366459f65721147d18867320643a87bbfb990eaa231d987", "commit_tx": "0xd40acb74e78f1237a89b3db04e51e5efd327d662f3cb1545c8b1b1a1c41bbcab"} +{"index": 195219, "batch_hash": "0x2e4486472a992fe2489131dfcd38ae1280d3a3ff581bb668e076b755097acb91", "commit_tx": "0xcec07aa971d0451b01549d930bd0470017a18b098f58d8f68b2cb818fc72bdd6"} +{"index": 195221, "batch_hash": "0x0c9acf7b48b44a3a2c08ab41416e45d2c5308076b58233f2345c0ef3f939b102", "commit_tx": "0x3703d75871cf185ed4d1c41f394ea7702260dc573e9129084a64e0f87bbb33f9"} +{"index": 195222, "batch_hash": "0x2458fc70070050a292b0e35a2107b5041acc85b0fa77b2a589d780bdd03fd085", "commit_tx": "0x33dc5659fe5e97dfc152741f39e018750d8a7eeb8a80c73f4206c7f4d51f0cd5"} +{"index": 202293, "batch_hash": "0x5ab08f5134f37c36a847c0088c23adbfcde8fd720e446f400a729253350e1ea3", "commit_tx": "0x76780903a3c2dc27033e774631e837377b89416c1bb0a80c11de0de446529c08"} +{"index": 202294, "batch_hash": "0x44d32b0c6981eac0830f6bde05d4a0a5e42dba18d37d2204252d7e2071fde848", "commit_tx": "0xbb8c4273162e6c459edbccfc9e4e3115268c25c4a5d7f07ecc073640fdbb6c18"} +{"index": 202296, "batch_hash": "0x64525e837800ad62fec9b6271a006e328c715c92ea6164083fb7e728ebd4f322", "commit_tx": "0x677fc50bf20a3b528190837ba463d9e08b1e124a4350530bcabbf92f04daa242"} +{"index": 202297, "batch_hash": "0x2070f7e68f763d47dee77aaff00e123cb4f3f0342739acb985355746616588a8", "commit_tx": "0x2905e92ebca6c63cbc164e7dfb3302feb377e10055a54ac8b3eccc5363e16d2f"} +{"index": 202298, "batch_hash": "0xefea136c867791d04ee1e3b46a1d9ffa0ba3a5449f14a2aaa917126c5a20c418", "commit_tx": "0x01076aa637bfb5fda71899ef4f4a805f97dd1190955aa7429e8fe60513a8befa"} +{"index": 202299, "batch_hash": "0xef5be0827e7d8d7e6c0ee823cfa034c685843a5884596b77349bcf281d3f0c48", "commit_tx": "0x994a57278179105fa0ee560d4a27318bbf9c51dc3c6068f838421ec71ec7cf01"} +{"index": 202300, "batch_hash": "0x7a1507dd5e6bf8dca310496d9d532224fa36df2c924c87ddb2dde1a52fd2d46a", "commit_tx": "0xb075b22002320fcae870695aa9590773950abf50ef3568704deaed78d53bdfa0"} +{"index": 202301, "batch_hash": "0xc03fd586a458a814662cff770ddf5228533d1d2679cdfeb76615766df4a17a1d", "commit_tx": "0xadc1df62c6d26242edf08c5c40050b3f23bebe26487c4a5b868b3cf65e17cf31"} +{"index": 202302, "batch_hash": "0x865576f3f4cd0d267bc7ab20289760650e94e3fedef3d4f30f9be17730ce9780", "commit_tx": "0xee8febd9b310d30858027c5aefcb9810695996ebf079db1c6e4efca0648451fc"} +{"index": 205103, "batch_hash": "0x83c5d658eefc2a10481fadcb741cdb5e1b9694ab938b933cd1f4afccfdca5aa8", "commit_tx": "0x1fe0c42c96cf96f94a4c9fd2ce04fdc71cc6e5b7d95b303323189d8ba8beb072"} +{"index": 205104, "batch_hash": "0x994fb681209cbfd4191302ec9ff516d7a7c2b802f62c62ac5714187bc5d73b21", "commit_tx": "0xffbd8f02b3cdbe0f919855beca3ff531e28dc40daa9f59da2273bb1dd1a038a0"} +{"index": 205105, "batch_hash": "0x5c5b4bbfe8e79fded964670163e2aecca16c1daf7cc628f977f050096987763c", "commit_tx": "0xafab5eb5a049959875d20314020e6fc4ba96e7f839e5c6af51db7a5b20be13dc"} +{"index": 205107, "batch_hash": "0x48b87a156189631d82157cadc63e797033052b8907d900330e3e9c2cf01a6bcc", "commit_tx": "0x4b726612a3d21d1c8d5e4aaa71a418185a678ef43857d040b8ab1bccd809ca48"} +{"index": 205108, "batch_hash": "0x3f85a738ce524b2f74597e66a5d61f5a76f27a3f077c21e62fda5d50ea02a441", "commit_tx": "0x0090ef97f9c2c1c3a1acfdded70faf2d3e07a94e901fe4b335b880cbc7304579"} +{"index": 205111, "batch_hash": "0xd51c2367a5ed74ed3262b79454ce0e3e059182ebc1d49a7c883f5868b9c0714f", "commit_tx": "0x041d294bb187db92e8441da68e76c64fe2e4268be1ea29cbbce4a84ec926a43f"} +{"index": 206953, "batch_hash": "0xd35a6eaa81666217c575ebc1d143a64bb95356d7b8f69f92dd497a010f695a27", "commit_tx": "0x21db702b826bfb42d6a193a8e31f0b4dc2c0e9409ca5cac2ddcec254d03e9766"} +{"index": 206955, "batch_hash": "0x374941d3318831802f185eec8239fe85241151217ba1a6dbd8e3474e8d746baf", "commit_tx": "0xb1a34540426dd10a0512806d2750939b1c5dea238b0e35460ff9e6b2c7ca9266"} +{"index": 206960, "batch_hash": "0x7eda569de033a5da9d8e0c048eb35b1eb2f853defe08d33fc6f6f724be3a108a", "commit_tx": "0x9beb6ed5f546bbe301113352ec2add6f053471819a9b83985f14c362d090dec6"} +{"index": 206962, "batch_hash": "0x6ec1b58efc5204180614421cb6545db11ba1740293f85f2d3f67af2bf7ef78b7", "commit_tx": "0x949b1d8aee3d5c714b1b7248ba637598f0255555d8eba5d5268edcdf4c8552fe"} +{"index": 207203, "batch_hash": "0xd7b3bb086b4aba4b0ae21eb9f2ea7118f5758d6613bf96472a9b40e53c54712d", "commit_tx": "0xf79cee838fbb900813c8295df3c1623c1729e714529cfa37e7494efff1d02397"} +{"index": 207204, "batch_hash": "0xa624a829cd7cf3ccde071c519f0b874a900e6ed539e9c75c329a08f85b6823d7", "commit_tx": "0x4be9264daec7397f9e594de345daf022505133b99f62b0a0bb433603741b73e9"} +{"index": 207206, "batch_hash": "0xb51665608e4ab2d573ff1c0ca45852f62cade13472b27839144f172380ef4990", "commit_tx": "0x3ca1a86f6959a26402b995e5fcffa49fffdb3b51f77a3d8a179502353b00c8f5"} +{"index": 207207, "batch_hash": "0xe35a7de8c8cf1e96b582721b5d8a8fc71bc32622fa8655fc3f4f5b7b68eaa7bf", "commit_tx": "0xd75f497da3c33acf112c9313fee7a3cb1ae359e73970ad9463d3bb86a2a72cbe"} +{"index": 207208, "batch_hash": "0x4c258d9ceb5d1aa3280ababed4774284c11aa825011c5dc0215f29dba65ed6fb", "commit_tx": "0xdaf3e7a4c6d49d6805cec68b5164e431e7ca21a0527cda7f7778008837554f53"} +{"index": 207209, "batch_hash": "0x817e99f880750f9fb50e777efb7c55a4faf19040bdf049637bcfa93aa279ac92", "commit_tx": "0xf980d2ca1e011011fbb5476cb4ef640e52b3595f9869a6394ba74f512819bf3b"} +{"index": 207210, "batch_hash": "0x7ebda66cbace587ad60078e8a8122bd2ec589deb1e16c831277443f7e4a796a6", "commit_tx": "0xcb0c93435cd7aab0f4ebb346784676af62817ec43b70bd813cb120cab58faaac"} +{"index": 207211, "batch_hash": "0x149b1136b67edfd97de09ab48da27f706561bdb4dd3300fe887c70ff80c67ec6", "commit_tx": "0x90f52c63ec02d563e07d2d61aac9c23593af644b26e0c4e6f95d14368aa19356"} +{"index": 207212, "batch_hash": "0x35efface0a8f78dc793946b1960f053b40cea7cbccf6091f8f14d0d4454e7be1", "commit_tx": "0x7a9bc276884a270d7b1031f2002c566d94fcdee88887f342b105a9a2a3a0a08c"} +{"index": 212813, "batch_hash": "0xdc6ac8f6139e29f8f3879ebbd29321fc7c574b72c25767b08b803df9731b494b", "commit_tx": "0x86ce178f13865b6221ec808dc0dde6cf4da775f53d0c5a32e6aa3f3ce3b2db69"} +{"index": 212814, "batch_hash": "0x64a4d22aa9225ff8672f4d1f9e5ddff6f607adcf144f5d61534c0991cfb1aabc", "commit_tx": "0x70572ae569a5634863de9e42ac80659bb0b1f61aa50894c0992759d10b08dcbf"} +{"index": 212815, "batch_hash": "0x3149892dfef1a11a32882dfbed120a4d3768f1125778d5b87fd7fe7b3dd1950b", "commit_tx": "0x4f5046007455d961d48e8fa85146dc73d0d052b1f832c5dea992d6248f07bcf4"} +{"index": 212816, "batch_hash": "0x3fed2912749bb5199628fa60c03d509fceb30cad7e4c5faa86e04e7031ca254f", "commit_tx": "0x6184227716bfd72fd23b50ff625fea13dcfaebe09a678a69f266fce6df00547d"} +{"index": 212817, "batch_hash": "0x72ed5033177319cd91bca4aee8b08d74de811d8c849c1e804d289ac6957de3a4", "commit_tx": "0x2058d72a664c4a92a4d7727d2ec5985ea5a7ba8c42dccd004126c08f8f6993bf"} +{"index": 212818, "batch_hash": "0xd0dd5558aa687e95e15f6bc0b9e8f79c5eb3670f74b5a6d2b628581d5491c35a", "commit_tx": "0x04aa9d5dafbcffe4d21725e25b311484ec3fba704e266738b92f23eb70e9cf3f"} +{"index": 212819, "batch_hash": "0x4e1a9e57f4624012d7113c4fea191ba4ad87192b7fdf9758b04ff9f7c56e670e", "commit_tx": "0x9d39fbae60d6dc450908251ca973a90fc48c7b0e91cf7de261a4f66bde13540b"} +{"index": 212820, "batch_hash": "0x5b03ae73ec14beb5b1af3b1a1c4ef233d17e4e0e381a4add594293a08bcbe815", "commit_tx": "0xf3efe655966c8f7fc8c1c504b6f2704b7beb87ec10bc7034c5a1d28697e14c85"} +{"index": 212821, "batch_hash": "0xce71b962f1051071d2c262b9f62102fd899a5173b2e43d28cf9f330ce4fd6339", "commit_tx": "0xdc8fad191a9d676b9c407236eaf0a328aecf05ca86386bfe70a3ae9381be9217"} +{"index": 212822, "batch_hash": "0x33c360471e7929c6049e8a0d0c6f8eefe0304c020ce25a76447ff5156510d575", "commit_tx": "0x4c2b732faf9a6c25c0d4280a3d62a5f80211875b36931b7103b087a67a6acf23"} +{"index": 212863, "batch_hash": "0x14d62afac7c67d467387bfdfb493e918772eb2a9269bb98f500d463b96075be8", "commit_tx": "0x2e8436b9bead44348a11f073dba3cc2dde762213a49e6951143b9f87ea088cfa"} +{"index": 212865, "batch_hash": "0x0037bfc23cfa61719c29d2c0ff22e8092be23cc27c1c12bd8477f99f7f95211f", "commit_tx": "0x4b953bef89fda810ee476bd183b17d0aa58c70efee435125387991d8ded9f98f"} +{"index": 212866, "batch_hash": "0x3bf9f9e8e7b61b5c2654b56779889cdde36e2648d2ad8c0bdf609afdec773954", "commit_tx": "0x845c2d5d94a6929f58f7a60d96184da007ac6e62475ae26e78ff50215502223c"} +{"index": 212867, "batch_hash": "0x2c401871d52922f8224ca70fc9ac30e1dda9354e92f765fe977da2f2d96c5cdb", "commit_tx": "0x144876e9ecd7df6a15955430c3cef71f2a6d42f60cb1f9ecfdc02cdc7aca8f72"} +{"index": 212868, "batch_hash": "0xf8525299cfda6508cafdde3f93ff73496c44e4594490328257c742b4a7ce7b9b", "commit_tx": "0xb1b778448796d9d043aa200f6ae59615e9c592b0b81deea3cd8bb541f3b113e8"} +{"index": 212869, "batch_hash": "0xebd2cf8a2a259778d2b383bfae2c57a59f4dc910924983342062158a405fe456", "commit_tx": "0x33627c6fc574f156389a203fae9bd5d5381e35a445ecb2512716a6c56d5f832f"} +{"index": 212870, "batch_hash": "0xf66e867d8386450fa76434f75fda5cdda7a8df3048944fad5013ab427df2eaff", "commit_tx": "0x41de8ebd944d42e8bbc1d8600d5e987e8d9eb5dc3d52c6941482b0dff32c171f"} +{"index": 212871, "batch_hash": "0x54fdfa8fce20897dcd4fce82833f0e9ee236878f94aa98fa9f0f368e5500bd00", "commit_tx": "0xab428f422ff16a56a2f7aec789402220933f2cbda44d2efa8f148402fd94298c"} +{"index": 217043, "batch_hash": "0x15402f4a7b2f82f216412250ae17fa63e0f3cf9f3a776c97e9422bd3e3033dcd", "commit_tx": "0x5c90f879e4b3db1bea83d7054d1be07bdefec4b0c5a9f3442017bd663902f61d"} +{"index": 217044, "batch_hash": "0x2714b9273abcebb7e2b3387060d658d5a5224ee8a0c39e2b97185058179d34a7", "commit_tx": "0xdcc1ef2d7e55a13658ee29963edc467ca12aa698c04ad6021bc243e61de8e733"} +{"index": 217045, "batch_hash": "0x96b60cbea40e961062be12af4456f58ac62c7a01c5907db80c94652922fc5b09", "commit_tx": "0x4674b4ad7de2545d191af3f3d801a7d43c7c826f3d6d25b78f124d76217fec77"} +{"index": 217048, "batch_hash": "0x19ce1fd242ca8395da7f3da673266e8c1c3a01ab18d8640fd7f496af0f09e35f", "commit_tx": "0x73b7b1203f2ddcc9762de3f41a3a9864209bcd646051e5ad37bc6b6079782906"} +{"index": 217049, "batch_hash": "0xc0b1156002d31eb9ccf9f5ebfe8b0d7f376b24cfc9d1c6128c23bf35482c2490", "commit_tx": "0x5283e3c7e3e8998bdc67fcd54520cb12c2987607e103f1f651a0d043fbe4b220"} +{"index": 217050, "batch_hash": "0x249ffb3a9076722b0e82d0abd10e683393742994525cad9a7efb8064f8228713", "commit_tx": "0xd3b7f328cddab50f44f81b51e16b287e6f326f2cab64f60add8f8eb88a2fcb24"} +{"index": 217051, "batch_hash": "0x1c1f15be45157f636b7074a56cbcce93280ec84b6b0f4d815d7dc5c7ee26be4c", "commit_tx": "0x33063d569dec3af7654b3269a0bf7ff727558eaed74d5e9f946f3842c32d3796"} +{"index": 217052, "batch_hash": "0x29288e8112462aebb485fe23a0bf10ab727f430b420db2b6f98f00f3ce584e03", "commit_tx": "0x41d95d32e28fe7b4538fb662e7570ff3f6b487aab5eb120692d56d183960f8e1"} +{"index": 218443, "batch_hash": "0x6fb0536d300333198c354a1cfaf01eb0579bb1c32d673dad9e824a04dcb0754e", "commit_tx": "0x25130967a15dc8823385fb46e07793ea7265dc52206d8a85f879f3d9e67a2464"} +{"index": 218444, "batch_hash": "0x953567a496eabd6a32e4e1bf0e4c422d1798f5a7547fc5cfcdf00e8624d17eae", "commit_tx": "0x13cf479ab8df75725af4feddaa055697cd99f63e83d74c365105df58bf10524a"} +{"index": 218445, "batch_hash": "0x0314bb8a0a18edb2afd9f4ee94867a6a8314661c905c7f7df2df40f5e92ddce7", "commit_tx": "0xd24342cf894cb97860c30d6bde8cbe9ca46451e7645bb175a05513e113284a49"} +{"index": 218446, "batch_hash": "0x52c282a121274e49c2fe899aec713d5399d713ce9a362cd166762dfa67da31a1", "commit_tx": "0xabe0fa0394e6adc1cb852bcd2ff38d02de61e7ebc0c52b3c39d840bec5b519a0"} +{"index": 218447, "batch_hash": "0x7ef6e28041e5573b9c5c2607a6b0a6ab532fe05d8ab85a0308badd2cecf2bd12", "commit_tx": "0xb299a8de324c08ffcfdf9cfe810d9be5249e3d16e00e4e0b15e52c899b59dc61"} +{"index": 218448, "batch_hash": "0x0f31cc742ca725459d8bfe5cfc5b33dc8d0386d0589f1f93bfd59f31e042dfa5", "commit_tx": "0xb3fbb6f153d9586adaffbea3228a0d779fe2f36f2228ad8e2279db1aa2300930"} +{"index": 218449, "batch_hash": "0x1635fe197ed0d1574f5f0dff0d4f52db0f1105b06b81f3e76eaa580150f366b8", "commit_tx": "0x1a4d0b64331542f26111d5366c6c23d020be1382463689faab42090d9b41a280"} +{"index": 218450, "batch_hash": "0x4323628ddd32c2f622f2f833fb32304d1bfb209d89ac9a970ae240a5d0f3fa24", "commit_tx": "0xab6349ce88278a7df501ddab8a527ef960a6919abdef2a3c0152e9b4c38d6443"} +{"index": 218451, "batch_hash": "0x21e36b0530a97238d34f67b2b86e40406ae6d238212ab096e245c8f89aa9f30d", "commit_tx": "0x381d3405819370312b8a6215f76df52a3b6a7d6e7c1b6dc970c5f3ee2768a701"} +{"index": 218452, "batch_hash": "0x37fc87437477d4c21cb8dc3cbb69bcf8a5bc19cead7b83e22014d3fa6924f9aa", "commit_tx": "0x86d30c66146f3255c4dcb9c71e897725316993924844f96328a06e07d029d5fa"} +{"index": 226803, "batch_hash": "0xcaf2632c125a8cb5711f29494543703558d254d3feaf976fc6d2d212464af2bb", "commit_tx": "0x8445ef0a0675da072681bdd0ca2764d1774eeb2e8c88c125a7c05f59bcb0d812"} +{"index": 226804, "batch_hash": "0x6053cc23e25cf42c9f53d9be8d8a8a5cd8e45896c33ccb834c3d350237040e5b", "commit_tx": "0x9d09a719a08235dc247b21fcdd13f1a644df11af2f9ab45493550f2aa2437568"} +{"index": 226805, "batch_hash": "0xf2fc6d27b45e00a3f11f0d8fe716cb41825493a508a494e94b81d5cba0407974", "commit_tx": "0x5ee72868d7347e3f96c3032a9b72931663919db6e134ce09bc0cc2c102c8779f"} +{"index": 226806, "batch_hash": "0xae67f5a0603c4040d17cc974525ad8a72cd891ecfa419603eca7440f77d5858e", "commit_tx": "0xeb630e759636defb4b2f672a881f5deda4e2c14e17586139d1903fdf1024ecdd"} +{"index": 226807, "batch_hash": "0x252947ebecb04013e13725d46718461ca8c0befa5598f9251f99c3d9586b3601", "commit_tx": "0x381dbc0f711427e5becddd044ba42a359c7f8ed40afbdf714e12ab35b6844a55"} +{"index": 226808, "batch_hash": "0xfd86207e346d6964856d4223cabe342986c52b485c7f0188876c26004bd742b7", "commit_tx": "0xb6d15c4ba6342a5c603157f8b87670ff0a2aabf6ebfa6add7f39769cabd03315"} +{"index": 226809, "batch_hash": "0x97a403cd2146eb36293f4e2841287bab394c41c3c0b2b50d7c73278f1c1d764d", "commit_tx": "0xa5d1d7b2bf2115afff7d9e4ecf2eca9ae43e28bd3c7e4b0654e64f0442c54d1c"} +{"index": 226810, "batch_hash": "0x1b599cd94dd08856bb20ca2400e1bb0d51e7ec83f62abc769571cb5bc766254a", "commit_tx": "0xb15521325e766a94cdc86b76738d40141099a0b810f247cb97c06ae1188bb81f"} +{"index": 226811, "batch_hash": "0xee7f7aaf9a6b873a22cd7c9e29496bdeec816ff5a320b34b54ed7a0efdd9acb2", "commit_tx": "0xa8f968b5027e65da9dc39ba5aca1cbc6d3fb6d2f3f677ca38439354042335141"} +{"index": 226812, "batch_hash": "0x11d85f5b48e91e0af61af8b8f1105392108656fabc962d5602f9b770eda78ac4", "commit_tx": "0x94fa501a880781aa75c8bfb130827266be51c11b14bd9f740d42f57d3e2d3a8b"} +{"index": 231603, "batch_hash": "0xb3e0a6ed27ea568e6acd8f2b1fd5c1d88c549db1cb7b21b600058453a5f816f3", "commit_tx": "0x3417ea9378af99be0ffb5f644a08f76b322763945ca32b54482684193e7e30e1"} +{"index": 231604, "batch_hash": "0x0c294a5739d1eaeb17685f4ca69c1365daab292d396b510a9d57ce7b2aa54e0f", "commit_tx": "0xf62cf207313950b047062bbae17af9f7f545923dfa0cfd84ef1fa53c34430637"} +{"index": 231605, "batch_hash": "0x390f4803eddf79dfe052b9901b6df79eb4110b92f2a1c07001e244b2d73f7184", "commit_tx": "0xc129e62e9ea2592f627c643a9796fd5cf293c87bd24c5df08ea83e616fd05933"} +{"index": 231606, "batch_hash": "0x63cf9a2aca482d232f9dbd738d61cf3f7afa45f1957de5794a34e861da9d1695", "commit_tx": "0x21f4cbea9985b5aece495b8e61774e9f8e5b20603ee8059b452909e1b68da1ac"} +{"index": 231607, "batch_hash": "0xf9e42c1cf63e89aeaf96304f26bd5d5ab86ed7914fce2997d8ff3c8f40593135", "commit_tx": "0x959e0d3ebc9c3c6f8a157631c6ea82b79455b2adc11da437d16c25d81b32385e"} +{"index": 231608, "batch_hash": "0xb10222b6fcbc3811ee4526d6ac8617e8563d1d93e0a7090e07887ca0c2111817", "commit_tx": "0xfc3afca5691951871be55abae0a5add66985bb5a2308f615193d74bce2a654d6"} +{"index": 231609, "batch_hash": "0xf89d7d79241fc6c2db4e1f573f4358ba90ed9f2e66594e490ca37be28c390366", "commit_tx": "0xcfa89c0bfc2b2155e511bf03b4e93f1638874f6a4515b76a33be1738528297d8"} +{"index": 231611, "batch_hash": "0x4c2901a0964c8d226723aba3c04f33898b2d4953543377faa5ec2d155f1be3b4", "commit_tx": "0xd31b625e3ecc5d9ccaec53568dc1f9087858f31e1a2f5db849400b596b78bfc4"} +{"index": 231612, "batch_hash": "0x194425504f39cc16b61151a6590dc0df72f9782af410f04590d3126485ac309d", "commit_tx": "0x4802f766a317094a75ce6a82316f5d7241ea33725a1229079a5c027564b041d5"} +{"index": 233453, "batch_hash": "0x753b67a735fac5c5bfa9a1dbcb84db7790af5e7b3ec0d8dbabe8661c25b64f40", "commit_tx": "0xf666fab6c9a8911f4efe068c09ab299ca54a43d93486da5b21328631e8dcd11e"} +{"index": 233454, "batch_hash": "0xfe69c166ecb803be4674afc599d2ac4ad8dfaa3b7afaafed63ab6d74a1d30016", "commit_tx": "0xa6ec7e25cb7f2a06e904c7951f6fc55cb5520988629ee482ab5db512e483a4ff"} +{"index": 233455, "batch_hash": "0xb9f967d1bc95fcc44b48af8cb857af6c2dbcb82a0222c4f82567d04afd282381", "commit_tx": "0x385c398efeb76643822fd297acc22ab75314c48e231048c2e4f78f4920af8499"} +{"index": 233456, "batch_hash": "0x453b0984b55f55827fb4cb7ae27b1b40f4b98757801a36177f83761ddad82573", "commit_tx": "0x8a3993a7b0cf8a5d7f9800886f0a6aec359b3fd4ec6faca2f657592d7bee795c"} +{"index": 233457, "batch_hash": "0xb8d1b4e835b37948db463b486d50fa9ad6c802428cd526700b3ab8e87122e096", "commit_tx": "0x5e5fef62ce978ce881f914190a839d71beb2e6bfaae9a24e062411b10ef1fbf4"} +{"index": 233458, "batch_hash": "0xf266c2b69ebd44baa38412bd77e478ff1df8de3f13354fb8fbfcf098d36efd42", "commit_tx": "0x9b21fb178067da4c735fab209b7d832c968582369a80adcb5fc73e2f7e461353"} +{"index": 233459, "batch_hash": "0x5a5cf45ce1603c36a0b69643fa841f685e9ff2e37b29446df30740860e83a25e", "commit_tx": "0x48cc9fe57d9f2180ca7f0c307f666cf513fdc487ba7025595022652b2284382e"} +{"index": 233460, "batch_hash": "0x5588847b811172867786ca5fb844e59dbf21556207da5ca00c20eec510d981c3", "commit_tx": "0x7c1794c7116dc46728e7d07655e3ade0f8e49c1b3e0c2fb6894640f1bbb1c897"} +{"index": 233461, "batch_hash": "0xac04b7eb7f67a523f66f9481874c87629a16df5c9e60831e294f81b5b653343d", "commit_tx": "0x1175ea45097e8d21f81d2c1baebe0a365240a596307a6141cc489b324e5e0ff4"} +{"index": 233462, "batch_hash": "0x27eb8c07a38f69c264069760e0a7b9f9b2ddf2642eb143639b3f83c329c379e1", "commit_tx": "0x518705956bbd69045003a5266d65cc3ad4d205dd4f5146e37dbc16a18501632b"} +{"index": 236213, "batch_hash": "0x099d4d01fa6bb5fc9e5f3a4ae5e3a71c3e279eb234c1c8246798daeefc4c0fdb", "commit_tx": "0xd10ed84b8278448e1169b23eef400687d3ef4deef9229a416ca2cde4755ea6cd"} +{"index": 236215, "batch_hash": "0x3939686f769e1141bb41a32d5d4d838622e7646178494cdbd4441b88482b750e", "commit_tx": "0x32a06f27246cb9c7daf161c4d0cfb79bf7c9513a4bd312f905c5a7aaa84648d8"} +{"index": 236216, "batch_hash": "0xd4fa76fd18c5975ac290d5ffa65c322b461ea13b364ea37a103d005913946787", "commit_tx": "0x6a2b47eddbb839ea52ee9102b8f28af46a498d3f9d77860359e92b38460827d2"} +{"index": 236217, "batch_hash": "0x54e3532fbd27327311cbf0843ecaba7fbac22d56bb45f120da03f34f63ecac49", "commit_tx": "0xcfbfe32154c676500efa4a689d1903656f97eac2029484f62ccc10fbadf261a7"} +{"index": 236218, "batch_hash": "0x77ad3647a730a5990e6e9ca7942f041f50e15903077c352f4eac8f80c3e89aec", "commit_tx": "0x8c28b2976bdc6cd83f80e3cf09e7a4f0b97ecfd4c7723bbb64cc042b77ad3eb9"} +{"index": 236219, "batch_hash": "0x77f2480003cab7644c1f5ea1de2046dc63dc3af46e2270996c81368d5c478e41", "commit_tx": "0xb28a32df32579dc4e7d02141a0db31bbaa39193ff61f4ff799a5f7f18683dfcd"} +{"index": 236220, "batch_hash": "0x2a44c49cc98c6521dbcaa0af9e56a126980a846df68925fe0f178cb67e811d31", "commit_tx": "0xbf2e8d1255a7cdb3da6bf5f46861fbb038057d6f9aa0148208ae6fe3e2f654b8"} +{"index": 236222, "batch_hash": "0xdf7c737842725c7cdb68b5bef8f1074879bb23787cef75e19c34b1c3fa97c6cd", "commit_tx": "0x4acc43528635a6f10c9cbd83531f7af2dd62f51146d92a44c72b3d42c17805b2"} +{"index": 237093, "batch_hash": "0xac10501ac3c33ad822797a6b7e3a45e6664bff362096ac26c7fc5e412dfbc1af", "commit_tx": "0x5404c9f372a3053185242db68f88aed8a2bdfa71b828d9f2fcf6b82b88aa33ff"} +{"index": 237094, "batch_hash": "0x4bdee83370bcfff2c214e7f9c2060f3e76554c78b36d96f66d6b3781abb59b09", "commit_tx": "0x73b7f57cb7b93d8aca08a1a599a4a60d641237e0fcbbfa83116cf3b30e1cd9a4"} +{"index": 237095, "batch_hash": "0x27139e45cf04e657adadee7a9fafbc87ae6abe07b4b2903ce0cfaae64782b54b", "commit_tx": "0x72d30c241d862fc9194c6a1ea600876afa0d539ad3f1287038090cbb9bba358b"} +{"index": 237096, "batch_hash": "0xf7ea184f986a5796ba94766c62627cd1f508e510d88303a72375e023c96bb6ac", "commit_tx": "0x639f78623599c6a9ca27a8046cd6a22c8241f580e406317e3105091230b72a5b"} +{"index": 237097, "batch_hash": "0x2842772b30f92d9a72233a2f2b848fe38bcaf6a0ff009881e973a1205430c565", "commit_tx": "0x9339eede3bb23f6b91d2c71850c0045d57029882535a2b8682d05f6665be38d4"} +{"index": 237098, "batch_hash": "0xa18e7cf80d3aa73db77a948379579792124cf58219cec23fdf3260faab51a035", "commit_tx": "0xbe213fb5ca2342f64989942164e8a530b7896f646e3b745eff57b30a56f9f967"} +{"index": 237099, "batch_hash": "0x16c2aede8272e449f54e5ad6f0f47989ba726f36699bc9f44920dbaad98670b9", "commit_tx": "0x111bd7fce777839d5cbba1ea5800791e6a6c7df15b33f67ee3e9629a12a94aeb"} +{"index": 237100, "batch_hash": "0x2e32b3c0921afc90650675e9e4a92858b159a14ce7c596aff5b4d87659d0d23b", "commit_tx": "0xa72f381634b5a9f5731f15b40bbccd4f05e91ce2c628ffaca573b4a452d2368e"} +{"index": 237101, "batch_hash": "0x011e90c1ffe4303a69a7f1658c1fc3fd8a07e67527b0ac9d634d7f3b67d3a078", "commit_tx": "0xb59e655f97c6097dc44e45971179fdc99db610d022c539c30c96ff7bbd8f2493"} +{"index": 237102, "batch_hash": "0x93284087445d149f6b460fa089db5b959bb7de55f806a1aca4d302d7d22cd997", "commit_tx": "0x690e44abba53c88db16fadd05a18efb0b3731d649dff4caf7c7cb3c09d40ce12"} +{"index": 238403, "batch_hash": "0x2ee9e5007994515e75bb13cb24254b5950172b243e38f7849590a0f239c5d532", "commit_tx": "0x4f7adac2139663843f8da84d2237ac09b3d0967535626376af1cb4800848d05c"} +{"index": 238404, "batch_hash": "0x009ea715cb52b0a2996824b541aa840bd5cfeb75d2e232c6e7a98be78ab5aa7f", "commit_tx": "0x0db719cffedc0ca9044911eb049f4d448b222a237582e090b26fd0fb2b5dc8e3"} +{"index": 238405, "batch_hash": "0x5fa424514d322d958a309564cf70369ec50b9777d494ae6f0b762f872c895810", "commit_tx": "0x5b0837238febf5370c909e683b8dfb2cc7c55c604f9903274796cbd1cbe88e14"} +{"index": 238406, "batch_hash": "0xa1b30fc811c9c68e69902a2b0c4edc6f3ec24f3e2c38b4e1e8ea20a5a0c1b520", "commit_tx": "0xb987a13597e859add0cb2a70157e25c31862260fe178dfc0573078faa9b83e2e"} +{"index": 238407, "batch_hash": "0x0d5961cc0216a628f931267dc1a36f0bea0872a8d1c152079b136dbadeaa6825", "commit_tx": "0xce958b0db5209a082004940609278e836738dc1e1626e95d348bb2058cadea1d"} +{"index": 238408, "batch_hash": "0xe70f1e4fbdc066186a9f7b1614077298eaa4a14b0d1ed7a617776ec571fcf08b", "commit_tx": "0x9144063265139e16c27a295297f56dc7bcbce49253554eb5211d2afd9d24f88e"} +{"index": 238409, "batch_hash": "0x033fc9bd4a6c04917aa0931fbc48631980db08ce32e76e3880e425bc9715592d", "commit_tx": "0xa242c261c89c47cdfe135315a86ca6c26dfb5c32bec8802ec5fff5d3aaeb5411"} +{"index": 238410, "batch_hash": "0x8347f3b3d10e91f2b5b4ad6da6fc03b9e0ecb58dc1172a8377866c4843f66bd4", "commit_tx": "0x151b2246182283a329f2a010ee79bac3b95a647954000675216be8a7cd22f929"} +{"index": 238412, "batch_hash": "0x0bccaf4ca06751e216a26d374b24aadcbf74898da857428f40c478d6f90ddbd4", "commit_tx": "0x2cfb0fe4d82160ac55a4e2fdba221f2978b85d9083d0e7fc17aa83e6a34fc29e"} +{"index": 252313, "batch_hash": "0x1ea18e933cf2cc7f54bfade5bf6773199d619ad6534c824c87cae1f4cc79a0fc", "commit_tx": "0x1ff0204ba878e5f9bff6e8f05ca23e39664e717dc36843ec81eff8c637e9df54"} +{"index": 252314, "batch_hash": "0xd60f38374e99aceb51f252b3978e98ec82b6e9de95858ee6c2b2987465bfe28a", "commit_tx": "0xb280e422a9195a4192f05e73d639fd84d712c799deb730c641a2d0ef6546ade5"} +{"index": 252315, "batch_hash": "0x45101f10102557612343f10681e7b2c64084bac5c4c9972def35bbe10896ebb6", "commit_tx": "0xa4cea0096b584fcb2c3b5233631d1830b070104de6965ceaafde8038b26a7b73"} +{"index": 252316, "batch_hash": "0xaedab44946d498146937203d352bbfc5fdc2eaca54a363ae2d8c185e045c4f70", "commit_tx": "0xbafc4328101d9de50e722e562269444b5253b4d348cf529cc17e56783bd44407"} +{"index": 252317, "batch_hash": "0xc1d9d6095be4614496346694acd60921b49c76fd1c6ea4581a541c4a1123d00e", "commit_tx": "0xe5670864b37659dedd6b29ad94befbf549b70ac786fb769be288594289cfacf6"} +{"index": 252318, "batch_hash": "0x8447d77dca12d3d5d18c9921250dff9d4b2b8484845b4cedac2caa6030607239", "commit_tx": "0x765554925342e6866054e5a83f2bf09543c2b222b71cf7586d7e2c4572c8584b"} +{"index": 252319, "batch_hash": "0x8b2563345610cf8f273c5bfc5d9cd7fbaac5386bf45af6ef2782ebc0e2e7926f", "commit_tx": "0x129e37c591db9325543b7f0e567c25687b323c2ef745c294f68e6a3e96b627b6"} +{"index": 252320, "batch_hash": "0xc2c75784d6b683e6949d40e53a28b86cf02c597610db5b0a7a455eda5cdcdeed", "commit_tx": "0x244fbbb715c0ca1dbe85aef9ac97269e15e06644fc70ce4d99905a0dc21a7440"} +{"index": 252321, "batch_hash": "0x71c0ead56ccea83b0a282a829c04dc79dee4cfd080d61b4524b73ef1b1708063", "commit_tx": "0xf3f918a6c3c5ac28cd9c60dec2ef8965812e6c232870d3e30f990271b522b0a7"} +{"index": 252322, "batch_hash": "0x1ec4b0ed7e807310c2f2b3b14d618ca8f62901bf3e761d7293123457ac4fc568", "commit_tx": "0xb3206e0aec9885a88ffbf29bfaa3e61f5308f992029c19be3dc9feccae2d2fb8"} +{"index": 253044, "batch_hash": "0x195aa4ecfe0b6616629f1efb00b6d3565530fe551a8111adf75edb18718af626", "commit_tx": "0x54527705f3ed191ace02880fe3b96dd3cfd01f1a6a75a792d0d2366d811e3275"} +{"index": 253046, "batch_hash": "0x34bbc4a6364c89d56fb3175689b613b665677a3faee2fbb301d0d834648de1f3", "commit_tx": "0xeb8df841afec9587c9e61b1176a3d03cb3bd8d1b79d7b56b6c84ba9d05c544bd"} +{"index": 253047, "batch_hash": "0x869a8149d6c7041f48fd983e2b527260e5d3d9dc95f148290f92ab558f8cc47d", "commit_tx": "0xe770ad544d4664d8dbb4207c79b375541775649b7046c814efe7dde4ed568507"} +{"index": 253048, "batch_hash": "0x2afbe288cacfab1933f8d29d38425f53ca8f93888a6e4eb93236e57fe7f0a303", "commit_tx": "0x95d52ef2079684038d55f96e3931994649da540a32b3d93f292dc23ea8215a83"} +{"index": 253049, "batch_hash": "0x8d4890d26cba9f2c620f6014ef84315e03d4b62073248fa79275435363da3f7d", "commit_tx": "0x62ebd458d725896d5054f1108743c652ff2cbd487f4a31282ec022e11988c339"} +{"index": 253050, "batch_hash": "0xd8dfe69e2c7eb85de5a417b95495c2de36e2309619b23d733036106e462ccad2", "commit_tx": "0x90816c751f40a699deddcefb4d179a285e093e077a9b0ab4d20044fa0f1c0491"} +{"index": 253051, "batch_hash": "0x98091ed188a5282e43c8e125dfe21bd948256e040c4375446830a22b0b8a5b30", "commit_tx": "0x15931bab7418fd5a9d8af894984cea2eb8c2dc4748228e76b91197d409fff2c8"} +{"index": 253052, "batch_hash": "0xbd8f6c874b6535a3ed1c6efaee01f347cd0243412e216354871db9d032c553e0", "commit_tx": "0xaa43a72713698e5117b5cee1c5575a5e6a50a5d76d8c1f19025737ea388cab67"} +{"index": 260203, "batch_hash": "0x6a4b7c05863a14a21d859bff26158459099f93b3943b3c70c0ef8014ffef00cc", "commit_tx": "0xa6cda87137ba507258c05d2da0f270ae5def33d8ebabe5dd8d887604d764fca9"} +{"index": 260206, "batch_hash": "0x505f518997900bde7096dbb6010c61d7be72d11d940f6ff600256f0796dd25b9", "commit_tx": "0x82f2be1f390db80de3d2654d4c6304ee1f6914cc97a9c994cb74171f6576dc13"} +{"index": 260208, "batch_hash": "0x74914cc0ee9141e4c5e088848c6ad19b05424c79d0504e421b16e3c015760045", "commit_tx": "0x96698781f4462e56ca334076388e94dcbb26109de4683018dac800e714c33e8e"} +{"index": 260209, "batch_hash": "0xe9a429bdb187373e22d065ea64d260a451c940a886cd9d8934ce4ae20fa72b9d", "commit_tx": "0xc0aa2c326f1b2f069cb0e2f181fe2f1db40ed0dac600a5c698bf5a6bf7433d12"} +{"index": 260211, "batch_hash": "0xe7193eef35efce76f81f3bea1660f742aba157f0e92e3e3fd3d31abc3b5b89e1", "commit_tx": "0x9a95a0595dec4e698f0d491c3dabb54e1667afe7d752b5732829dc92c98b014c"} +{"index": 260212, "batch_hash": "0xef09103cabdc3171736592b02ba4445073b6fd8ea95564c8af07a32071b45d9f", "commit_tx": "0xe9c117390fcd70ade28478bbd9cef3788d5c3ece608bbf7a39a76a2b3cce38fe"} +{"index": 266073, "batch_hash": "0xe42bcb8abff5350759d1d9594795ee21171daeb6f0b244e81300920ba5a593fe", "commit_tx": "0x5919c28e30a862e4374663dfc94ba32d76686e44f357b4531f9bc07492663e6a"} +{"index": 266074, "batch_hash": "0x9aa061889fc23098cd868f03bca56a1af39159ceb5ffe8a6c6d1edb31dfba1cf", "commit_tx": "0xab99e56b1a588d1a0d5830b89615b1db5c3f4af3b6d789d6906c31f3e5ad91fc"} +{"index": 266076, "batch_hash": "0xb575b785353d0758f168509e8642a137ea2e08b6d689d24a5dbd637fc9b581f7", "commit_tx": "0x709ff6546b0732f63bfdc2cf07911981137e525e885e5415c02371e92bb7ecbe"} +{"index": 266078, "batch_hash": "0x8af80e6d81287bae634bc6b470bb8c58b9234d3f6dd5dbea7d66bac8b465d4e8", "commit_tx": "0x964d9095e6f9cecbe592777e081dbb3e57f0ee80142ee8ed4098dab608c52936"} +{"index": 266082, "batch_hash": "0x4e6b0c471cbb50ac68e008d8159e8dbf7a65a5f2dc34bce191095d82b9718963", "commit_tx": "0x403953c2cd725b436af949960bd319e45f27ec9b31e877a286a72ca9af569f57"} +{"index": 267223, "batch_hash": "0x15e15d9483894f4df1a289ffb3779e7b258ea8c2c72870b35f6ed2c262107af1", "commit_tx": "0x076177a0a57d0126e21ff0950da35f2842fd627a7bbcf30a84346f8b4cfb4f64"} +{"index": 267224, "batch_hash": "0x0907bf972869622c24c0040bd7adf3c502f5d5a1ffe9fc9235b5d2f655d9e66b", "commit_tx": "0x051d26189753afbfcde90042cd9c8cbaf03de4638d874840aeffc4712c988eb6"} +{"index": 267225, "batch_hash": "0x093a1b29307c508f3cb7414ee95bde8d9c1d1b7c6a063891f6f42c033f3536e5", "commit_tx": "0x1758e71d0257d09d92abea7873c4aa454b54b9e180904a8283aed4630d1ee484"} +{"index": 267226, "batch_hash": "0xbad1841b3717e553360c39b4c74dc584e5c3580e70a52b7a56fcb7563bcf0436", "commit_tx": "0x0723848e8ce36a4f059ca47b3342bbc71b69e0be453a9a65832d67bf19c1c3d4"} +{"index": 267227, "batch_hash": "0xa4867396b2960e31af78865fe663b9cec8897b4ef73be64a1cc826ce133eb4e5", "commit_tx": "0xcad326a288ea7a2bc324ce9fde6ab2a73c6fc1fcf0683375691a0643be0767b3"} +{"index": 267228, "batch_hash": "0x3c199d311cb244d7737485f7f38ef723fa9319ba98d40f16255795940482a519", "commit_tx": "0x2c1f17ba275b0f59f53c3bce6771424ede709a097d87fba754f9de2185c01903"} +{"index": 267229, "batch_hash": "0x23ebc064696ee8481231da92872858218c1aef001e704728fb7d4cf6833b21b1", "commit_tx": "0x65e5751e0c9746ca5fca7f9ecc012ffaa24de9475f1e2ef24aa2a4d69eacdac5"} +{"index": 267230, "batch_hash": "0xee4c7def2a85e79598ec0bc76ec485ddfc80e6520a23e63bb96c170798f2e08f", "commit_tx": "0xf8e445c88885ff6ef18deeb44ee5124397bd958a6e7bcab2f995cacfc332265c"} +{"index": 267231, "batch_hash": "0x431d4c20cd81f2681294d952c638c40c90bf29fdff0b1009813fcfd23f7d8e53", "commit_tx": "0xb3e3a1616608eccb11b4f5d2ee702448022b54997caa79108d37135ea69d914b"} +{"index": 267232, "batch_hash": "0x70f2288680d1770eb2e6953094fe1ab67e5ffe4c013c2b892ff4a8fa70e32d63", "commit_tx": "0xbc1b3cf93dcfb6c1d9a6a7f00fe2aedc71d2441ffe4135df63c5fbdf1b67b1a5"} +{"index": 268023, "batch_hash": "0x2bde7e4de6b7ccda07c2cb7444aaa4e7a8ecc83adcd36133db19b24ae2cc8bfc", "commit_tx": "0x79ebc2c18d59652b51a03ee6252ca3dc87239cc9d82b108a94c055ce8a43d917"} +{"index": 268024, "batch_hash": "0xabed143776c71021393193234537061dbf8b32b4ef16db2664283971bca5e1b1", "commit_tx": "0x65b77f73368b3429296c82cfb6d05c1392430c875d44a0e4af111c69d1a4b670"} +{"index": 268025, "batch_hash": "0x77796d6215eab3f7f99f0a859e0a0e0f688200f6241cae6734f95b4f624f9f4a", "commit_tx": "0xa3846e6b66295d7072b3ac1e99d11b4d9252d40bf190673edbd8532e68a719fa"} +{"index": 268026, "batch_hash": "0x48868d6504855baaf8e037f96f2a179f9e9084fb8483a2acbcb57f2ffe5ae15f", "commit_tx": "0xc50bd6fdd7f3ec7737a7aaba85c8082b9593202ba506653fdecefde8b883cb98"} +{"index": 268027, "batch_hash": "0xb625245adac3dd02e155b97d2ab65043f14243755d86e2c8c33d4aabf82c6070", "commit_tx": "0xf7ecb436aec588a534a0129a90239efb8ca771962f21a2bb3848d6cd2d7c10db"} +{"index": 268028, "batch_hash": "0x13b8303b99f1d837c1e82a5c2dab750f3934ba2274ee2706984b9c31bccdb40a", "commit_tx": "0x2f05435364c48d12e4af55369cb59a0d5223ad5008ab8d613ede6829af5d4508"} +{"index": 268029, "batch_hash": "0xc25b68867dcfb25a1ae2f2151bb2b93d3d7f39cb0e3b9ce9c244c070a378eb3c", "commit_tx": "0xa3618d2df5a20fa46468f27dbc59a2efd3e56870aa8c4f1723c10f467ed9ffb7"} +{"index": 268030, "batch_hash": "0xea49ac129fd8d31e1ce1fd533e045d50046d71a9a8aa3050f04b19c18ca211bf", "commit_tx": "0x6948123f320fba11b10157d96f82ee4eebd379e64815f9064deb0bef91b687c0"} +{"index": 268031, "batch_hash": "0x78b6cb55f3a904117aebfd75c9e15bb2f343a9a7ee63ce1600dfe4e63b20c011", "commit_tx": "0x340dcc7f900dba3867664e5a1c4e0b124a246b7fa0b3d0e523d28734620b47b9"} +{"index": 268032, "batch_hash": "0xfe4d4e98d657be10d3da4c216ebf2078c71aaa0ea37d35633fb5617cd99f014f", "commit_tx": "0x972395a6a4145d8a33816299ee8ed985a55e757a9f0df94954c801dca5a054be"} +{"index": 269564, "batch_hash": "0x3725d80cd67e6e3fbd9ce8dd32e66f74a40a60da56decb1441ca884f8f1241d6", "commit_tx": "0xf2047752f962230f3891a44e4c70b054fa0f304a24f865208cf39b018a3ac5bf"} +{"index": 269565, "batch_hash": "0x82a73272e935fc6650be611ca0b7e3e785cfc2ec43a542304d0516597501399a", "commit_tx": "0x71b46b143b83580e08c11db3d48ee7d142df5e3acc2485b91925bb404d11b53b"} +{"index": 269566, "batch_hash": "0x455c99fa19e8cbc0e318977be013cdd613460a04d0bdb8f9ce80752bb5c854b1", "commit_tx": "0x3ab7a174d0e3bed3a46673561fd96ae847538cf751f67e088cde235bee6520bd"} +{"index": 269567, "batch_hash": "0x11a872a9b484f8c1052118ae8aee71db74366c05a3d805a9af3c6c8862fd2a39", "commit_tx": "0x73c6d552550cfc0a8c85b8773f7e969aab599d2bc2c2de6f98e3dbb44284b47b"} +{"index": 269568, "batch_hash": "0x284559427806ba27cd4a6091b3139d848ec454664f65775838622f702cd62b88", "commit_tx": "0x2f1405a8ae864b521c847096d4e58d0c812aa88e8eaf5169afe3a73274422117"} +{"index": 269569, "batch_hash": "0xca128a3d430897b74364dc37cabae62b40a516bc04d8fd7f30a1658302ea9581", "commit_tx": "0xc2ee27f1dee0367ceeff2f6e4c1bc860a0736f87024c85da6a34c62d31049aa4"} +{"index": 269571, "batch_hash": "0xf2e662558d3bdfb0e554499067f6becb85a2c3d780c733b1f3e2830115c6f8c1", "commit_tx": "0xf16c8a4e7ad114e063118065cce746912ac2ca1467f7d28f2b30fcf5cc3d37a8"} +{"index": 269572, "batch_hash": "0x614df2648f6b10a9b4bdcbdce9d632a5484382958ecbe91b4648585152c87fea", "commit_tx": "0x1635369528d136065cc3b0db060da9a7946bc82200e26cca9abf7fde6777a596"} +{"index": 270843, "batch_hash": "0xa9db9af1208fb967696d5a0e45ecb9e4bb3a597a7bdf5f17c7875c6bb5b31999", "commit_tx": "0xdd8cf3bc281eb586e270e4d8d8952f856c7ac8f60837848ac92a5fbb5fc7d266"} +{"index": 270844, "batch_hash": "0xf4d4845f2e338c3a9e6a0dd515b0c3ae81014c13dd7175a5bbfc0b0abedd6f9b", "commit_tx": "0xcef3946cd9670eae3ef35903ae5963f21aa42ae79348612e0106bb1cc9acb940"} +{"index": 270845, "batch_hash": "0xa0da23f30ebf21e207dd7ca63a7b3b2018d52a917b5130244a9a2671f10fc3bf", "commit_tx": "0x46675abdc6d0d10614355831685b2845d167a27be9a87bccb0ae90d95c3e6076"} +{"index": 270846, "batch_hash": "0xefab8c0d312e41383174371933c1d06b798d7845b30fb44ce23089a21fdf16f7", "commit_tx": "0x3c7b31bdebec93d37a75bdd4c15a332296c6edbd022deabc04bd1bea0133b5e6"} +{"index": 270847, "batch_hash": "0x9c1e826674eaa946fb1b0099abca0a727ea6b9ebee610fb23589c2880e43507d", "commit_tx": "0xda7e8739615b3bd5dfe0e02fe540b17a00efa56a970713820da9a11f7b67ccc0"} +{"index": 270849, "batch_hash": "0xff2772a06b451f181cb54c5b7dcacf7a0283a441051874e30c3704f77eb5bc69", "commit_tx": "0x7dc02025643914ed0fbe6c04de886683983933a446e2deedb8040b7539ec1dfe"} +{"index": 270850, "batch_hash": "0x9c0f186dcb67e123a3d11f8c39db76f25bb022bc78edd431b9ef6be04ecac983", "commit_tx": "0x3469c4c5066fa6ce52fa66ab9263fa22eee6621b40339ece18388faa8cdf1ed1"} +{"index": 270851, "batch_hash": "0xd796f32a3a292226e38da1f764a421ea9e98609a171d236dabe6d2e6a5f255ae", "commit_tx": "0xd8421c16be70fd1d36bf24f5bd1d8e1b17900b6bbf3c107f4149ce421e53ad6f"} +{"index": 270852, "batch_hash": "0x2516052272961b1bfbba6ab87d658fed00fbb4aa03979c03f8ec1ad08513a9f2", "commit_tx": "0xddc80b6f9955cfab719250aedb17620489e54349eca9afe3553f994a69771abf"} +{"index": 271755, "batch_hash": "0xad697f50c65b5703f39b0ed279438ffac163277f1f07b83bc3d5ddf6e1e8ba5b", "commit_tx": "0xc359c6e3b1fe267c96b06b4688f45d7629528e902064032ca78a223db8870f63"} +{"index": 271756, "batch_hash": "0xf065ada6a0c42161c5cfb82d55ef4654d5a6735d4bc434ba6e78a0613f1562f2", "commit_tx": "0xef9bd393047de44fbc253a62d2368dacec700128d08ff75de65662951c28edc2"} +{"index": 271757, "batch_hash": "0x8dd5d00a723c300efba71a1b7dbf7be82880d56b498b34d7f806a21fb8b0d909", "commit_tx": "0x0ad4e6f334a59b1028cd6700f542a8fe2f87a24d9f4abd207411f3d117e27c70"} +{"index": 271759, "batch_hash": "0x9afb725ac76c4fabaeca9c5908b7aa96d26ca024f6ada86523f200d20944d708", "commit_tx": "0x8535c17706142afa10eca90bdc568c698f8e82b1bcac6dab391558e04ee5a248"} +{"index": 271761, "batch_hash": "0x662da821d4663b7e95a9db630dd4cb60a461b53f29d6269abc66cbe44fd45181", "commit_tx": "0x0dc161f470567d95bb11acc1f7558a91385503ea8225857845ff50c0a7b0fbeb"} +{"index": 271763, "batch_hash": "0x88f993da0de33a1f32df5fb2eb94c1786a242aeef1a3f808e003d1d28a143d19", "commit_tx": "0xe360b96ca444e6bf92d18b9dfe9983bae15e7cfd048e78834dd344f06052c0b4"} +{"index": 271765, "batch_hash": "0x3bcbc5538ef35d3380911999be5dc6f87325f282c2c5de293a4a3cc394eecba0", "commit_tx": "0xa1d3bf6893889e9ed415389ac826467ed128c2b3b43b340c254adf2d4c5cecbb"} +{"index": 271766, "batch_hash": "0xb359dd175130fc2acf1a2a9123496be9d1378eb6289ac3994d81973e363d47d5", "commit_tx": "0x2eb23fbfb9f768f76848bc7fb3859899158de9bb7111c1336363fb4769b62bd8"} +{"index": 271767, "batch_hash": "0xde6460ac620107b1b9ad40f81a8b092a142ba898bb396eba5d5b61efeac4053e", "commit_tx": "0x71e125f2a73e779227e2a51cdd81a71d5525a644deeaab21c617e40fe17625f0"} +{"index": 271768, "batch_hash": "0xfea8fdfb2a82ed8ef086a93a667c07e0103e9c1b9be495f633f594c639491dfa", "commit_tx": "0xeee2f68bb8decbdab1e7edfe640ef719d3773cd05b020f99e8d4084673e502ea"} +{"index": 271769, "batch_hash": "0x9d4cc25a14b61b75ab69725894186d5d4d6d0d209809f153e796a7d459730aed", "commit_tx": "0x54476babde5ab68f62e3c8ca208efc06f4119ebddb253cb8cf82d96675d96082"} +{"index": 271770, "batch_hash": "0x45449aa26ead9458849f0e12516c427419c492a1177087dc7ef0bfb97e0a3ece", "commit_tx": "0x278ada505b0d019c6872957fae56e883c52d634bc8d695207d3fa56213cb6b35"} +{"index": 271771, "batch_hash": "0x679a3d6fd79f6a74760f6efbd33cc1c939edcf6bd9bc316eaed9f7c73e571201", "commit_tx": "0xfbc6c75fa9a0aa2a8a6db7cf8d96627fabd7fef1de4e002f87fb2d8a942e7f45"} +{"index": 273093, "batch_hash": "0x9d9b448df6fa10c40967757400b8a182e58d49954491b087f6e6c7cc2630c279", "commit_tx": "0x0ab06d638026b1321625420e14344568279a0dde88eea9017fd9482a80468d2c"} +{"index": 273094, "batch_hash": "0xf81502f07cca9e009781f5b4d42db7e61ee38c43d8941fbf9ef2b667cfbd0f10", "commit_tx": "0x749e2118e06a9c13c3de731dee5c2f3bffd969e23da51b7b75ab9f2c0f223810"} +{"index": 273095, "batch_hash": "0x0e11423f929e64b22650fef3c8b1a0bae200262ffbf1006a48da203f46195d51", "commit_tx": "0x9a8f9758a27661e1fc204a5547f577dc5898a727f22d58ec3220936c2f137453"} +{"index": 273099, "batch_hash": "0x74835384941cb4dac0b2c76b748c775605b986f5a30ad97f324f28adcff8c41a", "commit_tx": "0xb05d97f77c0d38f2c2f4c2c3abdd0789a49f1f0263f21c4fc04f031bcb968a65"} +{"index": 273100, "batch_hash": "0x8bd6e80873324052a32e3ccd42191ce1f809c6393080991ca507598359862c61", "commit_tx": "0x86562c9e940ac179acd4c8e25889a42fc1dd5eb81e512c0cc94d0eb59f073fab"} +{"index": 273101, "batch_hash": "0x1537e99f47e096db6d3def633006f0b8b4a2f8458ab7b375f8073758a299f82d", "commit_tx": "0x16751cdbdba4788fe2f1b55c370547eb7d2381bb6128817d9c5b226b8e9ca5cc"} +{"index": 273903, "batch_hash": "0x826842ec7fb66aee07634249893eb6a45ffc2510a1acdcd5b7c4c4fdfcfad938", "commit_tx": "0x2e935c7a5f9c83ace863dddfd15b361e88f3132accad9c696fe0893464c52a6c"} +{"index": 273904, "batch_hash": "0x578ddf3d293286ac3e297790c9ab88b14665515af15ad02aaaca2e5937ecbf7b", "commit_tx": "0xc10d3d3903d957cf691285f63d7d8e93fecc8ba0e2877e369e99ae09f61ebe11"} +{"index": 273905, "batch_hash": "0x4dd2184e22d83b400820be57a0bc7dff6f410ee099cd3473f04a76afb857cac6", "commit_tx": "0xf35d82d8003a292f5df6f080390630177ece4bbe7560fdda1355ab0c26aea67a"} +{"index": 273906, "batch_hash": "0x0649cc966d704d27adb6f8f1e13e0b477f86288d045f8c371c52844d23cf0ed8", "commit_tx": "0x3da77269e037906d67315f749bcb13fa3f542e22b95c54fedb2081bdfdb8a598"} +{"index": 273907, "batch_hash": "0x772a6ba30b318e0ff095b688d6b99e87f929e2080add7f320e308fa24b9dcd3b", "commit_tx": "0xe6a94ea32de1ad5d98674b8d43591e7454d658a18597c90e933926fd95c447e4"} +{"index": 273908, "batch_hash": "0xfd04bf72a7c296ce224f93fdd756bbc1d6fb094cb65a731098ca2af51ec833ce", "commit_tx": "0x72438ecf6f92453a0b34ad2635857c7230ac96b7f8a382f4d062ca00e9ce6748"} +{"index": 273909, "batch_hash": "0xe67d91760e928c633c8ffdf911b204b86d1e54d3384f2383e313a5417214646f", "commit_tx": "0x8e8f3a342fc0ecee2d60624be947d683528be70584dd268bfc28aca67cdbcc65"} +{"index": 273910, "batch_hash": "0x95e838a07600280114d853a13a25a411cee9949f04b099e9dd6ec3ae024fa745", "commit_tx": "0x90544e326114fb437181f93bc396cdbf0a57447a81b6cbab1025e88ba3208787"} +{"index": 273911, "batch_hash": "0xca53cdc2971e875969c4dda49e95f1dab0188d228c3f0a878beaf9ea4c7456fa", "commit_tx": "0x299416cb9fcedc9ed817044c5cd53f52dcf11de5b86f698a70e1809b2a5887b1"} +{"index": 273912, "batch_hash": "0x7559ced94696e92c3ff1252f41e128ddaff9b915156492abd8c3dafab41a0eed", "commit_tx": "0xaad5f695d99e7688df61dad20c560d70fcb3deae77b36d12a0b87d4b753ff401"} +{"index": 274315, "batch_hash": "0x8d4c09a28965f304a86c8fb2916f749f538cc88ce455fb49b650fb7f019cadba", "commit_tx": "0xd3fa2105b4fd40f49023d3bc8d92fa1d689e5573bbf2c45fce54029d153e3c0d"} +{"index": 274455, "batch_hash": "0x4e17bc355b1546cbe2d37833c26c3b883afdecb5fc4af31a4d4d34f762dd9a07", "commit_tx": "0x28adf7e2ab40271c999c915ccc59b2ec089386209a1c998a9f208dfd37d8f360"} \ No newline at end of file diff --git a/hardhat-test/testdata/batch.finalize.txt b/hardhat-test/testdata/batch.finalize.txt new file mode 100644 index 0000000..c0e1374 --- /dev/null +++ b/hardhat-test/testdata/batch.finalize.txt @@ -0,0 +1,998 @@ +{"index": 1423, "batch_hash": "0xfe5392fbaa1c59120fa1e8b0db5d4e81166a7e2d31d40fc24337ac5c17264b43", "finalize_tx": "0x369a1ad503f208d37eedba9496f3a733c343f46595883b10b6ab93e89a2a6fa7"} +{"index": 1424, "batch_hash": "0xe2ba38b055ed3a06a0a5ce4a407c707f9639b2f4013dd4859f884d8fcf7e8be8", "finalize_tx": "0xe0e039623b83ebad674bc435114d0dd596081a8f0ac9e19a956845c46f2e3967"} +{"index": 1425, "batch_hash": "0x1b2673aff110ed2b571f2a976da5531f8c5f749396a20d7e5afabe3c8544db29", "finalize_tx": "0x42627d0d3260a990c9be74be6548373cbda48a662e26656e410283ea4f5edbd4"} +{"index": 1426, "batch_hash": "0x7d9dd949f6e8cb6e23f7872f3f27de9e49b2c529c5ee81f599b6737cec5e8fcd", "finalize_tx": "0xd8311582d3408db2a64639116156f2f1f4a767450318d7026158137520d228fe"} +{"index": 1427, "batch_hash": "0x58dcd62bea5ef21801e3e21d86a608b63e069451deacbd68d5b1b2e066724ec1", "finalize_tx": "0xe4645adcda0c3ea5eac82072fb4b99183d50eb91adf5d2f509807dc61fdcad45"} +{"index": 1428, "batch_hash": "0x05c3d03c5329ffa300bf7a5bb86ac8a1c8998a8bce78cc3086b602b4fe9bc5d9", "finalize_tx": "0x8fa9ea587ff1ee4d60affc2cb6a684181329e3ef7944e17af5db677c6d4c30eb"} +{"index": 1429, "batch_hash": "0x939e9b1c4c3171f084d4d8b15b8105412be6a8e4be3bde13caa3a4451a55a15a", "finalize_tx": "0xaced8aa23c0ef22168e0647fca91ffebbcdcde6114103d51f65abe2faad7e349"} +{"index": 1430, "batch_hash": "0x13e0ce8d5ed6fd0e347fd5378fc38526ede2aedec31ab2d79d061eeffe168e5b", "finalize_tx": "0xccf06dfbff3292d4cec9c11ad8526417ab4e6fb1660d308d0b151e49af0bd937"} +{"index": 1431, "batch_hash": "0xce459f19c1d48ed41176b440711627ed34539f5deabd0a3af39d2154b5732c59", "finalize_tx": "0x7aae10c57dd74b5ed916502514cf2ca61cbe8c9c6b09c259676de59dd0aaa47d"} +{"index": 1432, "batch_hash": "0xd5955d9c995f0e0dedcf943261ef30c2cdb3557625b0b51921f934265a43878c", "finalize_tx": "0x0512840bec038d998e8988634bed5218b4391ff0c45bec1076a27209fc7d9ca1"} +{"index": 4973, "batch_hash": "0x02e364adf62c46bb5bdfd14f1e3a76b7df0c46043a4f0ab1d39cdeca62036fd6", "finalize_tx": "0xe09031f67eeb4e155c3cb0b0547480b406e7297cea3b05e7476e5871525d977d"} +{"index": 4974, "batch_hash": "0x2d29367a6ff1163c3274dd049c114e310018e72434ddaa64cd18f03c1bba74c6", "finalize_tx": "0xe12358fe8e879d685e1ea9ec543017980d30292fcd0cf4060f718201177fe8bb"} +{"index": 4975, "batch_hash": "0x21b0c8d15ff75192e6900cb9f6dc98b8bc7cf08a1dee9ad93b05e9291fd286bf", "finalize_tx": "0x3ab192b3d6e42343a71f4f7ba6a219723341f69d0acc9c402a4289f1141fccfa"} +{"index": 4976, "batch_hash": "0xe488f400ad7114ee5589c342cc766de036b9c9106edf2e73a3f0d1eeb72d00b2", "finalize_tx": "0xb84625a4b49b7e6d405cb0a95e9bb2202d722228408c512b10a904dfa7e335c9"} +{"index": 4977, "batch_hash": "0xf22760864cf4385eea5508e98a0948c3bf1f8b557cb142fe2bf25a56babd4aa9", "finalize_tx": "0x9238651796f712c828b902067ac78d6b4130ee564ff96780b2ab6f41d4159658"} +{"index": 4978, "batch_hash": "0x460b97b5218b5b5f29e277994a795e707b2e61827a4dafe3db56125237956458", "finalize_tx": "0x1d61a45090e78dd49aad6eae6dfebf6a64b15653584eb14c39fba3335d40914f"} +{"index": 4979, "batch_hash": "0x04cf9e678572c913671a4a14573e01f232f34cf20de1d457b9d49abbec8bb8ad", "finalize_tx": "0x44384fd7145aee2676e794cdb7c00df1118f8ee1717767e5dcddd4eb84c7e9a6"} +{"index": 4980, "batch_hash": "0x6942e13077e2ab3c72e5b9d780bfbfc04baa7be8788407fbd7dbce6b32c29c16", "finalize_tx": "0xdbf5bb985ded854f5c766ddb9721b31dafc5414e55c21a906e9b15d43735201a"} +{"index": 4981, "batch_hash": "0x89ffd65f9750145a72c36cf47a5925a1d86191c61cda1af31f55cd81dd61d7d4", "finalize_tx": "0x290416d45fd2ea32cf61eb7c10d64eb74aa32ec2c1c67e3d0df13783bf94c861"} +{"index": 4982, "batch_hash": "0xf0536f932de0ee8972074a82c145c240da1385cadc7da447ece900ba4a73c59d", "finalize_tx": "0x5742646b2d18d715e32d642a88608eb8fb3d4cdbd7fea682a55c28af3a748f67"} +{"index": 7213, "batch_hash": "0x0402403d7778e65444552ed664efc69c9fef3516d5b76e9d6d38ca1efaf88b16", "finalize_tx": "0xeed7a3efcf6d270964c5496b06f25eb5ae1e653f147535d63f36992fcc9d7c76"} +{"index": 7214, "batch_hash": "0x46c23f856cc8099068e68010b5bb1a45c4f20548fde93a89981c6ef6c1f4fd1b", "finalize_tx": "0x2469aeac1b6bb83c5cff91f92bf704a1b727f07b79c75e206e1c60c321e6a3b9"} +{"index": 7215, "batch_hash": "0x93f32b737145d2108938d1bdf5cf28b4010e5993d0ad236cf43246cd9f168d19", "finalize_tx": "0xa37ef114ea4ffcb6319aa23976fa28fdb16fd64bb69238993e9cfe0fcdbe9044"} +{"index": 7216, "batch_hash": "0x5a560043df82735487c38545762b1c0484d43324759e03b23b1b9717ef3f4993", "finalize_tx": "0xb5a57e44a567de74406abe86881c5fdd74c7709ea26d8ba93fe3047917586ffd"} +{"index": 7217, "batch_hash": "0x1451aff1ff25810af38c7f9682acda708bbb23b5f97a91c8897191c7d3cbca58", "finalize_tx": "0xb9e9198a00f1ba941deb1494b86cf6c1ad5670636b8b506a97e5ad8e6022a3f1"} +{"index": 7218, "batch_hash": "0x5eefb3f4a384e0d9ce6ee34ecb878c97f593d130eb75cd82e620068cad064fb2", "finalize_tx": "0xb6591a38f8eb15474f721393fc7287d7bf5518bbbb3f98943a92f2f7457b5bd2"} +{"index": 7219, "batch_hash": "0x49ae2778c4b11b17248b73b131c38d88b2d47752cc0e8670155af0e8cdb772b3", "finalize_tx": "0x9e4cd987a7e5ce70375424b4b3f53236a28f880cd45bf01dadc74394a87dabaa"} +{"index": 7220, "batch_hash": "0x6f9389feeb18049664ddc411dd8bb1fa5689e4011c479e4def3a2eafa71cc489", "finalize_tx": "0xba87056465f0135a53d259b0280c41622dfb2c2cb63c5273dbb451508ec58ecc"} +{"index": 7221, "batch_hash": "0x53e0c474a3e027604f4c00f9a749be6a255749b6277e50a62639d4c3007f1a44", "finalize_tx": "0xace583bb658d38e5eeaf140b7bcfee9e18e533bb445bc9d07e65f0b638ac5676"} +{"index": 7222, "batch_hash": "0x134dd22870dc393bec2077e2982be8d36f75d2ae1bb29efb03d35ad039fdd521", "finalize_tx": "0xe6627beb33b576eb698e8c3b390d17fc09c7fcbd3d60f77d1bd760e6a57e239c"} +{"index": 8163, "batch_hash": "0x94d5670ddedba9a379160c05ddbe472749c13c48e249a778fb25f0cba5f010b8", "finalize_tx": "0xcc868e0a996873a944d84f10650ee4c7cd9322d15f3f50e6506a9771c71237a3"} +{"index": 8164, "batch_hash": "0xe58d292935bc5ae6950730053258ef188c45d587a576ea355bef1d86fd298824", "finalize_tx": "0x839ecebd913d4aecf6b5cb95530731e0ff7ce0592c819a2a48e841019fd8b033"} +{"index": 8165, "batch_hash": "0x4edfb0a1b6a688e722204118c6425e6a2db19e6f0d9d3a00c6084d0a3e096818", "finalize_tx": "0xe998eb75df262a85e70d9ddbc295a65e08e556447ce7ba84b30185036dfab710"} +{"index": 8166, "batch_hash": "0xd11c772d65c98731b611e148975d188c948e4ac0410539c2d87e00d58af4dbcc", "finalize_tx": "0xdb83624f3f2a7db929bdebfa24fda1aacd16cc794e8a9ed708fbb5f07b87a0ac"} +{"index": 8167, "batch_hash": "0x7610490b56463b07d08dd050ea7431b922cdf040959d37beb7fbb4628b8352f4", "finalize_tx": "0xeec96b757fcf5ce227fc319b81a303b4c2c3321aa8576cc686100548d63c751f"} +{"index": 8168, "batch_hash": "0x7d2826cac66aae3833ec863546ae888e77afcf2d7b3793474d7868843ab7e0a6", "finalize_tx": "0x35ae573b111e97b6fde8e4053f843f474933c1d55c0ccfcb4b461001a5301b9a"} +{"index": 8169, "batch_hash": "0x23d5929bbca52de2625bc6b858fff0a770d94dec298ef25cfa053a975266f4ed", "finalize_tx": "0xda770145c0a5185f5bf7019161db6c0afa8d947a581e807a5edba90abe45aaf0"} +{"index": 8170, "batch_hash": "0x4628ee676ef28fdf8d85fa279d912b2e732bcb6d69d1d37d034cb4eb08e7719a", "finalize_tx": "0xaa779b18c0f020bd3a97a9af5644ea3e1fbc03c3039d67f0177ef0da94fec19c"} +{"index": 8171, "batch_hash": "0x244ef1acfb070aa5a493362acc8b77ec5a6d7e0673a1b093e0970f2cc67d6a95", "finalize_tx": "0x6900201d240f07c7c246a8f781403e706f6921bfac3a2e926aad2ed329158d49"} +{"index": 8172, "batch_hash": "0xa780f2815a61e6ce468026fa14fd36fd145a1d7e1e9a18961c0b4aa4c36119bb", "finalize_tx": "0x296d461176b74c37fe06951c4f100201c7096b082cc17dbe09beb50aec6eb59f"} +{"index": 13063, "batch_hash": "0xc122486669ba8824a33546d04c9f1fc35447b1a534e4622d41a6ff476a242bc7", "finalize_tx": "0xc6f9b3f6d50cd9b0459307ccd9dbb8476b00b309562c1f720a0422a58ac04a77"} +{"index": 13064, "batch_hash": "0x928335191d050c8cb0de72ba5b140ac7af8aded594d48c946ddf4ba5b7ffdc8c", "finalize_tx": "0xe49047f7f2d7b8f4295138fcb86045c0a984297fb538c2477d32d9b9b02fcb46"} +{"index": 13065, "batch_hash": "0x391009026fd1dad0b4748129390501667a171217eb981e642ef07e49adb3a5aa", "finalize_tx": "0x374ead4200e4d9f38ec5e541eb31df429d13030fb2fabd4d97b397d9c3ee1015"} +{"index": 13066, "batch_hash": "0xa39f8880c4985aabd0006570c116246d9d52d8e77498fa5b1ea8352c77fa9a53", "finalize_tx": "0x00de19033c6287bf2249c3ff468ac57445f12632cb2b2bb2698397bbefe80118"} +{"index": 13067, "batch_hash": "0x7a3356d8156e3d5ee32c9b623f0d67b0c9e772a5734837d7404026865ee1420b", "finalize_tx": "0x7d168b2da423fa4300b1e9667b57fcd40068dc2fd787664d35ddd6452c3b8ebf"} +{"index": 13068, "batch_hash": "0xac0f79b37f87e0fe24d7ba3b43abeb2115858d9c6b64807d2da9426902b571ee", "finalize_tx": "0xcd4dd3f70f6a03084f82eccc195ccd3fe4fc80e538e37cbcfaae455b83391df6"} +{"index": 13069, "batch_hash": "0x28077c13bd20b86a53302f31342e1558d0098727f82fa764d5d9d94b1a7c54a4", "finalize_tx": "0x5e4175634ca10caa940edda1f7a83f89f8def22f4441fb1c4004de727dd2d813"} +{"index": 13070, "batch_hash": "0x12d5dd0e7d6d006d710d6ed73bc46a6392c39fad6ab2018c029bd4839016b9a4", "finalize_tx": "0xcdb78b8091ed69b88509030ed0366987e5fea1d0eeea0d39000ea1a6aacbad04"} +{"index": 13071, "batch_hash": "0x520851adb630e327b08810b64af3928491217e83196f1d715209c92eb5032925", "finalize_tx": "0x01778ff53954025d278d6d22e401abd37dc1d14f15665f9ac752d156960f4fa2"} +{"index": 13072, "batch_hash": "0x2f31221f381ac18d523613525ea40dbccea1c66f4529c080752f9e2aa0a4fbcb", "finalize_tx": "0x6cf354725929f8ea24048df1c0b4612fe93c090352fe2dfdf8fe17945d10422b"} +{"index": 13103, "batch_hash": "0xb2c08a8fe10f307e9a0181e86ed31fa8f82c1f7119ec582d02ed3c443847decf", "finalize_tx": "0x91a665bbeded4f8303a0e490b673edf78271c0108d906dfada0c69ce8c42b9d4"} +{"index": 13104, "batch_hash": "0xcade6ce76b1da03335983f6a72727b991589b6daf05bc58b0312d3dcd53aa764", "finalize_tx": "0x2cae296046f59c3282f58712887225dede6b878e0bebc3f9b60695faea493a0f"} +{"index": 13105, "batch_hash": "0x1ff58287305f34e0c6b6aa173b842860dbe4e09cea1eea0d01f04448dcff8670", "finalize_tx": "0xe30b73c390918f61d2acf431930211b21da763f34e751a83029fb7baa4ee76a2"} +{"index": 13106, "batch_hash": "0x8192f414a9e4faf631689e4616c2bc932d1e16471d2c62c04f897e4297e6bf0a", "finalize_tx": "0x64e37597aa3798b37e17c47ba301e5de52e63b6063fa070df886966e5267e595"} +{"index": 13107, "batch_hash": "0xe1a54eb26b05eebe5d3cb06d5df7cbffee12ef74aa93635f50f5d32f6a563910", "finalize_tx": "0xeaaaac7bdc14b77659a50af3c126ff42ef080a93328914d8e00cb46344146913"} +{"index": 13108, "batch_hash": "0x698bc0460ba16d55fc7bcafa0c33b688a100c8cb9acfaed32e49d78ae31a0ba9", "finalize_tx": "0xf907df24dcd1893dbfd32d60dc6d3444a984bd120c5b60cec6676bbb0f8c3b55"} +{"index": 13109, "batch_hash": "0xf86ef0e6738140d25bfaf4a11973607edd023d05e43b7389e479b71b9c991728", "finalize_tx": "0x30357615daa7265b49e535e5b3954111877c8362bba322f79852dcc239590ea7"} +{"index": 13110, "batch_hash": "0x40b0d0e56b3d4535a5ac997cee013b284250ebc9cba36651db3ad9b01abf3d19", "finalize_tx": "0x06c473923aa79c98f30c61f11a0eefc374f48d264fa24673ca4993643adb69fd"} +{"index": 13111, "batch_hash": "0x29152aff62e12783b7923a4146e7938650bb21ec8e1f1f673b5e987c6f93c86b", "finalize_tx": "0xb712d1b5e45dfbb25b461766ab883861079cb64ef64353e697b429d7d05fabc7"} +{"index": 13112, "batch_hash": "0xd27b36d1d25cb593c2a439ec07d3c2439ed0d48375e54a43ffa4e5556b2baf8e", "finalize_tx": "0x1c799d1d535940b00bc04c0b0bf67b8da2ce5aa16554fe23cc54498449d5d5c2"} +{"index": 13123, "batch_hash": "0x18dd943c03a9c8960788798eea75d93b3614c55cb1d20c988a1858e9a4d7d2e7", "finalize_tx": "0x8a005a1c9eca8c3b70663edf9bd8e34a54104702e17ffcec0abea10eba8d9d02"} +{"index": 13124, "batch_hash": "0x4a6a31428a43a667b502fe8696302ecc983f73a6052f980ca6cdeaace4268332", "finalize_tx": "0xcbe915e62eac124a2550462284a6c41714159ee3fa880cf257cfeba148e8c0c4"} +{"index": 13125, "batch_hash": "0x8326dba8e47ef3c4f36cbd80d4f5d3ca365f2c1e6804c5a17f5beddcd072f54a", "finalize_tx": "0x01d07cd0a3db0c2e6931da3e525b3e35e8bd54b13b451facdad685afab5bcc61"} +{"index": 13126, "batch_hash": "0x1ec96e1a0df0b7754ea614a8858c24fc8890a396edbabc6bdae174257f1abc2e", "finalize_tx": "0x4b5128534a4ea78c166beff1861f312966c23ecbbe87bd210276033af312970c"} +{"index": 13127, "batch_hash": "0xed532341c22ecb87ac2ce80b879b7ee346f82358c62a14913b14e3a9e2ba92e0", "finalize_tx": "0x60c04ea9e0f7c6a3ad626187a7389dd0ccebe7326cc201e59710857d0ba56ba1"} +{"index": 13128, "batch_hash": "0xf8cd84bc83a3b7f795535f9f3bc9b399d874706117a3278bc6e9a10115fafdda", "finalize_tx": "0xa63da192c60195ede7adb39e2fb5c60e549287edcc962b0202747001fd1cac72"} +{"index": 13129, "batch_hash": "0xc6b486acd8155703232caa8610d6afd4e07b79d34f6ef4b7c4964ff925a86931", "finalize_tx": "0x4147ff7030614e040b887e321714721dd1891a31b47635386fdb7ee0e87b68af"} +{"index": 13130, "batch_hash": "0xa4d1d86c7a47fccfe54422f1dac918a4fa64aa32e5739de49632ce55caf849b7", "finalize_tx": "0x53ea4bf0a63fa454b0e6c56233f274a303dffcf796b33fb7ad04fda5fdf47dc4"} +{"index": 13131, "batch_hash": "0x7fccba843ffe9a6b5dc8f41f9eaaf7ae66d69ebe037d25b4d91afe91056fbcc5", "finalize_tx": "0x582827402f7e2a78ab0cd72b57915da0c35cee7867723c27893ffddfdd96e336"} +{"index": 13132, "batch_hash": "0x501ff17614d9527b22fe2441422510ba8a1b995500385c97cfb6a1aa42a1bed2", "finalize_tx": "0x3f76f173197c7dc204b8a2a4474f60d12873cc09414ba73bddf1b7070faeb1a9"} +{"index": 17673, "batch_hash": "0x286c2843e77f3b28d99acb62fba0a22891dcbb93366cca266a85736fd04037cc", "finalize_tx": "0x1ab65e9a7bc3c907218ae83f2cff5004b999f2561ffbc4a2664266fe0a8ab5b2"} +{"index": 17674, "batch_hash": "0x45ca37dd4faad37103e9b8efafd107b23487585b0c6045a4ca7b43aa07832757", "finalize_tx": "0x0c962ad3591b91116a71dc214be7266d05ce418a68d249cecf0769e1a7c2b67c"} +{"index": 17675, "batch_hash": "0x20199aaeb0650ea1d078d095745adfe5612e2ce23dfa85fba37df81b7b4b3ae9", "finalize_tx": "0xd8b56507f2acd7efbbd686c4d999c8e0a2199749db1e7dc6372d6e83ff647d39"} +{"index": 17676, "batch_hash": "0xa3783c199cc78ebe0e28d4f42171855fba919530c3fdef7d3d683e246832f72c", "finalize_tx": "0xc0c27fc9eee40149d84e9ac5e93427379c211ef0c58fcdb0581ab1024130b1c9"} +{"index": 17677, "batch_hash": "0xe5603b58d6a301db299c808650a878cc151df6a325367a541e21c585c9df5237", "finalize_tx": "0xf894d3cacb309f44acf33151392128e9c537f1c9851353fbfdda2f28f6f4ff44"} +{"index": 17678, "batch_hash": "0x757535f79d7875439de4ace51ce2a0cf43f22381287d8e7b9b85d83da43d22db", "finalize_tx": "0x5dcfc4df4a783e70ea2d5973c6627f6d700386ed5cb5840605d474118b9764a0"} +{"index": 17679, "batch_hash": "0x98342e1bbb54a9bb301ec0e7f91b80d406ba94c33b6dd0b0e08648e3c9b3cc09", "finalize_tx": "0x01182d8726150ed0cfbfac5a763feda943652bccbcd9a2573ade404d6e8e0ecd"} +{"index": 17680, "batch_hash": "0xdd303461ce9eda0335b6f4b13518ca05c3e84ed3de5dca812332498a2c7e9f4b", "finalize_tx": "0xc17ec7e49f305abecd2a867bcaf230e5b1bc0214118801be392486455e10af38"} +{"index": 17681, "batch_hash": "0xcdea0698c5b56e39dc6c1dc462bb586939bc1a213c4123264681195d586e7860", "finalize_tx": "0xcb2be261fd85f23bd2fa93bea725986529604f9043700b1e9798a7827cd44e2e"} +{"index": 17682, "batch_hash": "0xe0b89bc650c502c166d289999b4f3af8ea115ce8faeb40d29dd6cf72af55c332", "finalize_tx": "0x1eb8d5862cf5d2983a57f1108cb71a2b4d994a39ab0df97d35f22d7049d15e94"} +{"index": 20013, "batch_hash": "0x474176383ccfc5140ccd9443c91e2686b374501c5f36d025b9584d23de16b07e", "finalize_tx": "0x424c477f83e4de214f1a60f400ec26f9f1c46253b9f7aa9721abc6b61be99962"} +{"index": 20014, "batch_hash": "0x346a41ae1fa0081f57440092b405b0dfef6048228a949d0ca8bacde98bf1f9f7", "finalize_tx": "0xec238338b17692122bc4148b5efb234d5ca8b16e0ea5e91e8400815fd2770593"} +{"index": 20015, "batch_hash": "0x7b971a3140f3e94047e7ab7a40631eb14d4ff0ebec0163a63c1c275a5f26e549", "finalize_tx": "0xba508ab7af548664d6460a6a1b38fa1d2d5fd0fd76c82b99e3e791fbf2dfad92"} +{"index": 20016, "batch_hash": "0x24466782a3a06b31d10e59244429bbc9adafeb7d51d082e33c1066dcf3a5d12c", "finalize_tx": "0xfe231dfb443872807b6f14af3cf713c62f18c85051107cf1f8b32641cb155a99"} +{"index": 20017, "batch_hash": "0xdb0c76ed807dd9982b58b34cb88c352d9a84c445b185790429c361c030ad3a0a", "finalize_tx": "0x06157c9b613edcac9bd1e7e3b257e1ea485a3cb68f5733e94f19475e217d670e"} +{"index": 20018, "batch_hash": "0xdb58c5ffd1ccedec8ed0b23a81479488112d216dd44bfc9f449179e87b6e7252", "finalize_tx": "0x1b8eb0c3264f2f9dba74acf49b9565d18047e3275bf7472d104efc323a25b160"} +{"index": 20019, "batch_hash": "0x028fb14418ccda706c38d7b995c0074fc29f1fce8d31299de61345766e5e233d", "finalize_tx": "0xa6b7e6bf4ad4ab5316f662032ef71e36dbaf2783e5b4a1e8bf5c45a9edc148f9"} +{"index": 20020, "batch_hash": "0xe25ad7cb9cf6144e28784cc8c9de39cfaf980b4757e15c5455900019a8d8705c", "finalize_tx": "0xbeb11790a72a667d4312d3909c5448f3f61de82c85edf82f97575e798721043d"} +{"index": 20021, "batch_hash": "0x1608662b82581e8bd91c2fa169c15803b2b01b3c623759276f069c5ec653043b", "finalize_tx": "0x0c5a0c7edf7ed6ea9568c8d685d2967d58dfc7da1cb996270281b3247dae2326"} +{"index": 20022, "batch_hash": "0xef7c4f9edd4a0302b0c042fb0e13c2ed00040d70b39c8e9231dbfcdf5879e9d9", "finalize_tx": "0xa10a7050cd06b2c3d29f044d6f6f2a31ec66e63dfa959c289d22a7268a5866b2"} +{"index": 23203, "batch_hash": "0xf6f6fa1da4b81ea06539a2ffe4da931123fa71003ad03ceb07eb5f8bd4827511", "finalize_tx": "0xde578b49678042a843fcae62bd9087582f25aa52939d8b76c62d5d0fdb860574"} +{"index": 23204, "batch_hash": "0x145bcf5cde901bf4d708150f73e6bd0090a39af7b6977cf0d295538469e4b850", "finalize_tx": "0xd2e54d65ed764fd181a12d6527eff32264e22d028968ab470e233941b061df34"} +{"index": 23205, "batch_hash": "0xedc42ea54cb2b009fdae2e7429f5329d55fde877eace27a3f4de856e7d23fb83", "finalize_tx": "0x773a9b29f7345bdf5e21df214a85a5d1f0f30b54123f1b60d9e3a03f87b6b16e"} +{"index": 23206, "batch_hash": "0xc81cb8ee4142e13eac53f1f0f8fd41842e7f625cfdf8449b85d6f7d60d4e51e9", "finalize_tx": "0xda60312ea88b7547e1049704d2cd4cac6e19105f5419ea95211d5a06b1845e4e"} +{"index": 23207, "batch_hash": "0xe9966cecc99e71cc92b04e7d2b2e96751fa07e947ca2d62ab46672ee164684c6", "finalize_tx": "0xb90e4ab0cddc8c62dcfd0df904cff978d118f8af3ed7332b692cd0ff9082b035"} +{"index": 23208, "batch_hash": "0xffc1b364d0f0bd912f06d86029b312012541c8b679a300c71bd882a9fc65993c", "finalize_tx": "0xab81c24ea325bc7ac0f316019429eb97ecb013c98413e8799af12fe6702ba828"} +{"index": 23209, "batch_hash": "0x4f8d553742d99a3bf587d989e1b90ddab45c080e985418f75fde8348cda73e2d", "finalize_tx": "0xefeea1cb4e3c0f6a936f201e62aee61e754e987ba372f349177358a2cfc20994"} +{"index": 23210, "batch_hash": "0x458e45a2413f30381a2540be69ad2d7e4adc82458efb119938423b7cfe9806c4", "finalize_tx": "0xc07b678c0bdcc8f6c1385a2f1e5740eb13f15048a458b2f6aaba7754e220a33c"} +{"index": 23211, "batch_hash": "0xec4ae40f6e1c2bd7e4551b8095bb58f3745c968ac0a5ec1b4e1f168e109c7fe0", "finalize_tx": "0x64e4b2092ba2e19b77d4a4608fe1bdb9558068e42400943daa5dedacfc075cef"} +{"index": 23212, "batch_hash": "0xe1b4a72392a81f42d7d60d77f4c222efffc3a59c5e024ddcc164fa5b3e210c6f", "finalize_tx": "0x4bc71a204c84204b8f94506cfa5d3ccb2fd88abd25e9b3135359a4c97dcfccef"} +{"index": 26453, "batch_hash": "0x8a50b400181c3e36891ca1349a80aaef214b72773bf6768bb5dec3f94efa358c", "finalize_tx": "0xe74365a3388921c705b48d5906fcb6c51e5e003bc810c8f617f1868143d2cb16"} +{"index": 26454, "batch_hash": "0x39fe8b8b303f27a608eedb4d6bc112dc404902830babdd3449c6535b355d5f68", "finalize_tx": "0x7287548a5d178bf9aabcc4e9a5f55a6cff7659b26e5357472697d6710a0221c0"} +{"index": 26455, "batch_hash": "0xc51c6c0893b50429c3b03fd36122ce63f8cba9eb762c631b51684353c18a2690", "finalize_tx": "0xd57f904a169aba8c765a23f82f1fc7b9530530338dbd29c6b5408aa72d4eedda"} +{"index": 26456, "batch_hash": "0x8095b621debe55234637efb67dca22397445955190eff021c0ff06f17abdb5bb", "finalize_tx": "0xfca023e70df463e6b236931f4daafdf5e9c3011d639b00226a29757cf0888220"} +{"index": 26457, "batch_hash": "0xb676c27e9d20c0779491532fa46aad9e1f9cdaf073cf69010c5475aec7d7b2a9", "finalize_tx": "0xe8b18d35b5d10a4dff5641e95e81aad0d3265bf87d277d04ddcc0416836d4132"} +{"index": 26458, "batch_hash": "0x265c01ad44aa5ba90dc4d617329c99c20359f03dd6b8be7cf2ae7f1df9ee71b5", "finalize_tx": "0x2aa9da73ef3ea762d8b5e4475167e9a491a4ccb4ae5aeb6218f2d3321842621f"} +{"index": 26459, "batch_hash": "0x0c7229cf7570c0426dd7792ae506ebd32915822e0c83e549ef24b42a7a9f74e9", "finalize_tx": "0x1c6a198b1440c5ec989f73117fa8d99b77f96b15ea499801b9ad40b594c93535"} +{"index": 26460, "batch_hash": "0x0d5f752fb15a9a886097e6774c0b8c5bf9cb8983af3217a7cdea49c61b4d5d05", "finalize_tx": "0x893b3ee17fba2715c7fdd93131b861fe553e1576ef2fbfd07a39d9bc2ffeced0"} +{"index": 26461, "batch_hash": "0xc07b4ca0fce7052451e3fc3a81d06b32b63fc98487a0f7f781c06a5651ff4911", "finalize_tx": "0x9f64176a46e0b7274332f6cf82dac0cc966b33f48e3c08f057927150f0643a0a"} +{"index": 26462, "batch_hash": "0x3d7b89cd126aef2e8daf5f72b14217d6042f619042eaec869f18fcd1fc332adb", "finalize_tx": "0xd328bdae7dcf6c70ff23dab52c7eb1645d97441df6f4499ea36e1bccf16e2421"} +{"index": 27953, "batch_hash": "0x3557c7d9bb251b35f82924130cba9cc2c9ac0e7fd5709c1810098a03ee4975dc", "finalize_tx": "0x0fa03db61ef6e2b230ad4e686bdfac2f809a0ae8d5d70d25bd3974ea9426cba0"} +{"index": 27954, "batch_hash": "0xe00f3ffd42af2664c89bb231367ddd050705d12c53127f15245a08d5ce7954d1", "finalize_tx": "0x2d74571e37ab355a7b9176bcb7dfd8c3e1cf6a7a073b7bd7e0a9dc6d46849a86"} +{"index": 27955, "batch_hash": "0xcff0ed0da9833757f7345f5c84dd68e9698384b2a2de1a7be72ed8f5864d278c", "finalize_tx": "0x17d6a067c8cce8d360bfc4cf4d964c529c53769273b1943c82f9fd41f940e022"} +{"index": 27956, "batch_hash": "0xc1a75d8d7c7e3cbcf00444273768e0275144ab2ac204f3b3a1417c98c024bc89", "finalize_tx": "0xa0a2d7f7908d2d68a2399604ae0d141af1982f34a76a110094990d42714c0c5d"} +{"index": 27957, "batch_hash": "0x2267b948b046e3128c14859d48b94506b857d7952ee3b51c8aed5eeaefaf683a", "finalize_tx": "0x5919f057271556ac0d21b4f17dca89a913a2bbd267dcfe7f1ed671d0be1feecf"} +{"index": 27958, "batch_hash": "0x1466dda1a9f0403ffc1d2dbce97bf756d2056011812a447172d11d5f301619a1", "finalize_tx": "0xc30b9097cb601325542b76a18222c4a14f0eed394240d38cc17a3abccca73d45"} +{"index": 27959, "batch_hash": "0xe12cb793c6afa5e838ac78db8304379212e794bb4025695eb8b3d151dddd6347", "finalize_tx": "0x6608c363b39b80ae5971dea14fea77545036d9ef3d978b6b7995165f817b9c09"} +{"index": 27960, "batch_hash": "0x691a16838a9a1172cc87ed2300cc60233ea7a7ed699892d87235cc375c1e66eb", "finalize_tx": "0x7dac42906252283f378179ced5d20d3e5fd02279ac0225781918ed58b0a04a2d"} +{"index": 27961, "batch_hash": "0x5ccf97d166c8c83df4480b3acc3d9a537f1273441d30bdcc0bbde50199581fd8", "finalize_tx": "0xe206a73761238c36d44472c02ec62af885ef42f86da7e5c5e37030edac128d3b"} +{"index": 27962, "batch_hash": "0xe166767d1f0c816586c681b5dfde9c6f7199d247d70f9acb626b29a6eb8556a3", "finalize_tx": "0x399b158886f272be8b73d3ad79854992a4df1f72a8ebbba0a78fe14f28840b84"} +{"index": 28423, "batch_hash": "0xcc02e7d32a8657731e563747c6185d67ac34dc531afba852fbb6673a55652fca", "finalize_tx": "0x5ab7dd6d81f93273822981129edbd422eab5d7e3380281da9bf253b59439cf2f"} +{"index": 28424, "batch_hash": "0xca33b944f46d562656ffa2c88deee1bd46889dc5f473919d3aa8a5fe110372f8", "finalize_tx": "0xd5448e6c2b72ec9e599a1ce2d416143ca089251742e6ae67979f68d6527d77d0"} +{"index": 28425, "batch_hash": "0x46c97e73d6b3f70987de42210774e05619769de5c2cb9adab76c7f0d4f544e03", "finalize_tx": "0xdffe50d387c1d6e2ab3068843d6d50d6e3a31a3b32cb2286162fb927f8123bc1"} +{"index": 28426, "batch_hash": "0xf5b8b7195439c73f7b4d6803c9ab5ca96b89176f369f686a4edcc21d81e16180", "finalize_tx": "0x5f133ada279eeffefa2e6e5b9be54ed8769ccdad9c6341de09e8261ef0bd6d8f"} +{"index": 28427, "batch_hash": "0x2be5ef4665866d30a36eaf98b893e7175a584fa3c7f4d25753f9e46f536f0ba4", "finalize_tx": "0x7d8e2e2d250a2968ad5330e558633ddc3cf32f2ce2f858f743536ea23d374a24"} +{"index": 28428, "batch_hash": "0x264a1f5f5cb7c0fd83ff3162df2d720a7476f9ae47c7e06d35268a48a0f8523d", "finalize_tx": "0xd962799acca52f6c60439e7d3e228d0e0c745baaefec44b9fd73d0152f82d637"} +{"index": 28429, "batch_hash": "0x2515c5c6a57eb321a39af97eee00fd5fbcb419e811acabe8383c6a3d99da6621", "finalize_tx": "0x62c26f71397080548026e5a97e4022f4662e733e63b1b7bccea06f96cd56a335"} +{"index": 28430, "batch_hash": "0x1f98133b4547562842c540619bde9bab82cf66820532d0f58fc6caffbb963058", "finalize_tx": "0x519c77ca835bd12ec994eb761ce2aeb19e926c9058e5290f57f028bbcd46fece"} +{"index": 28431, "batch_hash": "0x245f8d3f13f88d957ffb01b25c2cf113080c41fd8862b804aad8bce2619005ca", "finalize_tx": "0x29e82591d85cd48b52ca8a903285062b2b2c5cb89611e15ffe51ba14918df711"} +{"index": 28432, "batch_hash": "0xa735602e121fa8f8b0ed2714a3daeabc4d8e32b20d0c9c0a5b7e29269ff1aef6", "finalize_tx": "0xe6dc9bb4f95614d9c3066e251beee59c3e8edf4e42d080be60ec8d5e0b8bcd22"} +{"index": 29613, "batch_hash": "0x6476b5c447017911236a9be26874978cad595ed5208272e833a3d76a68a63cc2", "finalize_tx": "0x00c0602e55cd27c3a05ad4ff48597bd9dcc41fd2046789a618f778abbf085ba7"} +{"index": 29614, "batch_hash": "0xedb04ee3303774d3ba11743a9c34a6c88c500b43a5446c4ee55893cda749b395", "finalize_tx": "0x4bc0f5f3a39cde6edfacc3b5691eef1864a706b49a3dc4a2a7414c3369218b37"} +{"index": 29615, "batch_hash": "0x4993762937314136c05d1072045c9c0e0ecb8fd8267f27fba2937dbb91da441e", "finalize_tx": "0x501b5e9691e730016b07b29fd3fa620b690744e8205a1b607e4a96a12e401bee"} +{"index": 29616, "batch_hash": "0xf4dc62517a7b7557277c9fee1c54c33c367fbbe9d4d1c714bc6a40a50841aa29", "finalize_tx": "0x75f6b9ef57829e2c1ee16706a84ed58edd6d61ffc2e42a30be2b0d88006efc5e"} +{"index": 29617, "batch_hash": "0xf51e11d0d2c6c6276a847a1821826b573a12e2bff44ccabf4db5ece8c0289466", "finalize_tx": "0x13f59eae7ab1729732918f4a5636db0b381e24cad873b3e5cbe60a7baf810d5f"} +{"index": 29618, "batch_hash": "0xfe5610172e2c28c2f22c3457065a6632977646b616ef01035f5a0025fa5fa252", "finalize_tx": "0x543add7f9530f7c2b4d01a974dec93a7260ae37771818846e7dc1d7f7dc8bf32"} +{"index": 29619, "batch_hash": "0x91ce9976e2c5a7c5a57985f75e4f346391d8e7fd97d3abdd4b90be84ff9a9c79", "finalize_tx": "0xd145f101a680e85295c37d90fe369df48f95f527c4416ea6bacc4a7b3bc79523"} +{"index": 29620, "batch_hash": "0x95b30519d1e82e2435da673e8ddf9923cd7722ddddd823048be74f2f060d2639", "finalize_tx": "0x32b18ec6cff7cf5ab69d910db20f5c424fe8305905e98ed59a15f36ab6455224"} +{"index": 29621, "batch_hash": "0x489e7c3b85c289b13e3fd98600428282380ff34c8d6a5a08ea0db414c1970ff1", "finalize_tx": "0xcf9047f2b355764d7ab25d33acc78a30ec936bd85f7a8c4b4a5e471bba46478f"} +{"index": 29622, "batch_hash": "0x959c7f4a3bdb6dfff828c2c78d15d088ed1594923ba7b34df8433929c9b8c0d1", "finalize_tx": "0xe9255738cd794044e7f0857906f750bbb6f7a272bc4e172d966dc05b5fc93c1e"} +{"index": 34303, "batch_hash": "0x27c41cfb92e41c981c7d73aa83336ab8a77003471d35f8ca2d2605346bad61db", "finalize_tx": "0x052fe180db981c5cc9f2e7047cb6e8fdc9229e55041759ade6c2c87f6525f437"} +{"index": 34304, "batch_hash": "0x9b75ae51649c440e72dc9218515cbcc6753d20473bc2a7e8ee047d385c3aa315", "finalize_tx": "0xcf1b58de589da25e9f713e3dbaf80b167dc08ae0274da1117d203c46a3601f45"} +{"index": 34305, "batch_hash": "0xa8959b4668432f20531c39c4db341e1c35607cdf7c40ddd89b2fa363e79b87af", "finalize_tx": "0x54ea84e03c113172f9472930e887f1ff7239464cbe1f12589b62d39fc7004182"} +{"index": 34306, "batch_hash": "0xc0fa3b4fe3db9f372836b025590740db022afb16c18f93970741b3a7c930f8c0", "finalize_tx": "0x843972c41c60f9ed075942a80004790e27ee09ecaab1f40b0ce247f5d3e7400b"} +{"index": 34307, "batch_hash": "0x321ed4a3e5cfab657fc634c9dd5ccae7d2c921a7e34ee55f641bd49d94229d8a", "finalize_tx": "0x2a0c57e0798569fc1589325a21b0ca1f2d2ce4953a1a53a7a5830d7d5134d33d"} +{"index": 34308, "batch_hash": "0x2e2aa436f36703f09b0f579986921aa58c6b3303104c24885663243d5a2fb3e4", "finalize_tx": "0x3bb1cf7fd7ae3b34be306a4f06ce1d34423b82d42325834e4c73117ccb5aea0e"} +{"index": 34309, "batch_hash": "0x9a5f64125933f770e04a9ecfba842e39954e3a783092252d0f66781f03298b6e", "finalize_tx": "0x7293d6212e400bc0ce0468e2c50ffe3cc90a985d5d3d7f12f690ba4a13fb72ef"} +{"index": 34310, "batch_hash": "0x7e40100f725c59a16b96c9fc15abaf2f35789f6d7bdc1ae32e195d04344bf546", "finalize_tx": "0x38cf5cb5511bf9f269e3842dbf3cda3c0f2324db34d509dc18d02a20f052c1b4"} +{"index": 34311, "batch_hash": "0x8cf5ce2539548b42965ba4e11bf6b25e4f17662d316ecdf6fed2fab79ef7becc", "finalize_tx": "0x0d6ced47cadcc36007b7e61cd46cda12aa94d6bd6f7839abadbfef616b85606f"} +{"index": 34312, "batch_hash": "0xbb3d85266d651a93fc86efb976ec8fd6877e21a145ae03d24fe6194780cc4a3b", "finalize_tx": "0xc7319052b60d20d80fc367d3e4b7b63661e98ed8a25f44803504022bfa834522"} +{"index": 41053, "batch_hash": "0x355e475438f8685e4acaa8e36ca4ad4a38cc37de19433c11db9efe895f167c18", "finalize_tx": "0xe36b22d704e36f3326b50a519ea12348fceb3bf59a3f0d7bea538f40df4058d5"} +{"index": 41054, "batch_hash": "0xfb04bf5350495051c6759793116758a460b4ba9db6a59caefe1dcbe2db2adc97", "finalize_tx": "0x1579bec22487947b4e1fb9fb87f96d4eb9d0fac6564d3337868d72af10459011"} +{"index": 41055, "batch_hash": "0x1d359b621895b284af858b87ee4124fd9d8f2ecc3efa05eb9a8788020b6caf61", "finalize_tx": "0x5d2ea6022f77f112f34e5b65e7d9dbcac2cd57b3ab2ee9aacd4928805dcd5eb8"} +{"index": 41056, "batch_hash": "0xa7eb778558185fb6e7bcc0f982230b8b9806d53b2bece8d3bca2429338fe24f5", "finalize_tx": "0x1a4104e271c34ecc6cc8f3fdfc38ac226eea8a6af3f2acbbe32238f5bf3318b9"} +{"index": 41057, "batch_hash": "0x20f05217bceb4799790e8a81c678751280413b2b2d56cfa438d373c5742bd403", "finalize_tx": "0x29b6464fc3ad135b073c88b58101a1b8100f0b6182ee3e94b78a41b77322ff85"} +{"index": 41058, "batch_hash": "0x3a02e08db7aba6317fdff6ab6ebfde7fb539c47a3eddd2bb1bdfb58e499a4cd9", "finalize_tx": "0x4c773dccb6097956816803d2861d14fc092183f03f6614eb7cf7b56c8f22e14d"} +{"index": 41059, "batch_hash": "0xb966c3ecf5b53756a26e0758c4d3d5dbc42893f1e704a18e4afccff455d7349f", "finalize_tx": "0xd006349180eaa4a299994a3c4b37e4207c51d55004d764a07f843c2c14ed6632"} +{"index": 41060, "batch_hash": "0xb242ad562db8be5c121ca260229d70acb93118431e5d908d0d1703b7f911f01c", "finalize_tx": "0x8190bb8cc264e72372fec8a8eafa51e2f06fc728e5a41ce168f8513e2d31bd81"} +{"index": 41061, "batch_hash": "0x7c72bf8358b45b413c0a869e1c0434501c4f65ecce26faa7f7f9ac7d7e2a4e75", "finalize_tx": "0xb6182f64a01b9a60eda5a6c8f78428b8b00e610a907f0de6fdcaf34ecd08c64a"} +{"index": 41062, "batch_hash": "0xb2c1485754e2c822c53fba260a446796d44d5fb87f25fffecf35a00f97d1ce44", "finalize_tx": "0xe86df60b0fbd06bcde45a901c1b9e4f59fe3131e062ef49dd3ebfcc546d9812f"} +{"index": 42473, "batch_hash": "0x71f4e43eecb60f1fb1c6ef49b9152e4ad527de9d670c62ba248264b5b24f1d87", "finalize_tx": "0xc1f30bb1c2a30939243acba5fdfdf7574618e81d9d5bc9eb609cd3ee8256e4ef"} +{"index": 42474, "batch_hash": "0x11161af35a69677d040bbeaf4008fc5d84ca291c81e978dd212bcccd362b98fb", "finalize_tx": "0x98a5a3661ad4b214a9a44e9227397105ddc9b7c7df3098ec5a56d3937b768d65"} +{"index": 42475, "batch_hash": "0x907e432a9e3966098b0fe9fa12f1579afdf56e015cba7d3daeaa9801fa7d995c", "finalize_tx": "0x2bd4a0d81c8f43ab4ccd540260d2a2b0a26e65ccef5809ccc2d6a70698d2a7d4"} +{"index": 42476, "batch_hash": "0x9f6ff9c852a3dc4241e66298e049c37fd316c7000315e890c00e95e9d93ef2e5", "finalize_tx": "0x9bf0e9169a7b8646aa7270df27b04e3149447c7735540abff5bd250c810d9645"} +{"index": 42477, "batch_hash": "0x5f6956f8321c2f1673fbc8f99d42aa7dc26fcc47b6c3e16ac603be45eecd0068", "finalize_tx": "0x691959797f7431d9020a6dedb4b2cdf419fc0d2a9221d3fbed5b9faef1063d3e"} +{"index": 42478, "batch_hash": "0x660fe155ca33b85b007eec84863613198ac111ecc29400eee9c4c7294c256b13", "finalize_tx": "0xff77c591f08520eeafd861b80f071d35e10ca8461750c69e01608e66017a6176"} +{"index": 42479, "batch_hash": "0x3bcf676658f4f4dfe94113cb27553241168f69419427f2124ed06342cf4a5963", "finalize_tx": "0x4f8cc525fa162570be9a04ded6aceb2b3a800a8d46137bb9c01f8143388f477e"} +{"index": 42480, "batch_hash": "0xe2bf99ae1603b1744b9c328305b187af5d9d5964be2f034542023378f6b7da6f", "finalize_tx": "0x51369913653438fa42fef19cf8c2d32770b0caefe6f5bfdf33c95370ce42b057"} +{"index": 42481, "batch_hash": "0x884f64c528facd9bf4e21193e24367e9cb88a5049db800f738662c5912196562", "finalize_tx": "0x03ffd8b5bf9a41025a014957f6138090fc5e149ae7d14fdca13d0483af6188de"} +{"index": 42482, "batch_hash": "0x06a002c491692677b43d4bc1dd116aba992e0334267d8290884e29b5a9618184", "finalize_tx": "0x4a70b355ccad934acc08518cdd584b9a12c2542ba6a65b08f3f9b8f001ca4728"} +{"index": 46993, "batch_hash": "0x98d915f2553ca32cda83c7957c98d0d607a3eed44bf7d740d65d6b98d1ce393d", "finalize_tx": "0x577aabfc7517079c47bb0009b9590d2a4ff145263ad0aabe41f29694bee6b722"} +{"index": 46994, "batch_hash": "0xbcd1ae02c7d275f86c0dbd37d6510aa49508b7da3843f787b218d07daef275d0", "finalize_tx": "0xd388b6858fa23487602ba81ae0b13b618f099ebe95c41f9747332493a5820c7d"} +{"index": 46995, "batch_hash": "0x90ef5944847f924bbb31f49d3aa62f4c0082b3efa5708a13c3655a2681fa10e0", "finalize_tx": "0x2a3d78c32ff03f5e5a985a16ff48f1284c3345d05fed6f9455a23628abaf65c2"} +{"index": 46996, "batch_hash": "0xd966b3fa5eb6c82f00a39d508f5fbffeca666358e7866aa6b8339b5db8d8e173", "finalize_tx": "0x9b5aa3be91314a0a773c015a74f06673bcc2a44708483f20e1670f8223b1946a"} +{"index": 46997, "batch_hash": "0xdf54d8778e755ac12326bc6fce6f80adf3140e7f0a574c6f299f0e1301ab249d", "finalize_tx": "0xe52be4e95aeeb6f73bdf41cf5475f680c9540a45605ebadce104e97793d126ea"} +{"index": 46998, "batch_hash": "0x023ac50deb4873483d305fe2876c3f88c55e78a3d597de924474117de4d494a0", "finalize_tx": "0xe2548dc16bf687c91f5319550451771b5ed12405a5d9ee630e35879c7e0e4533"} +{"index": 46999, "batch_hash": "0xba404f0b389f88581765d85d14e2cf8a259191f5ba0e2e062dd61c401b9bee53", "finalize_tx": "0x1659a03d9e1ab26ec6fccd7030531c5c0519a567b70ef516bedb04c82ae7d802"} +{"index": 47001, "batch_hash": "0xadd287470885fd82155c07cc5aefd0055942a0ea5ac51f0cdc3d5d18ccdfcbec", "finalize_tx": "0x1593f66fb665106af954cc2a0951b49df6b77c95dd58d58fa73ffa1f079971c0"} +{"index": 47002, "batch_hash": "0x2134f4e219baf184e58972f83abb9b5a1eeb43ab12a9ce93b8ed66913691f15e", "finalize_tx": "0xef81f6abf9308c8422594faaed70730719a4e3a1d4d2a13fce9cde90f8bf12fc"} +{"index": 48173, "batch_hash": "0xc93071ed5cc4be2997b5fc5359298de57d1891f541cce3e3e22f2804445b5224", "finalize_tx": "0x7e98676372cf8a182b932748f30ea8d27ac90f960655e59413f5873e24e2d291"} +{"index": 48174, "batch_hash": "0x3e023e32aafb1068ce4256077033d931e714a2460ad72c8fb29083e98f32de18", "finalize_tx": "0x2f6c42462635889800afeaef4ac6ea33d289cb3fa1179c827389b1f64ca251c2"} +{"index": 48175, "batch_hash": "0x73002eb34ff2b164a83e63047fd9fb4095ec6d5f3fccbb2f3c40998d5b10ee20", "finalize_tx": "0xe834d406d5c059740966b5901d7dd06a22d27eccb27653ddec45348ab9e10fb2"} +{"index": 48176, "batch_hash": "0xb31980b8784eba79cae3566c08cb826cc00c5e14a4cea8eb185fa2b2c77d2cde", "finalize_tx": "0x9752665b0b7827dff6d1f0ef4f3368a4621ff06e7e416341e02b4718f958495c"} +{"index": 48177, "batch_hash": "0xb2c4322d1f5d157c9f10f86d948d349933bede66ec1ec05b4be42d29755efdcf", "finalize_tx": "0xbedb07d54f339535daa6568648c1696af555094251881115dc99a49c3ff49874"} +{"index": 48178, "batch_hash": "0x588d6d9cc14bb4c274d46dfd637fb6c3212f1b270bbaa1693ca7c4ce41b3052e", "finalize_tx": "0x8bf3cb8f5e708f7f0202c137f4266cd0bb39cae23618f0e28ccfbd6e66f81733"} +{"index": 48179, "batch_hash": "0x72df79a6b8caa82687d98f0ec4dac09b2862d084167bac5a235226eacee45d48", "finalize_tx": "0xefc7f5948ec17e2e11b75c3205879e233e6029a72970d0038461dbffff84975d"} +{"index": 48180, "batch_hash": "0xc19a57c9c9c55c7f1210327da8c2a0229b4bef1da906a64b751e6323e9c1d362", "finalize_tx": "0x2416b0cf973f06d4b0aee658fc5d223e1dcb72edfc438a9705ac91940a8955df"} +{"index": 48181, "batch_hash": "0xdf8b3fe3a3f17e28acdfca1b639b3d941961fd906bf0381d35554d77fb11df08", "finalize_tx": "0xfe70fd499b8f3522ef15f2d3cb0dfda8f50f83becc91137d2d4bd4be56a93114"} +{"index": 48182, "batch_hash": "0xc7663bc156b53cbb663873ca7bde0a69f6a81d47fa2bb5104cc039f644a4c2c1", "finalize_tx": "0xbeeb3a13f88c95a4afaf7a8988b12c7310bb3b4a77ba34f657a2df9bf4501fd4"} +{"index": 49003, "batch_hash": "0xef973f193a375003c3788383ef58e99f91cc72bf2f81c9bda283704cb323b22c", "finalize_tx": "0xe154518bfd842e9463d599b7113144b63b96b30163642e1ca66d6434e9734609"} +{"index": 49004, "batch_hash": "0x9a184bf46134dc4c06d9602d2b88c4decb2cbae1cd76974b1fe87e744ef4804b", "finalize_tx": "0xb204b239d347cc59b90727d3059c8f555dc4d1e484f3eb088e6cbe1f367fa88a"} +{"index": 49005, "batch_hash": "0x735b3c5ba98acc84fe206f555b944f6c76c63ac661a2014b509aa3c14b24315b", "finalize_tx": "0x27a6563ac2db0e89dd5df290db805ed15b1059c7430a05cd20eba8da4b0c0e6c"} +{"index": 49006, "batch_hash": "0x48dadf4907631c7e01e961841c306321fbd91eb687be88ca3eae4b2ca89a24f9", "finalize_tx": "0x983c07779f50225b43a2c9a1c5f718b0eb33a91737c3526ca3bd897f0987f667"} +{"index": 49007, "batch_hash": "0x49c84400e06c5eff02d7326c88142d752c088fb8bb4f79cdd18845b34f7b96f2", "finalize_tx": "0x9c0b7f71b375470029712b792d484869ac059bae1d9f65ae24a4eb7c3d2a366c"} +{"index": 49008, "batch_hash": "0xe2ef5c473eaf9d8946020f4f5e518957a8ce0d6979fe99afb7e46be6d588ba55", "finalize_tx": "0x3146ce5747b703f2fbaa96053dc6c9309582f4d21261dad17abefea92fbe0d55"} +{"index": 49009, "batch_hash": "0x0e43de61bb263361131387a25157b256d8105d1db18e0e07271f6a97652f9240", "finalize_tx": "0xbd9320bc51430c075203af99a51eaf72f37d63ddcbe82623373921be88f9cc6b"} +{"index": 49010, "batch_hash": "0x2e6b5dc7a79fd667777aba32fea232da62c3d856f36bdee526fde47f54f53f10", "finalize_tx": "0xb3971fc12618cd4998e42460a69c9d576834b7b5c7517efa0c33eda5c2e97b92"} +{"index": 49011, "batch_hash": "0x9e40417b2cab51e96f951a1417626c84d00cd22d054bc35b3c711e5b720841c1", "finalize_tx": "0x5bbfce608f1e20ae900c9797508854b64f8871237be940ca1871e989da0388bb"} +{"index": 49012, "batch_hash": "0xdcbb80ecbba36c9e908e805a6a42be19a7bbefa12faad2c54d26dd49473b1914", "finalize_tx": "0x0933725856f6ea7a576eb462299a5dd2645b021d9d2efcad464378d3891ae83d"} +{"index": 52123, "batch_hash": "0x629ea351a8a8e928112f134997914d5487cc2f7e19bdb9d5a0d92bacef9f8a34", "finalize_tx": "0x8c17583201c627dff22473a74c257399a0c9ad4a79b02d88e52cd0bb48da5578"} +{"index": 52124, "batch_hash": "0x3dd8c7ffbd55bdcdfe2bacde951bc85d7d572360f2e7ff86187ea6c3f5d4100c", "finalize_tx": "0xb14a81483541f3451e91be021a6a1a34484396ce10422d2e7bbefa33b3493650"} +{"index": 52125, "batch_hash": "0xe65684f4112a8b82ebb5d3574b3b8033e1f56f3e0e67009c9308532c45d81d0b", "finalize_tx": "0x4302d15fdddc433cbc61df94c0bc6342c57684f3f57e9d6c34defb9c60a14bd3"} +{"index": 52126, "batch_hash": "0x4ec2bea98badb513cd1b066d74a04dd39f689222befe543d2876f6597a168c3c", "finalize_tx": "0x70d89ec0aac3d1dffcaba3ba053d53fa2caa4196592f9834fe14c85c745a0bf2"} +{"index": 52127, "batch_hash": "0xe0af84b2f57d2de9936f57650e0f2d513c92e8584b8c6694f3e3beac4ab7d59d", "finalize_tx": "0x4a5ad7dbae7489a2e7ec4a06e1d94ed6af3bc3d0538cd01f6d1841c8e69e243d"} +{"index": 52128, "batch_hash": "0x8330e962c0c4bb074c30cc64ac53d4621b5136a5d24e913bc221e0853e997ca8", "finalize_tx": "0x279d7d6099b0528d8f692c0ed3157b54dffe5cf11d892f1a7867e52b1a57590e"} +{"index": 52129, "batch_hash": "0xc23fa2752edb5ef46072e735b6b90a2e1e7542d90b95cc5521428ca2427522bc", "finalize_tx": "0xcc51ffb449db150af9f669ade55d9fcdc2c4d0ad3e8ec294db1256cb69970845"} +{"index": 52130, "batch_hash": "0xe56e25c42e8d6553bbe5d085a4058937961234b7a7517cf3c585897ffc1b4983", "finalize_tx": "0xb1c31f39a6b0a9460c5cd57ef0bda390632fa47f6e03545ce3ba84cd7c30ae3d"} +{"index": 52131, "batch_hash": "0x0b4ec9d1a44bb3ff58918e92a754966430026aa71fc4f42578a91e670e00d714", "finalize_tx": "0x45d22b0d09b769d620808f8d2b9991656757d02ea72a53900d3cc10c30211eed"} +{"index": 52132, "batch_hash": "0x86c4f3f9e4ce99e92934b498ec4dc5f000649809475add248f43c32addf1e02b", "finalize_tx": "0xd0c6e78d182985693273a71b8c12c0f05ea390498888ca2355b096fdd5f95d6c"} +{"index": 54283, "batch_hash": "0x7142443e4bfeebe44766c1c292f049011e5edc0c62f6e156ea5bf92d87025ead", "finalize_tx": "0x937300135c127c42c782ddef1a642099882e6bbcf5c0ba333f886ceb158f05fa"} +{"index": 54284, "batch_hash": "0xcc93bced2866704aa16bee7df70f2d8641073617a0a3a7ec888218c0176b02e5", "finalize_tx": "0x31a1b4ff06f56b3e442d67400205c765c949d8a26e853eaea9007d32eb9c8eab"} +{"index": 54285, "batch_hash": "0x29a68c12045ba6f02359513d5a7a39cc3f1a0221d0abbd68303c18b6b409756f", "finalize_tx": "0x2d19ed96f3ad257d4b6f98179dabe89c46ff15a20d2fa4e0ea55a1ef8e315749"} +{"index": 54286, "batch_hash": "0xee01de6618b7915ddfc3fb733e9a43ae0ecb1dfe43b36ec2515a26938841b997", "finalize_tx": "0xdc1fe140526f1f80480aacacfc8d13d38f23a0a7f81586efad84c477ad68b60b"} +{"index": 54287, "batch_hash": "0xe2ef2fbc1a487698203fd5cc35e7db9f87695a2e96a5e7f1510f549affab9a95", "finalize_tx": "0x9b58007161a059fe8b1b38869177f11d0d30b43b69a4f7e233ca50e245a85a95"} +{"index": 54288, "batch_hash": "0xc1c6985cd02797217be6d3e8ce4e5f448cb4fa352184a8ef22ec379ef484d1b6", "finalize_tx": "0x5ba35e6e44c3441e6b2e9f2650ae81ffa801fca34b3661a233cda075faa7cae3"} +{"index": 54289, "batch_hash": "0x2a89fc389a1c326e80b6ed77849c338c90376bff83e19eb64b7d72580bd1bca8", "finalize_tx": "0xfe8ed8d8dab769c20b0db075cb9f67d99bffb4e8772aff4dee9d250485a3664c"} +{"index": 54290, "batch_hash": "0x376dd60abb3d75af5ce405d2ccd57f8fcff810f80f329f8f08578386381bf296", "finalize_tx": "0x615802fb695a4a851b393e33ad994ef8a68b0b4a72e0755123ea98c292e13bb8"} +{"index": 54291, "batch_hash": "0xddca464d58cab421a4171e9608466acdbc3fb44bcdccc8c19fb191d53f9c3bcf", "finalize_tx": "0xe20fc6c8f85b749c9b879e8fdb8e168cfbfe5edb82ce32bb14da0a14c672797d"} +{"index": 54292, "batch_hash": "0xa79ef83f32633cc54d4b333d55526bb0cce1af6116938ee39df33e508be94e9a", "finalize_tx": "0x179a29553eae60774dab887d15e572049aeec581add7baf9e7334382db0006eb"} +{"index": 57213, "batch_hash": "0x67beb9b6812289e4a398f17a05eed6e51402f4ccbcd5a3b1cf996c6db9515a10", "finalize_tx": "0xac7cac3f28d4b518925d4d1be715f50c9b8ddbccf1b5c7a53df8209d7b361d2c"} +{"index": 57214, "batch_hash": "0xaff66f68b7e753e32aab4cad1d738e5f99ec19da3ec938141f190128b81b542f", "finalize_tx": "0x8892210f299f806053024dd9f1c2283f347c61cb47345640f34d23da22f36f9f"} +{"index": 57215, "batch_hash": "0x9fb4aa35571f2bc02bffe6b8793aa917c23fc51dc028e5e389677000d7d38dba", "finalize_tx": "0xbccc2b10baf97c1848e63bffd045f4070bc053563e68ee6c18314aad3c871681"} +{"index": 57216, "batch_hash": "0x09812a44efe3203546af93728ee38bea0f83b685699b946f5858796daa058786", "finalize_tx": "0x015eefc57d9a9dbb10b1fdf6e209af4c903925b1ba260038240e370101a58f2e"} +{"index": 57217, "batch_hash": "0x63c2b1337d9ef2313fd4ebfbf662f308f3a32242fe4ffe118e3f40c23be0cbff", "finalize_tx": "0x87362301198417af7e9e58aa69b0e252087bc9d1fddea0f8852b6ede000f89e9"} +{"index": 57218, "batch_hash": "0x5a88299aa88d73130b6ddfb994a271990b7c1d9b5c8ebe80ab542f4ce53f1012", "finalize_tx": "0x9a0426b08d648f3bafd93180718c00f3c8545cac0fd12136fab5ebf5ab71855c"} +{"index": 57219, "batch_hash": "0xfd5f6bccd9507542454b4f3b32adc14d70edd9b2158637aaabe16439e8f3f8e6", "finalize_tx": "0x5a4fd2c529770d7087abe4571c0ea2a33ead7f859605b57e832d298fcebb4510"} +{"index": 57220, "batch_hash": "0x3c1883c156d2e1b0b913ce62206bcf8a4dd377b7f3853feb69f0bcea4e37e345", "finalize_tx": "0x94cc25930bb73111b774518b69de8bea8d5ea500499d41e012526f468e346336"} +{"index": 57221, "batch_hash": "0x03b2259cc100087de5d029df4305c0129b17f4a16fef535b6e4d7af53360bb59", "finalize_tx": "0xaa6d53ecd1083ed301d8314ad49fc0d8b595883ef95a7847f255dcd8e8126cb7"} +{"index": 57222, "batch_hash": "0x09754b608738e9f375f960a9fddd366c879bcbaf230346ec3e5c00b78cd88098", "finalize_tx": "0x23723f544f22de4427d4ef44ff3e100a137b969a5f731e239104cc70d4b463f1"} +{"index": 58283, "batch_hash": "0x41e9283c3153422d6a56716d364dc17f3a052d3e742434a59871b43df18ea485", "finalize_tx": "0x11d91057370885c93ecee640cff7dbb8f7c200e3baab55ef0da7362f3f83abf0"} +{"index": 58284, "batch_hash": "0x0220a3a5c2b7df95e95e3e2fb3b6e9eb79d20b60807908c30772296304c270b7", "finalize_tx": "0xc50779d203c55bc5d4f5b6c8f5b1223ff04ca684bd6b047f714286c0e836b569"} +{"index": 58285, "batch_hash": "0x99850c14ca5e0e5b63a5967cfa08da4ece712d10936da1b3235c5a2908f967f0", "finalize_tx": "0xa2b21b90aa88d25e0578f02edabed00280ed971bb02e05b6875365116b8d9ebf"} +{"index": 58286, "batch_hash": "0x87ec77267f2139293aca5a88986bf88a7bb9f4668e29b266ed01727f2f351685", "finalize_tx": "0xbb4b45a2da74426687c1d77b541a509ede305b709c2ac59f0be9105bad76d7e0"} +{"index": 58287, "batch_hash": "0xe11fb693777bd3b6ddf95375161c3c84439ac232c1dee26cf53302ee63e44786", "finalize_tx": "0xf2bbc1cd310872a0812968ad0f184ee338af09344bb415a674d9974208445805"} +{"index": 58288, "batch_hash": "0x76ab1fabb4384c2eca03ba5b94be72430d0f04b8a2cfac2c6f29ef682dce1b39", "finalize_tx": "0xd9edeaabf3cca3bfd6b2660374b510b4b0045a1c40d8c064a18d873c86a1298c"} +{"index": 58289, "batch_hash": "0x015d56f49144f0e800b5279e24f79b8c06eb526a378f8bc2903ffa01298ee1ac", "finalize_tx": "0x44b2549a9c87b41b518e6a2db6d5afdbf7400e93ad64929b78344133438277a4"} +{"index": 58290, "batch_hash": "0x0103f92b5cfc1d8e91907ed9ce9aecbcc5151bd6584d3c24d62fe10f5ecaf791", "finalize_tx": "0xd98f40ee4ad8fec392965ece2a1a2bc43defdee35726ec68b321ae240448cdb0"} +{"index": 58291, "batch_hash": "0x71bdc8bfb34bdf660846b6f3a90f5f560d8176a718b980a5482b1f00c243e3ef", "finalize_tx": "0xb1d4813e7aeb8a125c5ddf3845ff1a0dfdf63d0e01739c48e003253a4316d4ab"} +{"index": 58292, "batch_hash": "0xdbfc916f86d86b0b4f94866c4a09788bbfe034cda7631489711f665fe74815d6", "finalize_tx": "0xa99a150099b266daec6e08461f17d8adb908a6e45bff1e4cb1fd1e5a83ca0268"} +{"index": 62473, "batch_hash": "0xa6695885704cf1ce2225a96ee0ca938d8f3e5d49c1adf175a4b5c76f1a597169", "finalize_tx": "0xb43af1d56dbbd27c52917579e68b3a040dad7507a4402ccb2e6788540d8f2a01"} +{"index": 62474, "batch_hash": "0xe704236ed53a4c4762e3040d6481e07dac6f3d4e29c9bb5a41dc8533598a8b5a", "finalize_tx": "0x7bf13b6b048bf03939eee84d157a6ec421e0502d43f5de4ed0bba678cc5acd1e"} +{"index": 62475, "batch_hash": "0x60d2db9088b2eaec18a710faa356c41f1be7487f51d15c57cfb6c938730a9599", "finalize_tx": "0x030abf80ab4fb20fcf48872e4b36107b7ad0d033a4ecf1c79c81c12a7515ac08"} +{"index": 62476, "batch_hash": "0xe9588443303e0297e12f4531f08b5bb18a826b88c66ede6ff4c4dde81b52d4a9", "finalize_tx": "0x41650e277591fdad23bc33fb94cc39910ced7b892bc0dc8334d46cebf82c9c73"} +{"index": 62477, "batch_hash": "0x162566d01514d9456153383d024041a34e67c438f8de03b494a9c31c3c4b3315", "finalize_tx": "0x0995f933cc26c8889fedef1b03ee65e5120111e51bacd101e4a3d7bd6c4dbede"} +{"index": 62478, "batch_hash": "0x962256ffc99a53e8683eb8e4c15783877dce162c74fc8774b8d7196cf4f14b95", "finalize_tx": "0x903d19c8eda69efcab7d3370fbfd3daa2b38c84db194278c96aac35bc5f9783c"} +{"index": 62479, "batch_hash": "0x3282cdc8fcdb412248470d3bc855f144d30d0e81df7177ad9cede81e4fabe372", "finalize_tx": "0x20797fc4431c73dd1cc8575237742e793ebd136c24a8122ec294e6b1e759e6e5"} +{"index": 62480, "batch_hash": "0x93610055d15323588771c29edda359089c7821456638985409d7cafff3e72fc9", "finalize_tx": "0xcaf0eab1dba22ab9c9a253a54afa54276855832f719c62946a15db7946c6668c"} +{"index": 62481, "batch_hash": "0x85b45e085cb4b5cb6d41f4568919168404b0fbb0aa78b37789912a8a980d3432", "finalize_tx": "0x0943fd80a5f85698cc62fb57607738e8652f701b4a5fce39b969c9d2f795704f"} +{"index": 62482, "batch_hash": "0x1b5b826d5aeb9960790a2dfa4901ce26e620d4f602146de3a4fd7d8d4ca6a12e", "finalize_tx": "0x86d94208b1d668a8cba42fe89e95c6fdbd031471ae676741dffdeab673773e51"} +{"index": 64703, "batch_hash": "0xc7286b250a6684687cabd47d183531d6f88411512d115ecb17e090104ba444ad", "finalize_tx": "0xce159db0c71373641d47c93263c75d56a4ff37767260d4d0090c852e5f05500c"} +{"index": 64704, "batch_hash": "0xbaebb4a77a1d7539a2a40f06dd93d419fb9fc20aca30af170b5fb32a6870342f", "finalize_tx": "0xa54002370701c1a4ff0836f34e5abb31480c867ecdbd74399798136d4bcb82ac"} +{"index": 64705, "batch_hash": "0x504849a219079bde4d3d9219fed7a23f05405b1032086149c054efd24eacf5dc", "finalize_tx": "0x470098fc372ca1ca2bfd060d450d713f492d28fc16de6290581d33b1dc187d4c"} +{"index": 64706, "batch_hash": "0xbaf9d4a36e4779377b94272b82d67564cb4537fd2e54a0e3852b26a0d48875f6", "finalize_tx": "0xa549d5f3eea4ca5050e8538e6a5e290f417c9f2bd8ca81297134875b0aefba97"} +{"index": 64707, "batch_hash": "0xbde4a810c46186cd793fa7fe3e8814b23b8affaea71b8fd21c0c44a700ffe649", "finalize_tx": "0x488c446f00d096e978803f3db751f150d13e4c0bde2ddca8752be638a0e13f48"} +{"index": 64708, "batch_hash": "0x6b92777aad8523ec8dd5b87043ee1d475d8ff5942d04976d65429a792001aa5a", "finalize_tx": "0x60a3e3434a1346e498ce79833c805c92d3d2a6b361f0e0ea9487f6b3159cbc8c"} +{"index": 64709, "batch_hash": "0xf953efc21d4da1f41a795dcd5c0577a7af54338876a71690445eb1b044980215", "finalize_tx": "0x578ac6e2483dc1c905b93bba9ce6711affacfb118c43158371256f34317e74a3"} +{"index": 64710, "batch_hash": "0xa0c48f931c3b95c49642e83b7bb076494ae286180cb1822888bc14de882e781e", "finalize_tx": "0xb5bf9c554b17f0f6ee724e129b4740fa07cb045bc950dfb736b887a5ac53ccd5"} +{"index": 64711, "batch_hash": "0x96bc36044f4fd41f62ee144b9ffa19b39870ed7741a90574658dd90afcc50636", "finalize_tx": "0x670079873e4410a4f2512e72a564daf9f80526c483ddba23794f1a193e90fe4b"} +{"index": 64712, "batch_hash": "0x0e3975ad1725cf413bd7abe73e7d8269ddb8676df91812ca57522c619d16600f", "finalize_tx": "0x5d0b9f4faaa7485f087e139ea5a27a47a3012aa482b47ce6355c54d740ab3266"} +{"index": 68993, "batch_hash": "0xd0b6aed754a2dc0b9615dc97b698e7ae646c21834a408d792db480a575593601", "finalize_tx": "0xd5ec01c9f9a1369910c5d27cfd3a5dd76936fe68508ef69c200306ed9c402eb4"} +{"index": 68994, "batch_hash": "0x6a6fe1f9e3f5a6e74c2a0fdce37fc09649ed515ce0cf5bc98d1c3233a9cf8413", "finalize_tx": "0x5f89124d9dede3b0ea0407e4043e569be451d74b3209dcee518fd839133841f1"} +{"index": 68995, "batch_hash": "0xfad10f17db34285ae17a0991faf304e95506e520a06f1b450da0fef02e389378", "finalize_tx": "0x0943afd1a0b57e01e43b4ad67eb18299a4443cba75d6d41f1efd7b87dc4ec081"} +{"index": 68996, "batch_hash": "0x1efce44bc37251d7a56f923d25100063c2c3199669b4743763e610fc3ac51eb3", "finalize_tx": "0x9d99556a44f61d5cdd88093fb483ac07d0b639ee055e9243f33154f6e5c83dd4"} +{"index": 68997, "batch_hash": "0x3a4de1317dbab22d03d7e81fea555ad8ab70cd36fcc45ae7fd72cc22cb89e4de", "finalize_tx": "0x0e85571248e83bea83e3a749b5312cf0b19dcd5cbdc4b5e3c20d950f11bd130e"} +{"index": 68998, "batch_hash": "0xf631379d79fef7623be41a47feb5ddc62960beda283233f5850bee3952226412", "finalize_tx": "0x69a87e381d12fa0b7387ffaef8a65a51fdf61a9ffa79ecc42fa2e901abe88329"} +{"index": 68999, "batch_hash": "0x407b6be0f799e422a26c14471638faf8b381b4ced6aed466398a359da4b6db5a", "finalize_tx": "0x501f64e226184e23df82ff4a8398fa540f6c18a6339bd9909edbb3e767a9f360"} +{"index": 69000, "batch_hash": "0x30c4dc9c157faa12f8e0a7adf2ab9001439df3c3d058cda242fdd8f4e19bb931", "finalize_tx": "0xc6dbd36963e853cf62d0856fdbc0522fb5e4d8af52c83605fe3d940956c5bc3c"} +{"index": 69001, "batch_hash": "0xe0283d1f31ed36f82a2d4db25fa9c288df54e5d12b6509861063a19ff304c5a4", "finalize_tx": "0x91b6baab0162378aaac8a4a0b52a0da4a3c5e2970af9cd14e4570a06b08e5aa1"} +{"index": 69002, "batch_hash": "0xa72f9f60d14543bf72a314a58a1060339ca7d5ab36b163ad0d9330d96bd286a1", "finalize_tx": "0x60c5bdee63570df9ed1991135da0b1284838945b0edaf45842f5b4ec33b91e9f"} +{"index": 70123, "batch_hash": "0x6285b78d5aea488e4be7199df01a108ed1f132751cef0bfd5a9711dafb92fffa", "finalize_tx": "0xf774851298bc90761c038858360a33f12f16e91ec69e33b17477d0ed85f6e4f6"} +{"index": 70124, "batch_hash": "0xf305586037a1b2f92fe862c155965166b406780e9b21c5b4e41aae888310b7c0", "finalize_tx": "0xb3ec00a96b3df2ea157fa785f3aaafbe0df3f9409309919495730e71aa265c77"} +{"index": 70125, "batch_hash": "0x849721d6ab044323bf0f3cf5958a3ebd736bf26823ad8ff4a0382457931dbd9c", "finalize_tx": "0x338aaac03f3294f0a70910df31549ab022faefbb3a7ea26f9547478644a3b38b"} +{"index": 70126, "batch_hash": "0xfbcbe5842907a9c734e952d24c87123f6a72bb3b00f3a4ac3677a32d337f366c", "finalize_tx": "0x4962c7ff0b0d9130729cd56c865ddd236fd7eab1702b6f3befbaeb52d25c35f8"} +{"index": 70127, "batch_hash": "0xe4e59033bf6482ec5ec2327e007fa95d13bae97dd2ef96c5e98dc1f83ede872d", "finalize_tx": "0x1330685a3c466a97dbcdc7af526151dda3632f7d0b854cdc160641203afe65dc"} +{"index": 70128, "batch_hash": "0xfbbf7667b7521bd8549321b6eaf8a6bda8e07adf69a059a99443afd788fdf699", "finalize_tx": "0x03998c24a3a37ed697862fe1da46bd84eb0dd44b0767d933e4569dc2b1b7dcb1"} +{"index": 70129, "batch_hash": "0xa0337541ad1c28a43ad714c80e5827a565aa9745ec712df532cd33a4e068b30c", "finalize_tx": "0x2e99fcf086e894b0be0e4c85ae8241759c553f61dc3e9d7956e01f812af35e25"} +{"index": 70130, "batch_hash": "0xbeb9247ac63298e23ee72de8636cbceed720120e7d16fa111a11ffe2a8e26c33", "finalize_tx": "0xf019a14bdef43e5a2aff0c5b5e0de0376ccc8bab29c0898fecda7e106f037913"} +{"index": 70131, "batch_hash": "0x14eb93b6c28bacde2da2548039706a03bb3df8e4891f3f03ad3977926b429e0a", "finalize_tx": "0x92d4fb9da71c6da8358b5b5ef011f2f831e4ee40ebdda3d6c2c03d7211db3621"} +{"index": 70132, "batch_hash": "0xdc94a8ca7f1a01aafb5257b156c90b46a1b3e64f81ad878d2b24e1c11ccf5802", "finalize_tx": "0x4005c3be33bf0aee6737dd5bb7f8fc1eb49227df94bd1f8c5ab36d6ef8568aff"} +{"index": 76343, "batch_hash": "0x13204129b548ffbfdad0c0c1018e831d6c4619a7a10febd7f0c276149101d4df", "finalize_tx": "0xec7e6764c977ba3afb5c6fbf28d06b07a23bfcfa86bfc4d5da48942209ea9fca"} +{"index": 76344, "batch_hash": "0xb03ab3de4ea692c9978abaf3826096c6541a216b177ac40b6eae9d01f8d07b1a", "finalize_tx": "0x473b49b5ddbbe99c4080192b14471ad8e280ece8e3531aab70c3f4ab24282f95"} +{"index": 76345, "batch_hash": "0x47f30c56c51406102683ebbb0bcff6e6517eb4de8906dde57f8662a9745e5996", "finalize_tx": "0x9d862fe2b3f7726d3229a2b946df316bf0613c4a8aeaf470e8539b7ff85d5833"} +{"index": 76346, "batch_hash": "0x5c92f53e79ec66fdbb552c571bf6c106e14fa446d4aad37214a860c3b29fe326", "finalize_tx": "0x9c8dc7a33d6043b47e89dbb85bb33d679273cf0c8282c055e456e1902fc37937"} +{"index": 76347, "batch_hash": "0x5b312c8c4c03d844d8c2c143eb8998ba86a4301f0f5475a8b3ea18f4c57639af", "finalize_tx": "0x09af293c3ae1073088d3dadb2148418ca52b48ddf0e1e38f65eaa107d63d1088"} +{"index": 76348, "batch_hash": "0xc2111e90d18d7b6a1ddf5fa3a3740a493385551d436c2ee4b3e2d11b9434e887", "finalize_tx": "0x4c3b63ecad7f5a12c0c6cee2949d314c004454bec33bdec8bbf96eee6df17332"} +{"index": 76349, "batch_hash": "0x89c7e1af0cd202abeb4da2a6e81d937a0e10aa81f8f6ff0ff4455ed09a20a577", "finalize_tx": "0xa53c09b1dc3412df0c0a8f7ff07a0f1b964e70f4aa58f20cf346fa6b7d877bc4"} +{"index": 76350, "batch_hash": "0x1db88704585d1c0f0f9b448f3c55c0a340eb076294f5122d9f578120dab168a5", "finalize_tx": "0x17a6babeb5852610b9e158b339c555e4de4deeccc8733eb4e7ad93ec437a2ad6"} +{"index": 76351, "batch_hash": "0xfa391620edaf6185abb29946edd171118b8de5c497c10b9206dc3b26bbf488df", "finalize_tx": "0x8f0a05f314afceafc5e2f071199f5e9f78260ac04c8346491e9f019e5196508e"} +{"index": 76352, "batch_hash": "0xfd41de7885faaa3fbd93099c76f88eefe1347efe5050c3bf6d67a43f81ffcc6c", "finalize_tx": "0xf5ddd99e503d4a31210bd0e2a557a38185def3072d6d345f4dae2835196897fb"} +{"index": 78293, "batch_hash": "0xafe9e32914396d697d7bbda482a626c61f0cce96ab42ec5cd32976cdb9fb7e7e", "finalize_tx": "0x835639e5d62b20e948a2ec5f9ec01aa2441b52506c780be5b465447b40541b0d"} +{"index": 78294, "batch_hash": "0x6835511f2344529a17a4d97f8a5aaac3159448edbb16ffc22e670c16b2566145", "finalize_tx": "0x8b7eda7d92606f65762260641a4556d5e6f530b2d6d3ee41eebf41e42424fdba"} +{"index": 78295, "batch_hash": "0xb190096c7e0e76a1bf112089ada14c28227b24460d3ae99052807997196a1ccb", "finalize_tx": "0xd341f698057d65990dd04348ed8d5976f1215561fdeade410b2cc792d9ea990e"} +{"index": 78296, "batch_hash": "0xf1e1700c36e1072b14d72c35de9f52c9bca81085df5e0ab6cd2b7d350db560c9", "finalize_tx": "0x38acb861358bfe0c52955501d422741faefe606a8eeef3c359583ea36ec65ad5"} +{"index": 78297, "batch_hash": "0x93f710d923f766de28b7518dc0346067261e8e0a56559fb5768cccfe1a9e052b", "finalize_tx": "0x90f488a5fb743a2f74468ccd06e49c3ccfcef2b1e53fa4a7122c811f4baee014"} +{"index": 78298, "batch_hash": "0x2bd80b1b7937ee8798728b8abc8da6409c26674c78eb80d90283d1773e26585d", "finalize_tx": "0xbe23aac05a7ee2d06ef74bea292c4481498e514bed66de4d56f207c2dbf5b256"} +{"index": 78299, "batch_hash": "0x765194d5d1613c0e93b06d24e06595883f93bcf9db696f97ab8a2d38373f0342", "finalize_tx": "0x761415956b51642c8af989755727b27a9576c646ddfdc527d923d0bc30302c27"} +{"index": 78300, "batch_hash": "0x3b0b5f4ec64655be05c3e24f2d4551d4a8bb9bbf2b0749087e56e11a5890a099", "finalize_tx": "0xd5f9ff4c5a3229c93da13e55e32003a68c55a378b11b9dcae1cfdc32b38f0c9d"} +{"index": 78301, "batch_hash": "0xd7592cf55c65769a09e3dab362c9d66b826e658986b66a9e92b5dbbc7b7bda61", "finalize_tx": "0x9b570e3c3066693a5d574485bbcaea17499a469c92aa9943cc7c23b8e192f2f8"} +{"index": 78302, "batch_hash": "0x4a5cf0cfc84c9a735ef25e23e87b6fc0ca32c3377515210d9107bdf8701b6df4", "finalize_tx": "0x361d3c2c931b22b472a1a13bba8999cf061f6281babe0050106a36894677aec3"} +{"index": 80843, "batch_hash": "0x21bc440097cf4e41e7e53f4befe4b37b3bcca9457dd7423b3e11647a3f2bbb9e", "finalize_tx": "0x3dd9792205d9692c6f6dc3559e6f78337a03af152cc105fd9675014a3e9d4e3d"} +{"index": 80844, "batch_hash": "0x8ddb7434db1c4a1663ce9748dc891ca8ffb1ed8817214ca5ee1d2ce335f714eb", "finalize_tx": "0x44923101ef909cf53e9960274bbd497139b27687bc27a3daa09387647f8f4b19"} +{"index": 80845, "batch_hash": "0x1a7d54035c2c65f59e05c6b33434eec82bde6cccf2a29f35379a116aa1342a44", "finalize_tx": "0xb907b214d87091e78a0cea1770db98ee315473ebdabfbe833226d265483b41c1"} +{"index": 80846, "batch_hash": "0x2b796ca9f97d049ac5c9ad1cecd1e1665e5804be45c748dada8838650c8e3961", "finalize_tx": "0x10d23bd16af40b7f29aee3dddb8e693313ff27cffd95ee810bac87c4c39cf18e"} +{"index": 80847, "batch_hash": "0xf297e2b12ff6c0b094671457567dccdf01d7e5a57e7a5bd754079c67643421a5", "finalize_tx": "0x8e5bcd394d8da6ec0adf6431c46d0c9196ec840c345d3fd29bde3e4051ad1696"} +{"index": 80848, "batch_hash": "0xef41fa5b5a1f78e1f1c00ba5d64134b7aa5ca1ff5286127ce9219fb1596471c9", "finalize_tx": "0x4a0b6aec5801212e459a7e2d8bb0f16ce7be21b7ec66899f9d3a6ed1e260cebf"} +{"index": 80849, "batch_hash": "0x7f74288854db37fb00e5b28688aaa33a8de06973384fec87818de303ced474d1", "finalize_tx": "0xe7da82b0804aef029d52b16dac6172010cf1c4d0b672fe13ee48bf5ad6113820"} +{"index": 80850, "batch_hash": "0xfeaeaf02d69d9f8d9d3eeea88883f70bd995187bf787232b2781a862a500819a", "finalize_tx": "0x090ad69dc3b55ee8b41f1ec227be74d400b982f224e5c21931271b51c2974bd0"} +{"index": 80852, "batch_hash": "0x4cd8f89f0b04f600abaf7c6744d013d91d72701bb0ff536470bff09cd5ab8d32", "finalize_tx": "0x99e7d5ec17af3860f154abebe8f07bc6f6da4b3a66fab01e1eebc6a6f3801f40"} +{"index": 81233, "batch_hash": "0xc644e97d5f34c6143d779b953a24d3002bf522dd60bf7d60e6fcce0d8fa15a97", "finalize_tx": "0x071bce1003eaabd48ab21ed5b5263c63d3f2e98aded4d751568b15e3a7c7708e"} +{"index": 81234, "batch_hash": "0x006d40f0e90af89244cd8f570dd3102c6a9e7bc4a6f2619e9dc42d0d443692cc", "finalize_tx": "0x686f57566dd0bb2eeb2d6329fbac1e29a8354181ae541c9532e0df58442c2cd7"} +{"index": 81235, "batch_hash": "0x0534fe28fa7a0c5573d524b315a2e16de16a239c2e4449289b5e890fc31d035b", "finalize_tx": "0xf6acb09355345579d73c60abc82c3acc18fe98016c6bd13332a0d1df4cde960b"} +{"index": 81236, "batch_hash": "0xa8226732e3f4e2a404397b0a1862f9bd887d27a96c47d499685a42b7eaaed35d", "finalize_tx": "0xcac95d1f0324c371a3866284f139ad2117e161c0c27f2eaf72683ac5d4bdd846"} +{"index": 81237, "batch_hash": "0x923ef35c78bd5e3e00a823372b512ac21698a7a8184cc80f75211a0dfa925a96", "finalize_tx": "0xa60269b70e8975e5b8ebde710e2c9b8bae764809c5611b194480dba6491a43c8"} +{"index": 81238, "batch_hash": "0x24229f6591c3dbeab6f4e82afc6af8e843e65035e24b572c5e60b8bbb62062d0", "finalize_tx": "0xab8a26ac2286dd1760b2f384b98faf5a58613d27d67ed5b3d88e3fe6d746ddea"} +{"index": 81239, "batch_hash": "0xc70163a51e0c726167315c66872e668ee03fa68dc771972fd70c0deadb12197f", "finalize_tx": "0x76eb3d13222b1f557ba1cc67aff6d920e1a0ba1943c81b4f1dacc8afb351a354"} +{"index": 81240, "batch_hash": "0x4f966bbcc5a8ca654540438336126d7f37a12a618b17d80fdaffce94c9e44b9b", "finalize_tx": "0x285583e1c83e6cfc12a8a7f327e6d8df100baa93c2b133010dd7156a41c8a520"} +{"index": 81241, "batch_hash": "0x5c2a21c65ded25577d1de5e550161d01b508eb467938b8aa33f3249cc206f936", "finalize_tx": "0x3eab5b986815f3d1ba9b470b5991383182803264ce0f2dfbee020832a3786abe"} +{"index": 81242, "batch_hash": "0x873894d26f1bb6c82769a8a5c670c54a08839d430e05f0bcbe673aed558f646f", "finalize_tx": "0x690d247932e635f82f3f7e0ae7c5d4ee778ba624b63f6e47c7a57361e3a307f5"} +{"index": 83313, "batch_hash": "0xa924ea449e7f5c5bf57e0e4734a7d7d7aa2e9264f4ff3270653e764d1e4f00de", "finalize_tx": "0x541ec7690b8921d7fb0bea11931b8f4adacfea5b4a297e07fe0245acae631ca1"} +{"index": 83314, "batch_hash": "0x8f64f53ea5c2a4361cf1f89b014c77f24ff4d1141077e92aa488ee56739080fd", "finalize_tx": "0x729bcf34bf55cb09488c9d25025ac386ad4608e4a2fce1221d32942353d93d1e"} +{"index": 83315, "batch_hash": "0x9f26813180f43709d115c7d40e8beba491af438c0a4f8dfdb4e2de11595bfb22", "finalize_tx": "0xba00fc365a6adbcbdd2f7686f368705cb12b19544266bfdceb09000aa4eedfdc"} +{"index": 83316, "batch_hash": "0x0b691836f3b24993f7cd342da98327596b226ca4fca004dce91abbe3ed06878e", "finalize_tx": "0x93a575af94ff8dc2e9a5c2557d733d86fb1c1ce2e2b08c453861119036ca9e8e"} +{"index": 83317, "batch_hash": "0x93c019dd9bc642ade9d704fa2a65cb9c35e65987bd26b1016afc99b78c3d720b", "finalize_tx": "0xa5c113b0b129f82ac791abbe218f547b9be8838fa41237f652a53d8748a0da93"} +{"index": 83318, "batch_hash": "0xe873fa917c1cfd2e3349d82ee1c00ef03e535309baeb2a485b265fdd46485a32", "finalize_tx": "0x38f9874f0a223ba97663820c192a9f676886b958afe21387314b6751f165acb9"} +{"index": 83319, "batch_hash": "0x79a958c301da8a380c9f2837f14d2bbece1e1f87046e32e9dafc7fdf12b43138", "finalize_tx": "0x0dca8047c4b64ba6948780d086e31a7823a7ac49f08fd530a94fd52cdd42f78d"} +{"index": 83320, "batch_hash": "0x2ac154f8b08d4f2794d99766774ed98b801a1fffae95defac80501a622b1b2e6", "finalize_tx": "0x6847a718a3a50d978ec5613b0952f486ef873646cf440e4c280150f39c28a68d"} +{"index": 83321, "batch_hash": "0xcd1f2dce31b930a1809b68f6071be3bbed5bbcc135dc82db8049bc0df0f0fb50", "finalize_tx": "0x9188a01b0ef12a586c7ee4fc1d1d43eb2400d3fb384d6ac7df89ff00ea290869"} +{"index": 83322, "batch_hash": "0x21b4be3236e0bd7d2d5c4cd4cecaab00470eef31491733766ad95bad43ed9270", "finalize_tx": "0xa21309cf88d83322b3d2417803cc3f8411bc453f5e0f5e9fe5aea7a4c4089f93"} +{"index": 84543, "batch_hash": "0x9140fd598d36e7447c051eca7361284fdc6c8da8e44d1ad87ca22d8157956636", "finalize_tx": "0xb92eaf1581e0cdbaec6770521d3160a8aa6686ca8fa8526a8ff4e58fc18700e8"} +{"index": 84544, "batch_hash": "0xa85dee2a8d37537c38bb87b21bd2348a31a2c5c6747e2facc3eafb02bcdd9b5f", "finalize_tx": "0x270315867f8fd042505a1147eca4839093598d8a794a8d9b094d31c97b0b1dcd"} +{"index": 84545, "batch_hash": "0xd8627ee0a1076485d7f4f67e587eeeb54b7616566996679421846751a5d51660", "finalize_tx": "0x87774d5b098fe0b3ddb945445b7afcdbd4325fa2cc09327159f801a86a270289"} +{"index": 84546, "batch_hash": "0x6223caabc086b6b68c8f11a40e8bc0631eb6ac782623a5b29b834f174d4ece90", "finalize_tx": "0xc76523df5791bf17f9f7c7b4c0b1a52a9d49af886ab3034e842d4eaa64fba6f0"} +{"index": 84547, "batch_hash": "0x760f8c261074965aa11a2a33ff150cc19e6e564c31e0e782008a0d813c059542", "finalize_tx": "0x280b7f4429ebaf48eaeec15692f2c0d19b0446c33772d4edc0d42e7623b2baca"} +{"index": 84548, "batch_hash": "0x9cecdc426ea74362afc84eefe91efa595044531e44b089c02238f2725c3d155b", "finalize_tx": "0x22f824451695f54647a6b59d7323f3695811d525e21988fdf2168d7a0b2a312e"} +{"index": 84549, "batch_hash": "0x865cef5248e559052fb31a40456a077f17af894c4b330cab44d9991185ddae61", "finalize_tx": "0xdabdf7a8014c1cc321bc9e5372b3cabbcac061f7964cfc8188a2ef42f6e4f61b"} +{"index": 84550, "batch_hash": "0xe6a9448429788b38b65c971f24043c44b7c1b8044897b9de19740f22367579f7", "finalize_tx": "0x0c94e334eb3b2e46f21de3d7debff2c5f1d1bfbb799cb581923cf938d90e72b6"} +{"index": 84551, "batch_hash": "0x28cfdb72bba2643dfb849cc85abf586020032f619b26a783825d9b4b7f242b6d", "finalize_tx": "0x6f9bad7585b35bfa77c05e85ffe72c5ebf992c185d53bbb7f4b8fe2218b82632"} +{"index": 84552, "batch_hash": "0xd486b17a0f3fd04cfdd9585eec20333d7fd2c80437db0a7c7f53b6354bf0f4f5", "finalize_tx": "0xdd71e6382dcd914ae9b23a9e8891072d464d38a88a324d6e348b7496a819d4ac"} +{"index": 85543, "batch_hash": "0xaa416d97bf72e3c8a41de1bd6f10f433765987d119e2abf17f94a5411e6dc5da", "finalize_tx": "0x9b80dd0bc33bbb6f36004ee138e15192a8e8846833ff3a8a9eba033824e43e9e"} +{"index": 85544, "batch_hash": "0x398a8b5222e793e392193000108e7e1618ea4c1b8663f6ac31389e11c387240c", "finalize_tx": "0xf7a2c1b0790319af7d90e63236c2c96d91a1df3eeed2565d7712ae18a30ec766"} +{"index": 85545, "batch_hash": "0x9213db0fa01123c497eb85fded765ed3dd763071c0f850f89c3d820ac04a9ee1", "finalize_tx": "0x8fa5aff776d8ee6235978116ee1cfcefef3a385d6181ac650ba1f149239b86f6"} +{"index": 85546, "batch_hash": "0x36b5dd1417f4d82b029bb04258640bd0147b37e4203bddc34fa620c9d8fe2d84", "finalize_tx": "0x64a979ec391c1b9d80fc2da3cf442656f7706327a93d83a2a38feeb2b733f9e8"} +{"index": 85547, "batch_hash": "0x47d5a501f70726649b071b00ffa898d8995022b4772ca0eea51c70b00f630502", "finalize_tx": "0xc293a3537335a14f0afedc93f09d8a951b5ceee15ecd36e2c54c1177b7bdeaf3"} +{"index": 85548, "batch_hash": "0x6e67a219ddcbd9e3722e509856ff89c3d1f032ecbcba92f19c35c92419ff79b4", "finalize_tx": "0x0af93ea93c46ed37b7753755c5557588b4e96a140b69ed74c437ff74542ab1d0"} +{"index": 85549, "batch_hash": "0x8616c0e347a207335cc2f16f5a474683f40300563c2149a3d7c881b626a5c295", "finalize_tx": "0x174a49907ca9e0d87c7fff79d05446e40bf55dc822ae53cde82ecc199e83e29f"} +{"index": 85550, "batch_hash": "0xbd9cb7d8cec6d82cc0f7690222974a62cd1c8c3822e7d4825ec9bbf8cad4f863", "finalize_tx": "0x679cc5bcea12f41056e10f597dbe06e6e75c1eb6864d1b89115417b1fde7b603"} +{"index": 85551, "batch_hash": "0x784ac5b1b916f583c8706080f47ec50c4235f6940946969aa9aa19460a18485e", "finalize_tx": "0x5fede4e53d6de781db698c69a276ee0175c26bcf643d8c3cf550a9e991f5cb3b"} +{"index": 85552, "batch_hash": "0x0dcc60a105f8443fb5203b7db1df9b91828d6870b2f90b62b5605d54719743fc", "finalize_tx": "0x6ba4d1ae3cf10b20b09d02734bbc75e66c5466f9b421f790403412ed79c2af57"} +{"index": 86113, "batch_hash": "0xbe07be9c252af9de721ecdbe09bbc1ee3c5ae66cd0d3c5eb32cc9ddec469ad77", "finalize_tx": "0xbc8666ee7526573318d805e8d756f7a67ebce716d4cc40cbbe4bf65e6162d8d9"} +{"index": 86114, "batch_hash": "0x5f2ae29fe28eeb9ea70f66b0717a503c17ae90b31ad47bc350ee59d896ed4a94", "finalize_tx": "0xd489429d7fe21029eda063f43edead38623d74c3a3e040b0e2ddb1e47c95d68f"} +{"index": 86115, "batch_hash": "0xeb53aeab67427e1ffea7e759d4ec61d1b5d63539a32763178bc3b3931659bd76", "finalize_tx": "0x504155d5ee429923ee2537678354bd5e639277051f803d9a2811851437de812e"} +{"index": 86116, "batch_hash": "0xa4cffd3bfd85e107c3822cd3fa5fc39ca136475ba7f13e5151807b38eecd6225", "finalize_tx": "0x35837fd906ae2fe388bd1d55bc5b14916c15059d0ec15897856037ab6102584b"} +{"index": 86117, "batch_hash": "0xd9f25d547509a2c2e6a4b6559bf53a15d58b1f149dd193d620ad796d5edd06a4", "finalize_tx": "0x49f389705b3125f448aec0a383542a44b7cd7d9812ba0dd62f6ee0af0f03d177"} +{"index": 86118, "batch_hash": "0x0d8652a2021a100322f943184560fedf65dbaf408028b42eded42b0adeb53f8a", "finalize_tx": "0x0a3b54afc724bad6ee04725bf973164660a6b06d0eb1d5371bcc731c23aecbfc"} +{"index": 86119, "batch_hash": "0x872feb28ed4f903e1e39229043bd9a39f9055f1c502bdeac8d725792aee65e4b", "finalize_tx": "0xa5b79605453bbc6b52aee9be5c118ccf6e71b3ada5aa279af7cdd6a90b6d46f6"} +{"index": 86120, "batch_hash": "0xccfa0def8058d6438a28498d7ffed77deda22c2a56fafdf552284ecee353d9ff", "finalize_tx": "0xda9bf093c7462631728ca5635d6ceede0289e37e7514ee9c561ed72ed7f9567a"} +{"index": 86121, "batch_hash": "0x5f7c13c997d578f81f07690cb0b6da5230f7cbcfcb6be76457a1c0c7468a2f30", "finalize_tx": "0xca2b6b6db9b06afce9b228c3ccdb5a4054cd25caca377b2e37fd3fb6d3658dfa"} +{"index": 86122, "batch_hash": "0x08909773fa8a77ca3ff768c9f6ff970cd5e535487c50666e3e56ec248fda424a", "finalize_tx": "0x49c371534a8375227e9f406bdaa90b20a8ed98aa1efd72ae89b3da376fb08d22"} +{"index": 86213, "batch_hash": "0xe6cc4990bcb7437fc3c04a74c55ae7b2b73a2c7a1b9a4ad2023c874fbeec9b03", "finalize_tx": "0xdbd41084114bd4677d26cc28f469100cf506f8bdfad671c0c1d6156e92a0c830"} +{"index": 86214, "batch_hash": "0x65247ed198709eec4231d1526b0bc15a0455f0d6644fe5b4566a810918893876", "finalize_tx": "0xc705a6c4374bf343945ee290ee47ff9b2ca4329b94bd665b392b1c8d5715f5a8"} +{"index": 86215, "batch_hash": "0x70421793664d16f80c717a58f45dbeffdbed666c26f7c0de7bcc71cede1fbe76", "finalize_tx": "0x60d9d3aa6ac1e339145925946ee0a2a2bf4df71dbd13ba7f5bdadf3bd1e718d0"} +{"index": 86216, "batch_hash": "0x89b5c5b4ee126a06b81bdf9dc30729579d751ee44151c8e238c21ca5102e66df", "finalize_tx": "0x57816307aed23e9767a96f26efaabbacf3e9b1099a57edfec623964a6b33d601"} +{"index": 86217, "batch_hash": "0x5e13e0d8ca2120613bd7ea6cb379ea4907b388b18cabc3a477bcbfbf05ed8ed7", "finalize_tx": "0xd9ad4ec2c34d2646bb5580f03d4df31189973df0df880f35ab5b1f6d5298a552"} +{"index": 86218, "batch_hash": "0x8ecb6045d8367c07db5ae025c161ccfee120c8e498649f72ae9494f620904f2c", "finalize_tx": "0xf18d5f3a45920c9bdee21948ac8869b14014a7f5afd7523ce4461fae06d6352e"} +{"index": 86219, "batch_hash": "0x135e3032bc3d279ebd8ca172f95debcff1699ef9afaa2a014eed3f39c8ad32e7", "finalize_tx": "0xc2fbe1adf3ce95c27210c9f2a38acc2e592ef76b783202510226690a4e22c9a2"} +{"index": 86220, "batch_hash": "0x84e20f0ab25a10aa44b563f64e434aa34ee91c70d2c2cb4a22aac8f57b7a5068", "finalize_tx": "0x2c7d5b4bbd3c921eabf21c96df8d272ff418cf576184d6d82ec325cf02dc00fe"} +{"index": 86221, "batch_hash": "0x34e5eee4d0941c75d268ab3c15efdbb9f9f89ee5f54fbfbd22c7dfddda7fc652", "finalize_tx": "0x06a6abed7819c9cb74f3c13f9be177a155203ebee7cc65dd7236669a1276059d"} +{"index": 86222, "batch_hash": "0x3521f05810bfd1b8de3646431c3e5730754ff36fbe9a867090b24219d12789a3", "finalize_tx": "0x54497d4456b5492bd828bf3cab241c79cc77cee186d02d5529a46cbc6bc28837"} +{"index": 89383, "batch_hash": "0x5036a3f27d72122d70e2a42cb7a70d62ba273c6f1ac2a4b26979b6f2ca4309c2", "finalize_tx": "0x803a201477e7ef150efddf174a6fbbbd42c7df625f55150732f60bf59dc72961"} +{"index": 89384, "batch_hash": "0xc36a1b50260fb81dde0fc9c7d428fa213740affc269b742f88a37d66868a0135", "finalize_tx": "0xf336bb03cbcd802d67d6f896574cf6f3b8016c03c4d5344a698dea2a5a61d23c"} +{"index": 89385, "batch_hash": "0xd4c42f9033622ad6ac65e12a7a7c9773094b0fbb04ae6bc5ddf5acafb7cf4e0d", "finalize_tx": "0xcccc6cb53b4e4caf999e937043e8cad54c35456a5a7a67c6fe2d009d5b48b9ff"} +{"index": 89386, "batch_hash": "0x70435ce8c19d58dfcd940af0083400f126ff46b8ae93533baa4e4e38116291f4", "finalize_tx": "0xad07e897290c2cfcb05b68257c9d242f3d9b95f0a5bd92a8d02d3d2b1d2ec149"} +{"index": 89387, "batch_hash": "0xc668ec1da0f18d79bb470ba5180676783f54c27a76f4bad3575fdefa05cb55ba", "finalize_tx": "0x43dee348d036dd32b8fafc83f56dfc84fd35268c307ae58a954dd7f55bf4e015"} +{"index": 89388, "batch_hash": "0x1fd96bc086a60b4d5b2c099e18977a4f8bd6bfd43908431dc6487086a1cba0c2", "finalize_tx": "0x475893b600aad8bdb4ee865c03c95a7bac9f4858ba2740ee1f563f97cc90d3df"} +{"index": 89389, "batch_hash": "0x582cea67d5dc9e610ecd3b961a7fb49fae35b20095525cc022b2d60866784e8b", "finalize_tx": "0x31e39bbd2071f8df37a1266f9c3fd63a892b32c8b19acd06ae5b969285586ceb"} +{"index": 89390, "batch_hash": "0x50294826a93dbd2c36731fbe8eae4e59573e432b730f33b9695603e3711cadba", "finalize_tx": "0xdb372044d1bcd1515d76d7d20f781d6c3f411387728741725355afebd37c3ed4"} +{"index": 89391, "batch_hash": "0x037e5389b739b4f58e68ab1ff7636aeeeff4da35843d23c0cf9b1b7295a5f8f2", "finalize_tx": "0x8810b566aea1e29b058c877b3d2e0c9573d40b5cd9d41dac6a2edb2144309061"} +{"index": 89392, "batch_hash": "0xa0f50e178714721b224e9d89e6afcd662cbee38867afcb5553411731bca4f0fd", "finalize_tx": "0x1dc78fb344608f413047f68ba60094af27afa102c1060c408d9327343ec40413"} +{"index": 89913, "batch_hash": "0xb51c06ffee5de0579d82cfbef1ee38d31c7e66502734cb5a6766374daf99c157", "finalize_tx": "0xde69bf00f59e596a26ed3ac45260364b524c6ea0209107ec8c579d28459c0c86"} +{"index": 89914, "batch_hash": "0x3782a1df439efc7610c64b8fe6946447be8c56faf3bda4ae7172357869e0b51b", "finalize_tx": "0xb93c315fe3d11dfc010b188bad5230571b694448f624cfbebeb7b21a67fbdbd3"} +{"index": 89915, "batch_hash": "0x69249e299acd5e088dcac5ca28f80c6df02c819890335f8a12050f8346e1cf85", "finalize_tx": "0x1f7d08d7a27026daad6f5ff14d46c615bad90b2c1b28e9d726e6ac961d53d17e"} +{"index": 89916, "batch_hash": "0x9b6b391e42a4c7e5de4cee3dc9da0e91fb93a384b2403796edf214bc0bc55689", "finalize_tx": "0x608ac47b01792485668a0c2c58a4d38dfe945b6ef3cd29665dac7b837111429a"} +{"index": 89917, "batch_hash": "0x08f4482950dc3a30103f3ceb3954699681ccf10dc1aeba09106f211cc5df19ae", "finalize_tx": "0x4027455fa6e2be5af4e9dccec2cee8b305df072ce2949ed7729c35caf8a42181"} +{"index": 89918, "batch_hash": "0xedb2cb4d15e488ec922114320e7240662d5c404dda1375ccc820386b20cad1d6", "finalize_tx": "0xa10e07de17b57d64a09e89676cd5ee055059007a8a92eeef06970e7467ecd6bf"} +{"index": 89919, "batch_hash": "0xbb7debe68ca8383f15984263fbe989dd5a1237a07a6d55cd6e401678cabed3e6", "finalize_tx": "0x6cbbfd60d4af3bcd36e3fcfb07c37689ee0b8188499935b6968fadded5a74913"} +{"index": 89920, "batch_hash": "0xd46db1921d23ad5504bd55dd971501562f232fdae9bddff30bfbf549eed95350", "finalize_tx": "0x4af42dad4ee682a9f55c521d6fbfac549338dad6fa5bc92e1afe077781afa355"} +{"index": 89921, "batch_hash": "0x2b01a872d1669b631ce1ac505e135793f306bd5a68ff81ea37701859f07bb631", "finalize_tx": "0xa60ad4f58dcec629798022793afb8316a34c0a4954b9eea98972ff6294346ef9"} +{"index": 89922, "batch_hash": "0x45a60759b7596dd2c9d900bd828795b52d8c795357fd88bfd3fece97e6a9ad95", "finalize_tx": "0xad9331f762aa0dbc485c63f11f23d6a2964f14166d055ccc09516b91aa687790"} +{"index": 93333, "batch_hash": "0xd39a2521dca68c2a4132c0a2a82793f2643d5728ed8b50e889e255a3323dd689", "finalize_tx": "0xbc621e09d77e6d826cdfab654a6455a4bb78ec855cbea256cd011040101df71a"} +{"index": 93334, "batch_hash": "0xa511d572f0f33d087d56dc9c05d69361e207889dd439e60ddcef6d16e2b99707", "finalize_tx": "0xbddd352e3fa12c5134ceed91e1096363da2546e6268fffed10b899edf6edfd4d"} +{"index": 93335, "batch_hash": "0x2933ffe456747e141088214248963ed2e0a36d58ee8c765f0c50b081e681a886", "finalize_tx": "0xb85998ac869e2d1253ba18d6b2447c36a850a564e9388de1c35fe9de10b72b0c"} +{"index": 93336, "batch_hash": "0x59fca1076adc6d1d26d1033156bfa7301fee1496c0d2ccd049c19943d9eac666", "finalize_tx": "0x5b4e38a2e11595c6d30af062a6d19f1c9919cff3b1f124a711c46b581dfa78c2"} +{"index": 93337, "batch_hash": "0x0c514492bf6a36b1092743481b0de283605b1f7e169cffdb11bd02203073a244", "finalize_tx": "0x758d49c9546bc2cfccfd47e073347f24d6d90f96459f756b5b7ea353e11e8189"} +{"index": 93338, "batch_hash": "0xd53ab3a960fa40db11677499a3966edc23860672e954039e187798c30178b245", "finalize_tx": "0xea8973793f9f25db12563380b2b9d911fd39b2e96f9e944a881e0d71a82b6a74"} +{"index": 93339, "batch_hash": "0x32f7c2ff77fa178906e535264520b934be3c6f28ac8d8f35d99243a9e61a3d25", "finalize_tx": "0x18235d3fab1a37957e78f5248c0b0522f4948c6e105807958e5bb62a61ba645e"} +{"index": 93340, "batch_hash": "0x7124ccdb3bcb97e4570cb2607c7e20d439d6498de607e1d4500b62434624b4f5", "finalize_tx": "0x36fe29a4d3676bcb6185a5d0204c45fa92d3120303ee68c64ab3c4091ab65302"} +{"index": 93341, "batch_hash": "0xc2c98e1a2d2aa421b5d9ef1e3998de1a21b176e831214716b6c121ee1a45784f", "finalize_tx": "0xc0973c21b26fe3e3245826ed32788a883a0b3c99a930df7945f92459c154bc69"} +{"index": 93342, "batch_hash": "0x8e70f886a18a28d77c09781e328fc2f7140be38c9ec86f847d8762b797a05a1c", "finalize_tx": "0x0d7b5713b57aaa9f89f0a8cbd42fbbbb1bbbcdeced43b8d2409b52df778de58e"} +{"index": 93713, "batch_hash": "0xd30450f5f57fadf495d77061d0be95ea2f26e47e605fbf87297086eef932fbf5", "finalize_tx": "0xbf82e565b17fb65f0125a756236b70fd4a385b2168d1469d8f4317a266a655f3"} +{"index": 93714, "batch_hash": "0x2556494aa2c02f02c9a4371e22941fa24488560c1c77e0fab86fde38c2320ff7", "finalize_tx": "0x40842d1f28ae0d0b10bf525f9e9bec33eb458b82e030285fab1b6ab58865bbac"} +{"index": 93715, "batch_hash": "0xaca6ef67769c1534f345d973e6e14b16000c8e592271591e172c80a39ab27407", "finalize_tx": "0xa181c4339a98342fe766797463d8af52be79076fb266a4d83bdc3b6f5c62ea9c"} +{"index": 93716, "batch_hash": "0x86c8851c1ca3a8db418f0dc325d4ffbc407bf58a53c85703658412f2ef112234", "finalize_tx": "0xd20e6dbba598ce3d440f14e8545042a92e660097fd2dca2bea2086b5ea63736a"} +{"index": 93717, "batch_hash": "0x0635f4c893a2cdf7a09fbf7d97bff985d5be4cdf4127bf13351c50f5ff34c8fd", "finalize_tx": "0x3c888444f07eb31a313bff7b2450afbcf75510f60db205c868e210308bc48871"} +{"index": 93718, "batch_hash": "0xa97e9c2e5d046a452056135b420c9953471f6c9f9d069935b96ca94d4fa867c8", "finalize_tx": "0x0743a350fea19b55b17da9d76a92ab997d9bc724c4c7b30ef674fe22ef0c22ef"} +{"index": 93719, "batch_hash": "0x6cf21402cc4724f9e6d36af3e139df9e311d7d3e8da5a3cb0a07b1557829dfa5", "finalize_tx": "0xae8dd2d2ef38960980306c97f1c531fc4727e04608d8dadb98ab1f84d102709f"} +{"index": 93720, "batch_hash": "0x37eb3ddadd0a7955244c81e1e84162822352e1a99aae0c87603fb0ddfd740eaf", "finalize_tx": "0x2c6a81775882d1c261d4bcbeaadee09e8325f65f9727739f254ee0b85a677498"} +{"index": 93721, "batch_hash": "0xaf9e6a8f543869145f927b7ed19ceb21dd85add07f757b665be550c95ac2d4a0", "finalize_tx": "0x16ee2637376fe45b9ea59be14bb1606acded2900ba9b94d4139d275496f1d0a2"} +{"index": 93722, "batch_hash": "0x389f39621a0854a5e53239e15556914d66fc633694a9ccac4b039e5bc4de2614", "finalize_tx": "0xa9d751254761c7641b7b3f54d7e494a95bbee183545526a3ac96658271162d27"} +{"index": 95673, "batch_hash": "0xc5c64c2817035c0da58d72b5664bc33bc9703140e7a3cfc07bbdfdc03c6f6452", "finalize_tx": "0x178a8ec15ecf591cee4aa5a059b50477f27653df0a933f5f5e5ec928aaf757f9"} +{"index": 95674, "batch_hash": "0xfb02c405a699749e8daf3c6acdaf75d9d98921bfc33b53f196efc8fe7fd00739", "finalize_tx": "0xdee5e6dcaa3964fa3a718fb096bb338929c627e528122f6c41765b43ccfe8dbe"} +{"index": 95675, "batch_hash": "0x5dca997fac0c846b74f0b5d2121b7e2931b8291117536312a26023dec3b7d922", "finalize_tx": "0x828e9e2cde29fd0c197fc61ff54e6710a73d166a6ca71c7fce36e67169a9a5cc"} +{"index": 95676, "batch_hash": "0xfe3b234518dee5f34e476b5a173f05d094ca5d1021e60cc616e3a3150fc2a30c", "finalize_tx": "0x46f89e5c852fe6ce3b3dc88dfb3a3f330a072a333a2a260237208038366a7d28"} +{"index": 95677, "batch_hash": "0xd721900b6ccf81b95b8e8bf787e1e40fcd0a0a63e6cdbeff4e7afe0c32acb486", "finalize_tx": "0xb68ec904d939d341d97dcaeecdf752099e859de8a3a9460391d2e36a72ec7281"} +{"index": 95678, "batch_hash": "0x40c2fd403ada1fca85b4e2131b8b2e5fdd7157d2c227375fd8c3caa4664b74f2", "finalize_tx": "0x252e4e2e8018d36ca61487288aca130bf28993b6f7d2b2c88eda9ce8f09e50fa"} +{"index": 95679, "batch_hash": "0xebea5fbad3be45e8ff163b1471fcb8520fa22dfee9b710b2b781105dbebc66b2", "finalize_tx": "0x39ce11e853b4eb5d58fed78ce5fee85d182d5638474df2ddaf57aaa7eb6a0c1d"} +{"index": 95680, "batch_hash": "0x095c5f3f402b7cc3220647ba076fe0e2e85ac7ad2e62a0703169529e26b8eded", "finalize_tx": "0x632b7ec91ecf65c792e18ed68da91b771ea5a25e6366ba2d4eb06833e82e9579"} +{"index": 95681, "batch_hash": "0xef77108d88cc8e1839125e2aaf02071866a778d381dfe242788a9c4502bd7178", "finalize_tx": "0xdd37ba61d87c80d5173f9f4fca0f450df256d9eca281c4937a42000d2844ecde"} +{"index": 95682, "batch_hash": "0x5c004718001ebcc20d04f646620967f67da9b175ac81249fe3c0adce001dfcde", "finalize_tx": "0xd579afb01ae6be95753e2adfd2107a8e7dce34b0306f2680b83be1a9ea259b03"} +{"index": 100883, "batch_hash": "0x2a3d2860facbd7afbe84d7e10fdbbae8ce3de401ca0b3a719dc21a5b6f08da76", "finalize_tx": "0xb1739902393547ba50c140c2a21610f40d02d5c8b626eeefc72419f578c01b7f"} +{"index": 100884, "batch_hash": "0xb054c088a160fbb2adcc62fdcd1f51b079873bb6770caed2791f08a2dcc3ef56", "finalize_tx": "0xfe3f768d8f64cad1b1d8506fba4c922dbeb15be1f705c1d24b4d469d50a6a45a"} +{"index": 100885, "batch_hash": "0xb5e96d66ba789bd1c3f99a86840110ac1e4eb64a04618eac68e460219bdcf2c2", "finalize_tx": "0xd0abdea8e283c2fbc233f5d486fc04f07863040dc0489e9dab80301f00712289"} +{"index": 100886, "batch_hash": "0x4543fb2a4826c7412e5d83ae86165e9722c8ac0c72d5a819dbaf0b4808f3aa2d", "finalize_tx": "0x85985eeb1e73f6b957c9954865bdbdda03259803d38d29a47da3654bba73ccdc"} +{"index": 100887, "batch_hash": "0xdc95a82736e584b0345fe6f32c072308b148d4169b994883b46c2834bace5489", "finalize_tx": "0x55dde3f3623322b7efcc80f8dd258a1e06bea6c4273cd9f8fb524618b57b72fc"} +{"index": 100888, "batch_hash": "0x81f2c96020db2f8bc844ca5d5386a9d8bb240135c93ea1555576ea5b1649a068", "finalize_tx": "0x6858160458bba2fb0e1e14b036c8d012adb580eabc968c50dd6597af403a30a1"} +{"index": 100889, "batch_hash": "0xb41e55381d6d50c28ce0499d4cf75a4ad4e3f806af8dc104ee978079b10d896c", "finalize_tx": "0x2195ff75e9e82a4b57b53ab5c930c95cc2cd914ece5a2b0c0b4d5035c8abaa06"} +{"index": 100890, "batch_hash": "0xbb04ffb181a4ae8231ba1d6decf4074f1a5d75fb48300015cdb4564c0126b901", "finalize_tx": "0xdb296a7ffb575701f8d3c0d8d88eec06bc040c7c25c39db2159e96cc1564e1ba"} +{"index": 100891, "batch_hash": "0x1048c8f18e8d5de3cba952fa3270c24fbfde72509da0130acf8a303170bbf271", "finalize_tx": "0x00775b6757b922c9a71907afb4f06cff3678f62a2481f76c6863a966c88f5800"} +{"index": 100892, "batch_hash": "0xdbc50340bf8d8cbc67827eab8526fdd1d143b446f238e7c8d58a682e474a57c5", "finalize_tx": "0x44ff25dacd4627bfa951c29d74fda408c187d781a92d874b4fd0a0a0fd0c7ff8"} +{"index": 102503, "batch_hash": "0xf0c7d15bad8cb6f8be043cddee29afb671b0cc2717013fe5f7117e6e635b3e55", "finalize_tx": "0x253ead9c5c50a4a16fadfd6e7f3489ae60d857fb7bf460fc37b1aa2e3595765f"} +{"index": 102504, "batch_hash": "0xe4cfe56f1e8b76e0d85b43ea4075cbd8f3aca30dee365989002767ff07a71e30", "finalize_tx": "0x4366424f1d4df4b5ff67f688c7b4c5664cac623bcb1556796866c9d3b9b09d98"} +{"index": 102505, "batch_hash": "0x6f159c378ed48c8cb7bd1dad3cfa5ef57f17da275ff170e83344b43771d26f69", "finalize_tx": "0x4454579835f01d6f99c4f0aa914952def084000e91aff60bdacf10d0ac30b50b"} +{"index": 102506, "batch_hash": "0x27fb12d0c0200d63fb82809f6f16e393f73be4f8cd6bd59ba7975c7e9ff52561", "finalize_tx": "0x7b750ba9a57986b96e5e23b6a3310eaf739b7c9eafbcafd3b70ec53d4a7025dd"} +{"index": 102507, "batch_hash": "0x063242cc829d2c9a08e64c1be0ac8a18fbaa9bd1635809315cccfdb148c02df8", "finalize_tx": "0x17a556ab6802557157e1b92bf0b0ba7975631eed3348fa167b97aea890d3ace8"} +{"index": 102508, "batch_hash": "0xc3654be81bb1c1ae9fabf0975f9b009b61ff0de1d5dd2ce82fae98eafb3fa9e8", "finalize_tx": "0xa6712bd90a5deaccefb941939fb170b748fa825917dc641355a7f53b580e10fd"} +{"index": 102509, "batch_hash": "0x8ab4ba7881e1af745b40a99bc2af22513d93df462d0b196be1af12b6b1eea236", "finalize_tx": "0x12390afd5f87632c5cb6b9d5f93070b23932e37cbea63ba92dfb9524b048a8bd"} +{"index": 102510, "batch_hash": "0x54a371e32f6770db7f9de48b59e80654b9918fcf0fcb71674f035363d80fff12", "finalize_tx": "0x70f723c5fc4b278d6c87f33d01afc5475ea94b7583a6b1ebd3e7ba71c291dc90"} +{"index": 102511, "batch_hash": "0x948cc3f9812afe115726b1a89d7dfbaf8669ef502932261c232db588d5dc4bb5", "finalize_tx": "0x6dd1e7497cdf4aa359a0803c66fab5a5eec388504e1a81fb6acab13159edd458"} +{"index": 102512, "batch_hash": "0xc5eb3255fb0221542ff42ad91b1281a3621781ea87c6775f754fbf1644cb1230", "finalize_tx": "0x8f1d1bd1bc47c65ed0381d67f3a76f8a82cb783041808e8ad471b68d11a7176f"} +{"index": 108393, "batch_hash": "0x1a46c85016e1dce8f3adf19cedc3f2cb1aa8da52cfd05c34655cc1233ee94981", "finalize_tx": "0xcc5a29c95348475bfd93a6c1c095c581389f32e33f9e568cd0a1728a0ed3c7d1"} +{"index": 108394, "batch_hash": "0x8e228b0273e680781fadd466fcef31690ce5d28d9849ce1c271f30942c31a20f", "finalize_tx": "0xd87ab9aac41ecf1e3e2dbc37e612d359b2df55d232e381a9bdf8c59085b767ac"} +{"index": 108395, "batch_hash": "0xa5eea9928c39bd50d4e3936221328a48e6fbd9ec5dcfbdebaaabf586876150f5", "finalize_tx": "0x1ce43aff3b970987ef74869864faf00acc4b26f2e093feb168ca4d34c6a81faa"} +{"index": 108396, "batch_hash": "0x92c86079260550a4c84cd34b27a54bc66d94ac11b50e7ab3639c481247e169cd", "finalize_tx": "0x13f9258fe30e946636c9d41339f270467a27e209bcb494cedcf00bacc6591cfb"} +{"index": 108398, "batch_hash": "0x509cd87ca7e5510242416be7464c1fd7051cdc3dbf452806cab1c883751dbdb6", "finalize_tx": "0x8e8c83ab07026bd3715fcbf100c03439b60e535ee4c15d14178e5231cb832581"} +{"index": 108399, "batch_hash": "0xf171e87a736c2c4e02653bcb7806547742631a251228c0ece60600c740c48083", "finalize_tx": "0xe7d0d0d6bfe86a044cfa09d41023dd8558ff9dfab9944bbf9a8aee28bbf52589"} +{"index": 108400, "batch_hash": "0xe1a54c5c5365ff3358ae1b13449c8e116f8d43e3ce0218ed1779e9ef3bba2072", "finalize_tx": "0x966b5ba55e4c422e0bff747b2a470536eb5861f68c1bedfe06cc9113304a7ad5"} +{"index": 108401, "batch_hash": "0x8a7e5a7987719b0cf467c35a7562942f3d52623d79e19c64201ca43871eb2ec3", "finalize_tx": "0x83c8039e20e0da0b00952061f628fadb433d60fa574a3b75c2d9988f1527c4aa"} +{"index": 108402, "batch_hash": "0xdb7771258c4bd362caf3649ff0480a28eda62fe4259bac7c80243498cfcef72e", "finalize_tx": "0xc839aef624d43799ba806248624bfeb16870c354f643da5073e62855dc6349d0"} +{"index": 108463, "batch_hash": "0x4c4bf3c90466baf0bf2b59fb32648f61349e334e6e1368c969f92b8dce16026e", "finalize_tx": "0x045453c9ada2a17f359b1dcead209de8f956b76b55670679c5f2bdcf7a270752"} +{"index": 108464, "batch_hash": "0x39560f49f3dea2f38cb50cdd5cbaa9122f1189ad076a6191c4ae8bb457a0e67c", "finalize_tx": "0x494d156836a16f55bbcda035cba6a642ec82162506e6b5e3db9c90d7b5b72946"} +{"index": 108465, "batch_hash": "0x83541be7e9899537fa0d887d8426269f72ff2549d9c1a15f9de37fff1a6ad21c", "finalize_tx": "0x18df72945dda4591dc1171f374b807b23f1ecab817b8851ef41be83c4b3c802d"} +{"index": 108466, "batch_hash": "0xcdda84bb6f2ddc7e51fa771383c07f77f2da6770e60a81d631392a575a9679f1", "finalize_tx": "0x52b6a2d3f0ab9def26a914687adc811449b8365c36036cb06648ad2d7e0a53e3"} +{"index": 108467, "batch_hash": "0x41b295e9a1f5bbbc0ee491d376254ef8a3c53bf6477ecc694366a10c1d72df3e", "finalize_tx": "0xa2de9a1a394db9c60af8282228ea77684be0c7837a44191583952f309b86161b"} +{"index": 108468, "batch_hash": "0x5755f77f01a156040fbb9e867c8588f606a6e9da5622d520d641beddd5846681", "finalize_tx": "0x299f9d24a8036e22bcd74cc515c0c1f849e19aacdcd54b217382d0a9b93de6e2"} +{"index": 108469, "batch_hash": "0xafd2571eebe21a556a8888d4e42518e62f6e032f406c3f32ebd013ea766423b5", "finalize_tx": "0xef32a5789c054c47abf4072cda25febefc89a50ecdda5dc47145e1205edb5b51"} +{"index": 108470, "batch_hash": "0xa70e39c2c49ac2cedbe8123f12f4ab99594aed5180687563defc13e757ec381b", "finalize_tx": "0x8b0ecfe2b31569fd0f54b060e0bdcfc94582e4306fb457f1be798fdc388b0e2f"} +{"index": 108471, "batch_hash": "0xe87e6e3a22093cd0be8db5183151db307ca097a7222c2600686d4937325de115", "finalize_tx": "0x6757d54be146491f29405239028b62c96dba581fa0af1951bdc0a070d021c7bf"} +{"index": 108472, "batch_hash": "0xeda9b8b6ddfad345256ddb13ae8a84c7ee75fe8f290f7a1c0fe3649ea27bdc9d", "finalize_tx": "0x8964ca0fccb887c6c6c0f4e95bb35d304b7202f1acaa22abb02e8018100d0ee8"} +{"index": 109653, "batch_hash": "0x5391cc31aebcce814e89111522aee547d66fdf1428e46a461b0781f8800a4f7b", "finalize_tx": "0x728dd6c1e013052ec6c5ad052156ce9ab9b7d9668a40f3bda397bb55cf443f5e"} +{"index": 109654, "batch_hash": "0x800a8d934ab1701d3f7ddbba7ea7a5a0086f39830c3bc70dd84aace92f81f9fe", "finalize_tx": "0x2f5f91998a172ac6fe77781bf20c69c4782ef0b4e492c3491b855a6b0629be6c"} +{"index": 109655, "batch_hash": "0x94c16a5d277e41e4e7096bbbe6544ebaec15594fb03c7c656c7186bf0498e147", "finalize_tx": "0x2f2508426a0b9b627fff0ab39e6566145a8a46ddbcbc61930b5cfda515726b71"} +{"index": 109656, "batch_hash": "0x0c1b47c4aa12918253c100b98ba392694b91e13d088c54672a9890371848d91e", "finalize_tx": "0x4283ea2fa1f13df327cfa8c626e511ccfd23f396b2b43b96e0f431bdd3b2eec5"} +{"index": 109657, "batch_hash": "0x38886b7380980d505239052305c756af3445e8c0255be42e07f081be252523d5", "finalize_tx": "0x4567982aceeedccc5afbcd0e5a9b77a964a81d6482b955b812fb16ecb9bfdb50"} +{"index": 109658, "batch_hash": "0xb6ef6d37b57e4595cb987669274430116a2e3a696d65fc772771663421a9247b", "finalize_tx": "0x097c544216792d1b68b4370028b0bc4cc34845b3aa49c367e6c8446454754711"} +{"index": 109659, "batch_hash": "0x7b568ccc74533f556d94d417c89b7facc11b7d7244082c6fc3c825ede519a8c3", "finalize_tx": "0x01fd6e0fdbfd56c28f705496c5ea2ced5de70593d635e8b2b855ba86500e57ba"} +{"index": 109660, "batch_hash": "0x51ef5a6ecb43bca237731bcd9d39980082d3b96cc98e9ced99a7f0c88bc4a105", "finalize_tx": "0xafa5ec5ba06bb5f5c623754188e0f2f6582ba2d1e9249b5be9bffb1ea98c5c2c"} +{"index": 109661, "batch_hash": "0xa1e4b459cc0a3cd82ef26c3a76a08683948713ed51a1b4a58b67c5bdacb3db10", "finalize_tx": "0x54de014df4f557c3225df07f262846eebaa7e8fbab8348e6207a42583a6565b6"} +{"index": 109662, "batch_hash": "0x9c29ea2146ea4cc47aac64fc42dfe68c5cb8b729cecfb777fa5b877fd56f321f", "finalize_tx": "0x6ed19eece7b376f2bda9404be2cb17fb8a55e75a791c91872d7f189e3e3c76b0"} +{"index": 109863, "batch_hash": "0x9c85dd4fa21dc081b2b8405a50312a06c22bdb594a8c5e7e1edcd5d9cff05aa7", "finalize_tx": "0xffd99f733a4717a36e5f48a2bb858e0b840ad4039f650ace63e7c2cbb4207759"} +{"index": 109864, "batch_hash": "0xb33742370f04e2b5e665944b624898e1a7bcbf81fa0d863154a3ef831acc2994", "finalize_tx": "0x37f09d04981f57ab0cfc988a86f8bfdc6fb2ca9b517624101e0fcb5827eeb24a"} +{"index": 109865, "batch_hash": "0x4c27c3f5bd49c3a576bffa13f7da2a71233a781c042e6874a4bdf8fd2f035bf9", "finalize_tx": "0x61754eae742ad1b37425e12781e970621cf50ea0ea54dfaa8bf5061d94f30bf8"} +{"index": 109866, "batch_hash": "0x76c9a34b6de6261ec8e39ed7556478ff6f4fe955592b7fd26577e95d128f9560", "finalize_tx": "0x0d1309676761614ac443916545f478ff1f9520c3c927f884f1f88790954cdddd"} +{"index": 109867, "batch_hash": "0xe0304b90e1a07961f43ff33dd584eacd08bf451e8adf906f005249db3814f7cd", "finalize_tx": "0x4ade6c17126ea288288cf33bb0b3f7d1afe9afc53ff98015d92bfb807ad06eae"} +{"index": 109868, "batch_hash": "0x8b27c89b49f7731eb287a0d85e76a835f395d38c196b7503e0fa42a64577e40e", "finalize_tx": "0xc9ffa549b42517c9c0f18f4e9f7e2ac0e24339abfdb87f9559ed07a8cfbbc8ec"} +{"index": 109869, "batch_hash": "0x11f233e688f804eb4fe839f73022b466a7038f7ea2851f4a4d47c51d9d6f9890", "finalize_tx": "0x1292f42e1a07f9395b53ef4fff4e99114763691f3ad1b50002f29df418aedbb1"} +{"index": 109870, "batch_hash": "0x182ba0c2b906612e3463aaf68160725144eb4b34284b30b7a899c1a0060ad28a", "finalize_tx": "0x26a8d210fb69a731cd21c1acbb11a12a2bfe2ef98fe5c7473d8a18fccdecbddb"} +{"index": 109871, "batch_hash": "0xaa1fb4ae3eafb1941f28c7f90b365f0159cbd33ae951dfb0277eab06f9fbb104", "finalize_tx": "0x00000127ec5033bafd78e742c9c7febc21b7ca20f6fb246d415dacf69a4eb3e4"} +{"index": 109872, "batch_hash": "0xec40b31b65d4e5ba294f1213c26fa3125bed0c6f975227a1cbc9259fe930d5b5", "finalize_tx": "0xefb6bade34dfb00e3d8542c9e55f45f2442369e2dbe74b41bc1072979e3ef8dc"} +{"index": 111123, "batch_hash": "0x3346773dbaa0fddef9cbe7b9a38d289d419c80110a19ec857e051dcb638ce34c", "finalize_tx": "0xc16d70322958e5f3139d35e429f72bf178532ec0735d8cd6c9402260438db8c3"} +{"index": 111124, "batch_hash": "0xe981cc98e0647651befbe2f9dacb7de794075ffd92c4911d2aaf60693e8c682d", "finalize_tx": "0xbfb0aa50e33c3bacee94a6f6e040f2843d4d481f774c6c6250fdab1c31a0195d"} +{"index": 111125, "batch_hash": "0x26273311bcdd72de267059f21e17511e7cabfd06ae68e56a4394ccd1738a4ad0", "finalize_tx": "0x66d86dedd2c16177314118c5c9e63f4368370748c98c80ed2d0b0183ef5dbff5"} +{"index": 111126, "batch_hash": "0x05f8906899e17df3c50c7b570d736dd9d0a2cffc868df486bc550a806b19b8dd", "finalize_tx": "0x6001d132d668b65cbf2c7f8d69967e820263655af27d8fa77d1b76c8914a36e9"} +{"index": 111127, "batch_hash": "0x9d91158bbd63832305426928d9ee28273f26f172cc45a6a9a3d5c70b8b8eaf99", "finalize_tx": "0xe52761f636f65de369dd563b8e4983e33516d6561c799862a1f5dd6db3515449"} +{"index": 111128, "batch_hash": "0x3ccf6b4c8dcbaa0cb5e2e625e097bf3b5ecca7d5fd2fd871d0f69bb1c4f5b0de", "finalize_tx": "0xe79d848f9511aa35ded7c5209309e804581ddb78eb572d73338118c46877c47d"} +{"index": 111129, "batch_hash": "0x005e629164062df7e69fb73009d6d2e8acb160c8b903cd5e543893ff74fd713b", "finalize_tx": "0x90f12d2a45b50c41e8c68e1fbff46f34a93c082c83616c757f4ab319d4324045"} +{"index": 111130, "batch_hash": "0x4f3bca78aaa73b287631f352ff217b028d2d0dbcde2d6f1ec18ff72d57ba680e", "finalize_tx": "0x83702d48b490a1c12861899134e2451c61c596e6827fd48ed440a4253d52e674"} +{"index": 111131, "batch_hash": "0x5db04a198f341ce62e62151dae7c18266dc45f4142045a6bcb8e9f6e282c6072", "finalize_tx": "0x2b5ac299d831262d254833b14415c689f43746d887e428abee73acfa00310646"} +{"index": 111132, "batch_hash": "0x1211b98f2bd8ae4dadda44d8922040b9d866853f40968fda80b3d874ce349c68", "finalize_tx": "0xc1e9a35f891f4cbaa6f5e876bb7111937f6a7c777c1221975996cf7bc58084c2"} +{"index": 118343, "batch_hash": "0x577fd196b6826d283b944360f953a7e419ff7b4a737f48b4418de96187937b8a", "finalize_tx": "0x76562e435788ae8705e292e921eec2216caa41f9087bbb19c1cb91468f1e55b7"} +{"index": 118344, "batch_hash": "0xa2f79e555b1d4437ab550f4c1c5f88a8158fffb9fbe7aad05584950884a5e173", "finalize_tx": "0xfb77c9bffd6b7c2630c13811b016d1dfd904d73aa3aa69a8d3675fe6a38a43c9"} +{"index": 118345, "batch_hash": "0x57a2bf7b57607ec733b4ad0a7bbf710cb94a9aaee305d865d50586bc2caaef15", "finalize_tx": "0x01fe13a96e24341e272132c2fdab9c5a35e43231d8aa6ed4066829031f23c8d5"} +{"index": 118346, "batch_hash": "0xa1e7ce270bd13f9ffe4d3c9968d7878a399bb61d28929e9b2898b7dc21e96151", "finalize_tx": "0x2125a49b6d798fc68ecec276e48791f90bc539332df129c7b29cff86037f653a"} +{"index": 118347, "batch_hash": "0x8abc4941afb8759d9840fdf1ea6d7f7d5b2a6d991f946f3becf4973d895c8aea", "finalize_tx": "0x6f536fe15f09f6571e9bef8aa41ffbe977b8d71ca3968f7fcfe7636459c07edc"} +{"index": 118348, "batch_hash": "0x3cc9963574c79fb622d0cabeb8c0e249bf8430316b7871498d8c3829a29ae592", "finalize_tx": "0x0120076612d3173be4904ee8e4fead4f1f8bcd6809441c7e5f17074f6fc2b959"} +{"index": 118349, "batch_hash": "0x33230c6da5396544e673013ce1be229684320744f924a88392e90e2f8c554dc3", "finalize_tx": "0x79f966c6caab793097902c16ba9e3e35b0ce523d7a5aade046b1bd398449989b"} +{"index": 118350, "batch_hash": "0x9f7a51e459b02297d35cab499e4ee422913b6fd0ada527c4518fff4dd69f062e", "finalize_tx": "0xc9b7a31d1899c6853edd7c4f927b688f53f5070a300f27577507c7c1b49fd242"} +{"index": 118351, "batch_hash": "0xd42a23649c0f67898945fb4767db5b3967f0330aba41a2d6d426d0389505433e", "finalize_tx": "0x9054ac77273785089b263410c324c24ffaf392459b70c732d77de00efc41e7bd"} +{"index": 118352, "batch_hash": "0x90e57437aa3a565d576dbdd0b145581b61a23c78e9df08a9ecca9b9b7db4c588", "finalize_tx": "0x261af2757fbb6a7af55c8914d0b30a8878ead1296607ab24e603177ca4cad13d"} +{"index": 118843, "batch_hash": "0xed549befff4f53ccff1793b7d175d1a94f876410ee1f052bcb7e24fba7ab29ac", "finalize_tx": "0x0a17907dad3bdc74049a71de12d1b923730e706b90eb43e43e9cf68ba2033616"} +{"index": 118844, "batch_hash": "0x315e7539ceb9b323f476d23dfe6567710ca56190d7a63047d53a4c46a25d61cb", "finalize_tx": "0xf4e26f46b0d512c4ccb5130b29cd33d6e4ff6551e90ee4b15f87ff47c3f5fbcf"} +{"index": 118845, "batch_hash": "0xd3575cff1e388ca297aea4885708bf4ada3ff1c858c8bb73a888e0030ad89641", "finalize_tx": "0x52c4852b4fb4443650f13dcc48aaba310cc8090c12ca06e06bb506810f4992fc"} +{"index": 118846, "batch_hash": "0x65a7d42f423283c0bb90bb6d06eaead81ad19b05f266e0e78037e1cfafee8645", "finalize_tx": "0xaa2d37c949bc27e12a1cfdcc6ba1d751c6e5ada32dd1a26265d42f53994e1905"} +{"index": 118847, "batch_hash": "0x0fe4f995c1fe02d38e521bc8fcbaed38ff35e412ad5917a2fd9b79ec744c1aef", "finalize_tx": "0x55e5019e5c9d6d4d42ba4f71d22273b9515c9a1baed5c2da98a70564bbce5eb9"} +{"index": 118848, "batch_hash": "0x890c9cced4f23908490f7b973a765c2619dcddb0a9fc276d496a06a433f5c040", "finalize_tx": "0xfabd6042ba5e3dda953e4f9a10fa8b40f002af1a7fe9516bdce4a1fff723b3e5"} +{"index": 118849, "batch_hash": "0xbda4c33deefbaaf15d95347ff921bcdcf29da38b90829c48a4941d601f154222", "finalize_tx": "0xbc1f1e6d0738478dfca7fee97d95d1ce20e7cfc1081cd201568636bfb89809fe"} +{"index": 118850, "batch_hash": "0x176290330082c5bf21bc072683b4bcb9108e75e99e3805a31375345da1985d24", "finalize_tx": "0x4731a052869686e2593954cfc60c20b2e6ad90c8388f7480cc3b8405f19a2000"} +{"index": 118851, "batch_hash": "0x71f825eb2c835a54fc6366d05436a1e12d39744260a372e3cfd0f1c25e065325", "finalize_tx": "0x8059d078d909ae467c1cca811995128570697a69f0060d794f44f4f515abdcc6"} +{"index": 118852, "batch_hash": "0x89a44785022b073642b8a4ce2557a56e6833de7eb75bcf9c12b8664ea81e1697", "finalize_tx": "0x7d10197fc1f84c84ca1c23cf55d9a802b48d19a47603680fb5ff5d9a9e6c9d37"} +{"index": 119693, "batch_hash": "0x8a7331316693e75f852fb7fce148178ad08ba171e8c5361379ee8852cc3084a0", "finalize_tx": "0x291209255234733d717572ea6a67442fadb888715bef684e36bba036547e7003"} +{"index": 119694, "batch_hash": "0x821ea4404a15ce048051f0de4605ca0c35976b45ce932f0dafaa35f831df860d", "finalize_tx": "0x40747ce912b85d9a05060f20c28c7e4da11f2c8afaeabbfce053b52ba626ba54"} +{"index": 119695, "batch_hash": "0x831ec2036e6412ad01238da3ec38a366a9dcab3764c89e2df1fbdf95b38d89c1", "finalize_tx": "0xd1f3ba68bee74ec4322323747017a32a5237f1625677fd70a9a2696187cb6b2b"} +{"index": 119696, "batch_hash": "0x5c91ea3d95abddcb5eea567cacf85a1579d006092d8c78045d864ffd9c043a5a", "finalize_tx": "0xe8f61046ecea316a1239c7bedaa6535134bc70d7dfd265549fc95ada28de6089"} +{"index": 119697, "batch_hash": "0x5ef4d0e803ceb2418ead15259121b30541999b37a0cc8cc7b23784e493489925", "finalize_tx": "0x7cf6135a3c96814821ff81b65767eed48b557db83c6d62de9fcac1d99d1c69ec"} +{"index": 119698, "batch_hash": "0x7685ee2cf7a84d71dcde765c89c8e0025413e874aded9ccd6da477869e117dc7", "finalize_tx": "0x56440b8ff83dcc747ae1b544881af2a0a394872d0520138e969d5f0772956ede"} +{"index": 119699, "batch_hash": "0x5b52a3a7b9634038f2f13e44bd5ea9f2399abd53fed337b4f9ac15341d75c24c", "finalize_tx": "0xbc8edb60c6c241c0766d130a05c4cee09976cd254f42820df921b3a704d21933"} +{"index": 119700, "batch_hash": "0xf7114007f7929bc5141bdbade7539d1d63f35269f990b723423c0fba6dfbe70a", "finalize_tx": "0x461b94a76e186e735f00963c0644b297a159e02d8eeda86c454b3d777ad6e4c8"} +{"index": 119701, "batch_hash": "0x45f6265fb693499f65a44c9bd89d8e6a972e0e51d37f5a342f50828fd4edc8eb", "finalize_tx": "0xe7e59e494695e0d4e4d7993de1162f6f9df930dd784b4d0b064d08b9778cbe7c"} +{"index": 119702, "batch_hash": "0xe8d3c74ebb336feae3a1da9e4074063840c11a89ac85c104a6a146fa3037ff55", "finalize_tx": "0xfd22185be0e7c712cdb506707e4c55aa9f02fddf5ef379cc41758736a328a3aa"} +{"index": 121843, "batch_hash": "0x89aa0e6ab8d2345c19522628b8f5b05530c971afc849d4578485060cb1fe9254", "finalize_tx": "0xa100670a527297834c459a4dbf1c183611d02262525f26caa47985bceafd6a13"} +{"index": 121844, "batch_hash": "0x7819ff51143a8aaa72d937e35f881004c5d78266c53c63459e5cb27a7650a4b2", "finalize_tx": "0x7a93bcb3d67c83299a6e2bfda899462a2112b93fab4968ec9d1d90f3ff350f19"} +{"index": 121845, "batch_hash": "0x089661b72557db5c32e121b7b41fa1831b377d8d26e5425faab846963cfe98e8", "finalize_tx": "0x6d80370cca619c6da899932c0f23cc707d10ed7e10e404cb86ae170273b79b33"} +{"index": 121846, "batch_hash": "0xa0f85953e06a080207147654da8ea41aaee607b6e63fdc46072fedc4f87637ed", "finalize_tx": "0x456867a5e11906c4df9639729b36167f3e53d3f44d6659cdcd38bf7943df2ef3"} +{"index": 121847, "batch_hash": "0x0af9d14b41d181535f1047270df79d840cf41da0f6b970ad142129e5c6a30541", "finalize_tx": "0xb80abac712e8276dc128f3944ab064db4887ab9248270340e2577c3525290ee1"} +{"index": 121848, "batch_hash": "0xcc10ea0b50d95c59341caeac0fef36ac1006085b20849cb62833fe4891887121", "finalize_tx": "0x7c7fe5d236538732e0fdf8923b3e818701eeeb72be6dbfc920d7caac8022749f"} +{"index": 121849, "batch_hash": "0x478cb3c95a6fe0d010efc31511de26254cbbdf8d3366bc276e21754f014c539f", "finalize_tx": "0xa7e5ee26f854de1140d304283b60380da582d630b6d25f1d31824a3ccfd1061c"} +{"index": 121850, "batch_hash": "0xdf1bfcbbc27febb49d8dd544ca4ffe2cfe59a16cae4292eb0891c7b4e956810e", "finalize_tx": "0x6cc792a14b4fc7f373529227f689ad98589f4f46bc31866f6dfd7d099ad415f7"} +{"index": 121851, "batch_hash": "0x8797a0c44348c4f84968dd96fdde82fb32059dbb21821c17638a342f25fb009f", "finalize_tx": "0xa811cd49bc77604f3c65dbcf6ce20411d9ee7d65469eb8a69cd1abaa813ea8c6"} +{"index": 121852, "batch_hash": "0xce14e9ac07e98fd20fa87708b03203bba34bb30513254d937a6a8b64dea31e0a", "finalize_tx": "0xd3b865414143c54a609eb79c875d6535c0997c650da0e482c453651c43c0145c"} +{"index": 125643, "batch_hash": "0x68c961bd6d4abd0c88a02fb44ec15f0e26662f5e33aaedd8a46dc85943681a11", "finalize_tx": "0x79b055a300fc016c7eab38a76a18ecb3c21ee03f3cb9dd115d8c9f071838d803"} +{"index": 125644, "batch_hash": "0x3392e042d98c9ce743a40e1e41a10cd1b5f8742b567897f09c95a4ce0678e4c2", "finalize_tx": "0x19ce18e5080bd3c3fe2bf03915369c5ccacfd68454d003474fef8529d2dc9b74"} +{"index": 125645, "batch_hash": "0x91f5bd9bf89cf695d7b1e1194d059f0b260fb1637869865534e2ad2ae4124c2d", "finalize_tx": "0xa6023c6917b287a78f39d4b9fb44826f9aac39c0abc79ab831db49c48e5668ba"} +{"index": 125646, "batch_hash": "0x239e5fb2bd8f6ed40a8b8da3555ce5bb1ee28628cb65167de650734351f1205b", "finalize_tx": "0x3206210d7a6457d1cbf9a7e20b8e2fd5f05f3b397c9fa9eeae679194a8e944ee"} +{"index": 125647, "batch_hash": "0x898363279d343d542d92db16387d70ffe43ea777a0a3c250d813c9a46c5d7df7", "finalize_tx": "0x9f77f74e4e0bc39e20b20f1f2479b9c94c722f55b3172bd05c1e1fb6d49035d0"} +{"index": 125648, "batch_hash": "0xad09c652a16e18f7cb3617f4a24c51293a946552ff9196354eb6f132bf3bb931", "finalize_tx": "0x10e2bd9da0a4c717b35be657757a035d87129c96dd95985230ff9de14ddd2a7c"} +{"index": 125649, "batch_hash": "0xf71bd1b2e9ee472aaa6c26e29f6d0bbe81ee256d40380f19cf6dba45f1b940cf", "finalize_tx": "0xaee99200dc8f0fd6e9e7edfcd95efb77dd415ab56efc12f08755dbcd542a6401"} +{"index": 125650, "batch_hash": "0x625d2526558096627398ee613889822be15b04d6e2dc6cb73718eeee0108d6d7", "finalize_tx": "0x870b378213ab1d80b15461c15b4cb6e2aa86cb9b5a02c325c0cc871ee120a2b1"} +{"index": 125651, "batch_hash": "0x8bdeea7c68cee1c578f5e07ccb55158e9341095e356e5933d97d64bf9334e5e6", "finalize_tx": "0xcf15c41e5de3c31f7196f91862cdc464865aa053f674c2a2c5a650691887482c"} +{"index": 125652, "batch_hash": "0xc534e172d597a1546005b4f4223d2ea0ffdd2930d9f4435c948f8f30801daca7", "finalize_tx": "0xa9726f17af07d9f21596f4c56a330d64b7dd7758a580dac64a26d37624abd176"} +{"index": 138853, "batch_hash": "0x67d451c73cb5bf9b4df67a929d75cd9eacd3549e65f15c4d849ff3022703102e", "finalize_tx": "0x4f5cc761e7362e111740445ecf42fb9a30cee912513c5e4364e6cdea411d2061"} +{"index": 138854, "batch_hash": "0xcac22017ba283106da8186fd7ab827f50d823d89b68e89cfbc360f12ea5bd249", "finalize_tx": "0x971210b9e0409b32f1f432c937e8a05bbfb80d87409038269cbfb0d8053909ac"} +{"index": 138855, "batch_hash": "0x536e45a66d97f0b309b992adcbf79b107ef4ab1dbdfb24bdba3567b22b152536", "finalize_tx": "0x2a373b3657e1da7d64401439819c8a0611563d2639b24d609a200ca159fbee3f"} +{"index": 138856, "batch_hash": "0x3091a9a8260d882c125da50298609ee1c0507bd96865fac622002b182e00a609", "finalize_tx": "0x816dcb76d9f3028be7c4d85ba5824dd5812c5fb9432ffbada9e6e57bdc9c73f0"} +{"index": 138857, "batch_hash": "0x7b8fcf9c7879e3659525749d41f160a2c6621ce333739ae8a57075f2c96570b7", "finalize_tx": "0x67c9153e8b2040605ca17afe803c5dc8c58576a2f6327fa68bbf7985b1b55a7e"} +{"index": 138858, "batch_hash": "0xada47889a2d682c95b0c3f56a0a03bc8df2c15c8b8d0fb61d48d11614bb6c5d6", "finalize_tx": "0x9c1215b58480162e123d813e3427ba69ef268ef1d96f4a2afa030deeb159d353"} +{"index": 138859, "batch_hash": "0x2598a16781fcda16c6b4aa7c99e0fb60b4e7f86cb1afdd0be41dd83b10521f25", "finalize_tx": "0x071b9312d092f12515a76f4492868515db24f9a74c07d4a71ea7de5f8e352f82"} +{"index": 138860, "batch_hash": "0xaae96de9a3514c44fca01ef6035c88c02ca782265e7cdde416e5edce3b527441", "finalize_tx": "0x81dc83ed55dfd9b147fb1ff1a29430d9b7bcbe572a7b24a30491bd9ba89bc99e"} +{"index": 138861, "batch_hash": "0x0e2a3202eef8c7d9cb133ac1a92afb4c7ee5405d95f64b108cc2dfe8370e15c3", "finalize_tx": "0x4b3d64c70e68b6d90fdbfdce142afd423390083b661f8f27cfc4014c4f1623dc"} +{"index": 138862, "batch_hash": "0x15a4aa639416c1b9784a9f359b9a38c4dd079dac8d4573a020641eb21e1b0c6a", "finalize_tx": "0xbdd9b6499c5a672541c53abccf968636566c2520d0491b6eba2e95cab5c79b5f"} +{"index": 143943, "batch_hash": "0x77c41a7e6446fb5ec9648e2a37c216895190c3df247aca1eccb4ae754a36115d", "finalize_tx": "0x7cfa29e1625ef79444bb496a552b89949707549b19e2f081cc1764480a847b21"} +{"index": 143944, "batch_hash": "0xd7935de1e4f1d0c4ad127ce24535d1786b5e929ec418fcf796473e0e371f5adf", "finalize_tx": "0x1015e46e834131d2a08b2dae4387b21bd3221ec142b22385dbe76ec462b4e73f"} +{"index": 143945, "batch_hash": "0x6e1e5d850c1d9ccc626b1659cd6197298bd7939c96352635679b59ef393cbe1a", "finalize_tx": "0x1fdb96a8ca1666754572dd4a87fd59379bab35ddc4b0e004cd9b480c406c8e68"} +{"index": 143946, "batch_hash": "0xcf709ab03e26beebdeca2f6d2b92029e1b8e37373bf696b8f145807914a3728e", "finalize_tx": "0x7ff4ac92a1469334a211a79df97eb2dcd062dec107742f440b182c7ec4dabe66"} +{"index": 143947, "batch_hash": "0x0df6fbe8264ea7941f41a1f04cff3188ea494cbec2d99a14df3bb4d9472aa941", "finalize_tx": "0x149122921c6399dabf05c7e0502db8cdec7a7a5c9099f682b2322968cdf3cfb9"} +{"index": 143948, "batch_hash": "0xf00561304989f798a1cf63e2bb0387aa7356e6b2879d0f74d6151aacb40ec3b8", "finalize_tx": "0x3e4adfd017e01295780034022da1708b8771f8f897332fe601f1e7d273265456"} +{"index": 143949, "batch_hash": "0x64530c0099fea9669899a5e4a915029b250a95e57ba83f5e90b2b10b5ef634a9", "finalize_tx": "0x69c9b2012cca21ee998e46ac40b93d524e6efd92c19179d313e842ad891857c2"} +{"index": 143950, "batch_hash": "0x498944fcb7a8715c863f6dcf9a3a051ca2c325ed575444a340030d4f37fb05b8", "finalize_tx": "0x072ef2f63770d57688a9d38a654e0a51120a8f4922578acc15c35a86ded817b2"} +{"index": 143951, "batch_hash": "0x24f745da1b336a0a18d8dc5ae5c111f6dfb555eba189ab2d249fbf109d4a8b54", "finalize_tx": "0xbc3032140d958e965c7fc7bfbb9223eae65c8d1a951400f162a4cf8b3dea94be"} +{"index": 143952, "batch_hash": "0xdeea39195d1b6a0b96cd7e97e7704d1268e811e053665bb75b3f5baeeb077ba4", "finalize_tx": "0xca4a8a50e6add732348a3502749e3e1a54160685bebb6e89fe8e0426bac50321"} +{"index": 144023, "batch_hash": "0xa189ad0d3debe2e5c5686e7c93b64f807d02ffe8c96fa87a0df6d59659ee823a", "finalize_tx": "0xd1bad9e3fcf5517eabbab16095c0660287c708cc7fc9676245e6aa6b8de9fbc5"} +{"index": 144024, "batch_hash": "0x20c6f6fb71a374e82c7fdd569533d5013ab1443b41a43a8ebc92fa6ffb785cf0", "finalize_tx": "0xf6d4787e0afc4c54e447fcb4db30da0522afb263af89e36885903922c3963a7e"} +{"index": 144025, "batch_hash": "0x7b7e5c8aa04debb973b4e6a2bb2f09f0e17093fa131dd9b07515b91565ff255e", "finalize_tx": "0xd5a6bde33c703dd92057b3183cddfa6bd1d1c380bf8965f90f97530aad16cd79"} +{"index": 144026, "batch_hash": "0x1b8d12d9527f8b407a10a5627120e75b45e41c3100666223c1573f76c547dfcf", "finalize_tx": "0xa5afa65700fdae4508bb1e38653b1e52bb69452c6bff8ac31b38c76c60bb6933"} +{"index": 144027, "batch_hash": "0xd2bf3b3f2249e42e6c78c84992d015adf89b2ed72f33960af02f0704b30549aa", "finalize_tx": "0x0f20b3e49dbaa501f9ecad5f2f2968775b49db82c30cfba93fe7f9f7ca201797"} +{"index": 144028, "batch_hash": "0x951ba921502491252b384af155d6aed2b6de068fa9d6b093080c03177e74dda4", "finalize_tx": "0x789505d16370e10e4d74a476976b76c2662bda0a0f3607e89b480aa7281d4b87"} +{"index": 144029, "batch_hash": "0xaf26f4d8775c27d3d3552f35afa88a97f2837648132a64e403b7f24474b18ab1", "finalize_tx": "0x37fc01dc566bbab394583c7cf3670b1bb470ec761a39ef668792a2af5b559a9d"} +{"index": 144030, "batch_hash": "0x0f46c67252b4777d2ec844ddc927de17597b48a6229ad6dc03122f725c0b793e", "finalize_tx": "0xea9d43813406da51c8092a08504a68533fb545283aa93f3bd10005267b6a83c9"} +{"index": 144031, "batch_hash": "0xd1369a3e4ab4bdf911646c5700dc8a968a6328bde01eecea3625fe5b7102b564", "finalize_tx": "0xe1846e6f7d013d2b117fca32be142524945dc14532f35f9939c1eb5276d03040"} +{"index": 144032, "batch_hash": "0x62812ee2e89949f9977cb079d6696bb301fb5836fb7c94064e7d1be343d3d29c", "finalize_tx": "0xaf6d01e67d0277838dc31da1a271e61668a888f67ddf4ff9f1435847ca62f70c"} +{"index": 146013, "batch_hash": "0xa53f6419d58032b992ab66f75180d5249c637909ffae36dd34c5cbe648304f58", "finalize_tx": "0x45d3e6550d05451ae6e0ab1e5034427886977024615e94e872b5c7f6daabfaff"} +{"index": 146014, "batch_hash": "0xe45cf4bed12944928f08bbb0023f0de60b6538299545132a9f3f5e18d5f4949d", "finalize_tx": "0x2ce01fb9de36dece91fae9b9aca2e689b9835ca1122c1dd42ad048760e3bc575"} +{"index": 146015, "batch_hash": "0x1ba02d7c2a28c75d4af94ef3f23234da16f3c94453b3630c359bdf3dc824b50b", "finalize_tx": "0xf7b7bd59350b73e70ff9377ac04b6d373b90283cc43cf675f0847484bb66d195"} +{"index": 146016, "batch_hash": "0x9471350ad2f1bc00cd61b10f64bfb825006c7f399fa9479a46648cbd666b9dc3", "finalize_tx": "0xfb9cddd117ce99f4edaeb602387b0bacd9f6d08e91dad602bc5aa2d7ae29a0d2"} +{"index": 146017, "batch_hash": "0xad95592f740c437499e3c0e5071fc2dddf1b76637879153a3e63bbbd4dfe57df", "finalize_tx": "0x6ecf0b54fca09fe662513ca6472f0f9b455cd91181e78a45502c9763baa2ffc4"} +{"index": 146018, "batch_hash": "0xec65317520d601abd36b580770c36151c77e3febcb9901bffa81cf269c592269", "finalize_tx": "0x4c80cd7edc12ae169043333ba29e28b69692e3c63d9e6cbb3fc70b2316d5249d"} +{"index": 146019, "batch_hash": "0x966118112e39089f8bae223f8fd4ce31fe864f141d68a7582c3346044f9f37ab", "finalize_tx": "0xd28670a92773c7d8a0b8d8123cd8fddf77ae583f36bb7639905364c49388c1bf"} +{"index": 146020, "batch_hash": "0xe0f8f461e3746677e8a9e7e76f19b201843ee3b684b347e89cc4c786e90861db", "finalize_tx": "0x595d616d17189e60785b5bcad1b9054da8cfe1213a82fe1fb225a235ab5fff5a"} +{"index": 146021, "batch_hash": "0x22103c23ad1934f5853fa29ba6db1e2cedb30f16476fe217f5b9a2ac5043d7bd", "finalize_tx": "0xcc9592f6b40413124223ddf1e646d1eb320d8213fee8c83c261c2a06baa0a8c3"} +{"index": 146022, "batch_hash": "0xbf922479654117789a71fc1d8794057c16bf1c992707b3fbdfb854cee1105518", "finalize_tx": "0xdcd3f98a275a9ac2f2b791f4d91717d756fb53dd77e2c9ddcd58ec155ee08069"} +{"index": 148483, "batch_hash": "0x1db0cf9847d27eee095ae9f2780b52645aab0cd08e4714013e7b9f5d42705e60", "finalize_tx": "0xb6f8b1754fe65e1b8d6c276d7d5b5a741ba36eefd56b12cb1dc16a5f969d9557"} +{"index": 148484, "batch_hash": "0xdf012ec92163f3d2aeb27e8baa607eebe223ed8b40c71e8718e03deee7f6c225", "finalize_tx": "0x204423b5a82774fdaf11d396b51a4eb95013198e1b5c3d7726e2fc517774c662"} +{"index": 148485, "batch_hash": "0x774513b8a73988818e3f4366403beba913f81bfb005c69d3084eb99b22ff005b", "finalize_tx": "0x626e72827d64d20ccb2ad04ddc924f3da6a6995749b0d87986e833b74a2dfffb"} +{"index": 148486, "batch_hash": "0xdd2295d5c45d779c0cb04d4029b7a0f55ef6ac852d6ff257d0287665ddaa08a0", "finalize_tx": "0x1b734516b73e53fd3a24a4d9a24157d68e50bbf59e2dc19280271fb89642c6b3"} +{"index": 148487, "batch_hash": "0x6a7a98b41f0f77568730d03cd417a331ab0717e1426e7af401323918b874cf40", "finalize_tx": "0x54ce004db4c1f93d859724f3d801b4ea6f848f4d533bff965ebc6ed712174697"} +{"index": 148488, "batch_hash": "0x5bf6e408e6f93bd659090a3a0ea280b415b33668faf1a74b78b910314a31b272", "finalize_tx": "0x680f676fb898ba2469d7ab3cdbd60947d10835dea2801740e05cfde2cfb40fd5"} +{"index": 148489, "batch_hash": "0xaf9955d47bffab0d38b1b29d3197e5160bdd14b48a9294c62a16ae5402e8afa3", "finalize_tx": "0x1329848c49f1daaf29523353777e188cc36a3ec938904915bf6e75387e233c79"} +{"index": 148490, "batch_hash": "0x6a76306ed05877c82e0daeb5f4feb69331ed1bdbacee4d28f5ba2a702336b90e", "finalize_tx": "0x0861a7b610bf3c143ea51ebfd123123da6c9499dce21b5552336220926e9da13"} +{"index": 148491, "batch_hash": "0x85ba38731c849203ba1006ce43ce2dfd40293204beccb77051fbbac72c5cfa9a", "finalize_tx": "0x8e03fcc35432081db21c435dfb875dd4a9e6f6733dd36464439732af81bda2aa"} +{"index": 148492, "batch_hash": "0x7799b1147b19eb6aef7db2201bf47e6eb42c5c570d0e9f5f55457dc6ccb2343a", "finalize_tx": "0x5240b9ca4166e2199b223a11befef490ba4c0ce8148de7f0979219c034f70f61"} +{"index": 153583, "batch_hash": "0x22f811b07ab647899284eb37636a87b817254e3c9dce892c4ddacea7e8f9c6f5", "finalize_tx": "0xfa6c6d7d13e7c2f676881593fe14d9906b08a71df48e8665352c387fba6d962a"} +{"index": 153584, "batch_hash": "0x45de76e6b64bc0fb50a55c21afd5b9e394f6735fce49b22778dbd31330eba368", "finalize_tx": "0xd34b3dc667acc1ad607a57050e3195a83933b9f9c7c812e255c043d6d3d63ba9"} +{"index": 153585, "batch_hash": "0xa03a0ff2d1a728f437c95fd5309b06dc71d278915a16ed81c47d171869e6d823", "finalize_tx": "0x93760beb1a01e3e014c89beaa34a458e6bc8f0fb4652bc1d7296d007ee7844cb"} +{"index": 153586, "batch_hash": "0x0416e6ab688b4f4eb72db7d375100ffec3383f35e47821618d1d1a75f704f92d", "finalize_tx": "0x8f9af02c7bf1aef219a84dc71d64f89b92aec72e817794f22dd46894da7d9dfc"} +{"index": 153587, "batch_hash": "0x66123ae6159d4f5ce8abe922e2a8af5a6e4af40d159e582f12d447f7fb665834", "finalize_tx": "0x1844ba6fd275ec24b6d33f765e0a97e6596a13769bed9e29ca6b99ab4baef069"} +{"index": 153588, "batch_hash": "0x3f57fe5a5b8edaa60a1af544798fb50d748f819a386f891e0d9b65702f1089bc", "finalize_tx": "0x98db9ae9952716a11b328e2eb9b5f0bd50a0feb2200dbe4d3affe8c4c2d90896"} +{"index": 153589, "batch_hash": "0x2b83f575973a59ced9a0f1d6859e1eaa3df3c9c3effa1aefd8bcf286ab9eba61", "finalize_tx": "0xc615b532bef8c45519ada544bb51bfcb8011bf486ee705c443ece07d3e1bc9f1"} +{"index": 153590, "batch_hash": "0xd2ee93ee7bb7424ebb165830cbe350f9b43152419c5234df8a04a08fb4a461fe", "finalize_tx": "0x142b9f8275e05cdc6be7984a2e6ecf3680d246d6fae338d46d550d4b5cd7d135"} +{"index": 153591, "batch_hash": "0x2cc50dc777eac5f49efe6198c8c6cf5ee73c3fee78a48a1b69ea7dd8ecfbcf4a", "finalize_tx": "0x73f85d01d397356d7b551f871e668c34c476eaef351d61d03b2672297b48083e"} +{"index": 153592, "batch_hash": "0x5d91dfaed3c4a4162590908e9a45f58575a7253a2c3f5e87847fbddb004f77f8", "finalize_tx": "0x363baaad020c4c6b7a97fde2531edb91b6e472f4129fe68460d479ec5055a28d"} +{"index": 153993, "batch_hash": "0x8e61aebf4f033d7b3100134a31328b08507cdef838fca014680881bfacfa5c55", "finalize_tx": "0x01714c425be85ba89f09195d7ee3a66cf45b1fb4778ee175d6b85087e58a2110"} +{"index": 153994, "batch_hash": "0x4b73d237cae3128838b7bb161cf1019d22ddbecce3c670842ee242278c6c9d0d", "finalize_tx": "0x1d96821da38ffe1269a453106e3433adcf8f3bd92b730f6166770b6d2fa1621e"} +{"index": 153995, "batch_hash": "0xe5e51da11b2cea222904409ad176f380f42dae765e93f75dba4f5558eab493e0", "finalize_tx": "0xf55a4c4b1c83483296ce9ef23dbd67fc5533d411792081e43acf6c1ffe4cb6d0"} +{"index": 153996, "batch_hash": "0x2e00e106d995b49336354633e6b592c75e039300376d6fd401ea6f2a149f2021", "finalize_tx": "0x1b02d16439064ff4db0fcba0e1104b63417a372168505db7141e257f108f6d3e"} +{"index": 153997, "batch_hash": "0xad008b6717341f84bf5c7371463f96d5da9db30c2cad49628bbc62cdef19a12e", "finalize_tx": "0xadc9fbdf8bce8ee849615696a191930ab25c69dc4f42f84dceb91278fb549fc0"} +{"index": 153998, "batch_hash": "0xf27e85127bd616745b7043ffb3e31c8249cb90ceda7aa010ccdeb6df011bb014", "finalize_tx": "0xdd952c4253d3195397e83b92696e549c6e973119faf4715f9b573775023be085"} +{"index": 153999, "batch_hash": "0x3916800655bce31b28fd04ba1a9021bad0566669bf652c8f5c3e35fce20dfc41", "finalize_tx": "0x2d7588ac98f040a26bd0bf0fa7224ff2f6ae08347d5fd885c079b09ae73dcafe"} +{"index": 154000, "batch_hash": "0x019aec56ce20179211f06c7b303bb0caa4fcfe973705000d40ee3a3a7afb2113", "finalize_tx": "0xd5b12487e139c48f7b3b7be75f15e77f4b8473734ef17fe7bfd15b99c915a3c2"} +{"index": 154001, "batch_hash": "0x09c403da97a196211f64fbdb9a93042d4d60f638172bab1cef31f620cb81dd7b", "finalize_tx": "0x6dc8f3b0fbb76590d7056143ce4451767ab9880fc332b0eead4e370fced3346d"} +{"index": 154002, "batch_hash": "0xe1f292cb50b34a6f5030e8d3fbe65f9f05ea182afa1215d2a23dcd1a672f524e", "finalize_tx": "0x26a64832e27bd1e8330db96bde96e93a627ebcbaab0debed3ab78d5eaf689521"} +{"index": 155963, "batch_hash": "0x6fa0a57c2ca668ae8b6429de9b885569809019122873544f3d6213a1afcb37da", "finalize_tx": "0x205004dda1e31ab50017e9dc96af731c9157c6987b9d4ea3af4bb07f17be94ee"} +{"index": 155964, "batch_hash": "0xfc9a2557652f137a2b3d21b3fff30b97889f3646fbac167b5b76910c0c28af58", "finalize_tx": "0xb66ad598439721950c86f5cc2b77e5c7a1c32fcf2894cf23169591710d007525"} +{"index": 155965, "batch_hash": "0x3e6a4427062ee3b3428afdd218e4d163ec14733285a7361cecd0b69101b051a0", "finalize_tx": "0x4a91a50902b0c3c7b1cb82384258fadba4ab2e378a8693acf49b91525d4710a0"} +{"index": 155966, "batch_hash": "0xe28eb67e783083d775229794f2c8ee800638e56827b8f9457fe40a80bb5952c2", "finalize_tx": "0xac7275cd96509827db08c24016b02f8d4a4daf3f9874cc507c4445b06501c356"} +{"index": 155967, "batch_hash": "0x8910b246ded56979146e30a693b7782193edcf4d2737d7e6d5de7d0823cc5fcc", "finalize_tx": "0x8709813a3cd2d640978d2b64b102133daf6334b2ae4f47ae8eae745a49b5300a"} +{"index": 155968, "batch_hash": "0x17803150b8811aacc3ae6a439da8e7d7a44ccd0d2a430699357f17c4134f652a", "finalize_tx": "0x16def2784fde532b351b48b011fb3c5dca7d7c753b0654ae214dc3cab9cd4440"} +{"index": 155969, "batch_hash": "0x798a815fc313a9daae6eedcf788748bbc5346f5c747d1691485f356d9848638b", "finalize_tx": "0xb2a016bcb4f63208b9df68d2257e0adecb6dba6c0fc9244741fa89682ba61433"} +{"index": 155970, "batch_hash": "0x0840aa993e3352ec8e1f8f6299243b0a72026d1614bf82acbb2adc6fcdd81759", "finalize_tx": "0x48707c2b27e36b94c332e0c4604f7dfaf19870fe4e3efed4ec53aaa1e03ab453"} +{"index": 155971, "batch_hash": "0x52ead2361d6ee87ac0c26cd0128bedef23b59b2222654c7d96bc2393bbba210f", "finalize_tx": "0x0d4aae84228ea3d6bc22659b5a5880dedf021d1fd7c89f5845fcbdf6e86bbe6f"} +{"index": 155972, "batch_hash": "0xcbe02b593e312d8dd15d02d84ec3f172ad500d74b8bbca969f457d499769e3b1", "finalize_tx": "0xe4fa772e2eaea7028dabd3a1c118cfbd77084e8c16dd20008191c05e45b8b0ed"} +{"index": 156513, "batch_hash": "0x068b8ee8e7df6483113e4bbceb1a21a4e2732e194cb7e7bb26e82740957f3961", "finalize_tx": "0xea1314cc656ffb6ddb0b9ec63be58e86694ce9f2b6c06e4f9b92b2c114e36cf2"} +{"index": 156514, "batch_hash": "0x6024d7a591a19c4494213dd16b64e139ed62c6e86e8337878d27769f8ecf1a8b", "finalize_tx": "0x0e41622779db21ef1f62ba53e42c182bc4e646be4b668bd83a2fb69e967faaaf"} +{"index": 156515, "batch_hash": "0x674a8f450dd9409854f2cf066d2ebefe6931965e36ef2b75ed67e1c7867d4a99", "finalize_tx": "0x18b3ca59f14f6a81bfb130d283620a926331c688d71fff5cae0d0120b21baf66"} +{"index": 156516, "batch_hash": "0xf3179eb64a3fa9454093b6f02bee2358725683de9be7b1c684cbe1e7f66fdde6", "finalize_tx": "0x8f106d441d10e1118a5cdc21b2b3489a9eccbb356a11c83790b53181e780bb9c"} +{"index": 156517, "batch_hash": "0xe2b6edfb4840d3f89a826ab5b2babe8946e4013c8b4cc94ded65b7b48ae48710", "finalize_tx": "0x2802bb1ece88449a256ad1e67f2a84e696b5d04cf33a37938682b8d392ba8604"} +{"index": 156518, "batch_hash": "0x68346a8edfe2aa0a459f1b3a208c9e933d88a7d10fa17cde302d177049934d86", "finalize_tx": "0x1900d2466f4b60214b4f92931c28335fd36a286f82f839ee9d9432ddc4f2eb02"} +{"index": 156519, "batch_hash": "0xad0ffed678d4c2635846491164841352a422e46cb5708ec75fc48d90af5adc8d", "finalize_tx": "0xdcbbbdb27ed6db30b56a014bca9067f825232e8ef7803c22127a53728d174af7"} +{"index": 156520, "batch_hash": "0xb062d48f34ae80bf644254e0225851f29d6ea707bddca3d420ea77bf20276fb5", "finalize_tx": "0x1813b4dde7b1c15bae1c94fb7c2fc08e7e475c4beac4da759d1c889495ae346d"} +{"index": 156521, "batch_hash": "0x0b0bade5fb37f8375b433bc253241c27d7a3f4be77a0de9a91ca06223914c14e", "finalize_tx": "0xb8fe8de316b7c18e0870e85e290d4d3f8a2706601596c87058ab80fd1873f690"} +{"index": 156522, "batch_hash": "0xa16bc536bc81b6b304ce73a86c03f90ddf7575c99dd6c32cce1578bceb6145a3", "finalize_tx": "0x1779034520fbabfbd31c0613bd23fb4e8d5e7434caf18346aed3fab9cb3deb5c"} +{"index": 160363, "batch_hash": "0x71cebfe68192debf9a4001ee47de36c7b029667a202410d113cc2b598f9e4484", "finalize_tx": "0xfb809eff8701961e003d076d3fe5fa4fac97b18db1b467ce93abe5c5f610d5e6"} +{"index": 160364, "batch_hash": "0x18399a5a724e1806fd2c3f8ad0507076dcd0395a53f49dba6d7726b81a8c74ce", "finalize_tx": "0x5086342cd41bc76063382ca658d6884a20104eae2ac398b475340d3d0dc93a67"} +{"index": 160365, "batch_hash": "0x9aa71f4cd6fabb7b997e2e4ee921ccf81a924ecc5505dc5770530a8b4e6c5f5e", "finalize_tx": "0x500edc5b69f9d342964310c42f6875822dce9f3e9a37f9d0af96634fc85c4623"} +{"index": 160366, "batch_hash": "0x337f5bc921447db8a8b76df49b169f6ce2854e887d9fbc815709e13d5187afa8", "finalize_tx": "0x40a0601fcfbad376f16aeeab7831bd567b6315f82a685c2f13f66e9083de36f1"} +{"index": 160367, "batch_hash": "0xf839c60910b200e4a69e33d27957424a784404bad423f78b84a7571c94ba2e0c", "finalize_tx": "0xe604e13a126668af756090e3891d0fdcd102421c9996d3e339e2903353015c15"} +{"index": 160369, "batch_hash": "0x03bb46e849a1da9290ea84ab118cf020698b7f58d701a17c2c6f9bbe3e5ca86d", "finalize_tx": "0x3b5e086640eb897a895d412b598f4f6ed07a1b40e7c6d640c23d65e4c419aa83"} +{"index": 160370, "batch_hash": "0xea424b1522477fa99ecac4081e4911d6fe50a790f1596b24ae55a26f9b19a59a", "finalize_tx": "0xd0c5d18a1fb6268b4ab8318ca93282ee35ec5e2b8d0b8144dc0a9e361f2805e8"} +{"index": 160371, "batch_hash": "0xb5f21dc5cf91e2c4866a7c43085ff70b6bc79665eb2a89bd29c31f7f2ad5682e", "finalize_tx": "0x621e2d07c7a61e7dabd58f5b10beb1883b801735f2187787b5b397251b87e994"} +{"index": 160372, "batch_hash": "0xbd78180018d633fa9bd0b90302878c2ab4f17c0a8382acee4a09c2000d1910d9", "finalize_tx": "0x7ce02cac910b8e9afbf118b3c18cb6701371072da38cade6e507e5a6f76b9563"} +{"index": 170623, "batch_hash": "0x48adfcd91bb16bfac65a94aa3dab32c5b9124d60a8563f9e4b8d906b4a1860d1", "finalize_tx": "0x7cc0e22cef5a6b8d5196e30af79066f54cbab234b8ef95733287b2bde8f1236f"} +{"index": 170624, "batch_hash": "0x01f71fc83b2c935b72537a70654c70bd34b7e2a17662e5bc0a5221e6aa2369bc", "finalize_tx": "0xd212eb3251918142ff1593eba92ebdcf789d8107b1c92a44b62d5786a880e768"} +{"index": 170625, "batch_hash": "0xf7a90fac29c216ab5016cf19613168a8a0030df9bfc50f01682761338535201d", "finalize_tx": "0x7046b144c45e6a500f9dd57dfb847c338aaa6bc40f52b1b35111a832875acc43"} +{"index": 170626, "batch_hash": "0xa86c7d1cd703fba0e3a943aa696110b3733b47749277a4d230b750323f5e48d1", "finalize_tx": "0xf0bd22390a495a41db7e29231a68c667105a9d57ca068f93ade3986023f87357"} +{"index": 170627, "batch_hash": "0xec01174a5fc4e5bfc374060fedc39b0353321a87a876a781a4c984b4781cb74a", "finalize_tx": "0x0597d8f52169307336e75adb7bda83a5dbcbfdd8cf863cec5330b6a5167c4ed4"} +{"index": 170628, "batch_hash": "0x3dafb6dacdfb9f53ac58d28e9827e7b55e2724a15ece14928cef826bdb5f4fc5", "finalize_tx": "0xb898f7a072ddbffe1846886df0ff8025dae79f9afa48d75ef9480e4c2e6ab4f5"} +{"index": 170629, "batch_hash": "0xe0b5c6ad86a8933b15800eea2d64e5fca181fe66fa7a1355a7bbac5cf879baa6", "finalize_tx": "0x6b4dafd3b3226c01f929653e901320b036663f897423fad573aec4aafed01497"} +{"index": 170630, "batch_hash": "0xba49b31548d9071440c7e7d98e478f2e78494e25c70382777160d921b917d2e2", "finalize_tx": "0xad8233788ab4bd4376674907fda4b758fb3064b4b8f470fc4c95f2b6d1c30622"} +{"index": 170631, "batch_hash": "0xcf90b67d8c5cecf558a60263c9faf874ede2660de2f13a8153a39bb1e017dae0", "finalize_tx": "0x85b1ba93dddd4cc5fa5f63fb09493a95187bf51883e73fcb53223d5a9544f25f"} +{"index": 170632, "batch_hash": "0x67868a0eed6b4f620da34e9824b18b8aa6d9f79790145ecff8517f35be9a7c55", "finalize_tx": "0xe51cb253b962c7f4e8088884141adb03a3634a9193e25f982f5bad69da5a7e52"} +{"index": 176353, "batch_hash": "0x6ee6132d9d9e2839598639f0a2fbe2078cb0b2a37efad2fd69721ed6fabecedd", "finalize_tx": "0xee289fe445a7c1689284f54a262f17d68537d1f2cdd15dcaf9dcbd9b2b1319a8"} +{"index": 176354, "batch_hash": "0x40a311bb1cd86c2b908cefa2bae7da95fee4c8886b5368090c6763df0657a555", "finalize_tx": "0x806bd9a0d20a9c11eba66eaf1766d47fa0c60df83f03276d2917d2752e37c34b"} +{"index": 176355, "batch_hash": "0x7de908b72a22aafa60583e1a1613efc9532aac85d9b23748df6470c587f2cb5d", "finalize_tx": "0xb76446f7f1be1f79c83c46254431099d094b498b2ad6404d69006023dd720816"} +{"index": 176356, "batch_hash": "0xddaf3f7d0074f6f924785d7c451eb83352f468e506b18b40998cf359475ec7ba", "finalize_tx": "0x7cd6e67180145bb73eba174e149afa981fde2d3f53d9a1639ab4bd38aca07fa6"} +{"index": 176357, "batch_hash": "0xaca2377dcf2b2d67c93f11072493165f6e4009f6b1f9d92cd70e9773d210a4b2", "finalize_tx": "0x3e473c08cb0b21c92db080ab1cea2d956d3ade77fa206f19a2beb7169c7ae0c2"} +{"index": 176358, "batch_hash": "0x143a5d774fa4151d87ab80a552025f886bd92d32b0109d4f2c1518e77b900cba", "finalize_tx": "0xa61f65089cfc0fce42d0976b72822a4f706d09e5bf8b0af0cba7096d323cd607"} +{"index": 176359, "batch_hash": "0xec360bf91adc16de820cb868d511b9747fe9d43416ffba0f97c21086f9e0bd7b", "finalize_tx": "0xdf794443e8683e20bec4976e7182b388c4458def9d36ed23d9e710088d7062cc"} +{"index": 176360, "batch_hash": "0x27490a1a078bf3c101fa5f87e1bde9dd70c7d1b44ff2ec7d0a9373c3952c9488", "finalize_tx": "0xdd42ac9bdc4fade0ce8afe59001a1d4467743d2a73b8a184a196a076f6f70b64"} +{"index": 176361, "batch_hash": "0x932876f3e82ba17ce2768f95b1636217736465109c0fb938d960ef2afa426f8e", "finalize_tx": "0x652cf32de115d3ff258a941543dfe708e1664bae8d9ec7e743a3beda08cb6dd9"} +{"index": 176362, "batch_hash": "0x21bddc89a6fced07fee9b5e6bbbcc90507bad6ce21e247694d4b21323fea8241", "finalize_tx": "0xfd2b94b197c747071b14a57d9a47d595a68284c89e52e7a04952a937d020e2c7"} +{"index": 182903, "batch_hash": "0xab7fbac4fc9d428589aa3ddef5ccd178a07efe193b4f97324c7f486f41f678ad", "finalize_tx": "0xcaa4a6502c0e1827fe7b9c0b2f275f070940be6bd14791ea720005b454bb7d36"} +{"index": 182904, "batch_hash": "0xcc50698a906629664b46a1abefb1b702dff6f326f3e5bf21fdfb70cb52bd0bc4", "finalize_tx": "0xeb11d07f4d719e15034d57d3719a29542a622704bd3c749ab3f4f7ee9cf86385"} +{"index": 182905, "batch_hash": "0xa0cf153c4361f62d508dc5fa20b97c1040a62413929f22cea2c0a376ed1c158f", "finalize_tx": "0xa2327626e8686eb68d73810ddaa824d4031ac01b35fb6c68c0d5439b5593a134"} +{"index": 182906, "batch_hash": "0xe67fa1137f8c66f1494d13c7442969b30fbae93a961d24d66940d99b81d0379e", "finalize_tx": "0x50168763e10f7d8afe566fdf4b0588353c4cc0fc31350e9129bb91df045c1c31"} +{"index": 182907, "batch_hash": "0xdc11e94aae33921518cd3e516dd9a230d0ee98ec86d24accee78b5813fcd7561", "finalize_tx": "0x7e79a05f1a45cc55b71cbc3a311763398b30366458500ce6cccf128cc54486b3"} +{"index": 182908, "batch_hash": "0xdc15472aea7ed23399fae47af6f49cb18871e98139b325631a4303552cd8d298", "finalize_tx": "0xe8eeec63fcb062a0d04aa70e8e0376c0339a1164aedf10794bc95f634c613e26"} +{"index": 182909, "batch_hash": "0xcff17215612fd7a77f3064ee2ebe41c1729e343dc41c7a96351f93a79df20a13", "finalize_tx": "0x9c9adf6eec11cbddaf97249deee07a7fc4725106a3ec5ea39377293f5d1a4269"} +{"index": 182910, "batch_hash": "0x5a46dc4dcf6b83a0fdb5f63f5a3ab3bf10e3d20bc2d63d294c9f8b6779aa243d", "finalize_tx": "0xa209e590f6ef8b077d192941cd4c64306f0099aa096cb9a4624a6a1a48208173"} +{"index": 182911, "batch_hash": "0x0cedbab7864e031c1729948ef094d47888098e9c974418b628e00801d26618e3", "finalize_tx": "0xe36cc3ae7da48e66a3ab3d0019bf65a87197dccf4e2ba80435abab3a87402941"} +{"index": 182912, "batch_hash": "0x3677e2b02129ca0a0bb60fbf40d21d9028bcc43a5de380cddf07253b7c95e8ca", "finalize_tx": "0x9eda9c5a407b5705efa7a7cab0aa4ba26ba254ee1bc04d8dc2fd7b6357aafb28"} +{"index": 186603, "batch_hash": "0x36796cd5a71fafb1ef7c64514927db547684e0eb21594763006de4be5d656744", "finalize_tx": "0x73c28a0850486bd7a7f8c926d59b5b9ae4c85f4692746986c66dded0966b14c4"} +{"index": 186604, "batch_hash": "0x837539353f02de8cd5436d5ca6fc8e8f44d7c278cfdb0f4ab173f6d64232dda8", "finalize_tx": "0xaeb76890d3cb6206026fd43df0919623859b0734560c8aba45b8928dcc6067e5"} +{"index": 186605, "batch_hash": "0x56757c31b45684eed0b23600b9db9c29c0b7e6b1349a8ff5b9c3c09a78e82c70", "finalize_tx": "0xc50318cfa7433e24802ec21df8be22e2a24270598d9f7fc43be95014692b6b2e"} +{"index": 186606, "batch_hash": "0x27c61903b39992ad167573a743184c1cf2d1c212e76d6c6fcde4f09cae064a1a", "finalize_tx": "0x7285ab36fea821b68c0b4a2db5eea7a66fc9c14aabe50c5df817a32aa11d5715"} +{"index": 186607, "batch_hash": "0x99a5acb8e5bfdc9550a965318b236c904cb5f5e9812ade00d74f2c1203efd60b", "finalize_tx": "0xef72e9b5e72799360f86b357afccc9f79d444b21b626ff8ef6cae9395597d605"} +{"index": 186608, "batch_hash": "0x1b2cb4b2f924af0323d53aa9556d76463b1c1a776c6e0b89f97ae4553815cbee", "finalize_tx": "0x7f3ee6ffd335acbe0b48c712e13cf58b2e33ed44b48a7c73e421a423eb64b8e4"} +{"index": 186609, "batch_hash": "0xd3efc9e90e4f846ed51cc2c785a42a17c75800a57de8114efe1f13f78b4577c0", "finalize_tx": "0xb20d5b37ed479c73937836bb8141dd98fc14c6935c7022e5430bcce4f1574de1"} +{"index": 186610, "batch_hash": "0x280fb85d43e52762dac5149193a20bb314c0c13f5c65435c73883f2beecfb273", "finalize_tx": "0xdcb7c06bf91b21e3925576fedf1b0f4f547164cebb203a227c6568296e219a85"} +{"index": 186611, "batch_hash": "0x43f79f6c39cc3c21806f2a12d87566144bfb51804f5dd44ba375d04f2342b37b", "finalize_tx": "0x73bdf70169b21c1b44a983086b39ba9127a9af13069a8b785f48b5f344a69adf"} +{"index": 186612, "batch_hash": "0x7a292652df67bd16e6b3e307390d810ab46da113ba5ba2b979be352e99195ee3", "finalize_tx": "0xfb7349b1e8b0e18ccfad63f444e07a270af2164901edb398f61cf995b0c1fa37"} +{"index": 188913, "batch_hash": "0x129a7b1025eab8e65e545ff3374837dfdaa0ff58cb08d9fcb5d71f095af3eb1d", "finalize_tx": "0xc0c1af8f4b442fff598c8356f3e4c742ac42944601adb40b3e9131a24f9c6de7"} +{"index": 188914, "batch_hash": "0x7dab8c95067283354a290e122ead6960ce9484f36bf4d62fc17c30d89a432b8b", "finalize_tx": "0xb3d37308595f74290f64ac5a0f2b4fd9ba16b3e763dd47dc946816be3a55f428"} +{"index": 188915, "batch_hash": "0x29d23920edfe26ecc184de6296c68c4c31ce2c3a15a35c431944512697914144", "finalize_tx": "0x64e3e476fc999bb576160839550df00eeed3864a2bceeeadaf66eb94b6851ede"} +{"index": 188916, "batch_hash": "0xf434f1b8b8c7dc9db2f6d5d7b96ba0f9d6b5f020c3ae904d4b45edfefeb49f85", "finalize_tx": "0x64a33c19b98199c49d547d467eaa8e7c029aeab80799333aa6495963468fa015"} +{"index": 188917, "batch_hash": "0x83dc461f42c93668d45946370fa8ec002fb6985b5111de0fcb52f871b5e55297", "finalize_tx": "0x6a57e8d3c4c8dbf9c53c4299a8a467ada9b83ee52449ed1a8b1704daa2546e52"} +{"index": 188918, "batch_hash": "0x7431a37930cf2a5354dce285d0993af5184f26803183986090076ab1e1087719", "finalize_tx": "0x9e1c0ad5ddd97a69fb080cb357b1902d729ee41acc5f9f60ceb3693da3d350cd"} +{"index": 188919, "batch_hash": "0x06f6fa98aed559fad0d0ece11be33f6797f7bc2589305384091c4135a4e259b8", "finalize_tx": "0xd2d4529fde4091da491473c66585a64d99f5ff51eebb66d34ccd4bb71d2ed1d0"} +{"index": 188920, "batch_hash": "0x85506c35deb6536a1e958770b55973efee4527f5bce44869896e9ba067f50c54", "finalize_tx": "0xdaed170cb33d52d5eae9b574d91582e47cf3139b3f1938df16b0f1457a36751d"} +{"index": 188921, "batch_hash": "0x98c3b244b41bde4e4406b91e611ae7a774158382807ab03e2420499c411802c2", "finalize_tx": "0x564dbe2fcf85de03c9e38d4a568e84dc0de80ff9abaf42e7141cb26f366be2cf"} +{"index": 188922, "batch_hash": "0xc26b3687d54e66a0966c1f8d8e4b2343cda4b9af64f6d3a8881d96b26858a775", "finalize_tx": "0x383e28fe36f983faa6125716ff62e5f1ab6228e851bca8d1e296cd6e1b7c66d6"} +{"index": 190413, "batch_hash": "0xa336b3ad429a841a43600376433731bcaaa589c3bf3842d5deb38e4a08ad9310", "finalize_tx": "0xa49e6a1d34239e07253ccbefa7d04c677f485cffcd7455eeb9e2a69cb570d138"} +{"index": 190414, "batch_hash": "0xedd87962aa7a553c9ba4f957da2bc3f7dd48b6a8fbb458d80eb0d0d130b469cc", "finalize_tx": "0xc987e5325f276cce8b314080cb6bc597d5da71f16920c4e9612a1d928f184517"} +{"index": 190415, "batch_hash": "0x78075f31850ce79191792b824be93efcb8b34da0db39e17b59d50773e8784873", "finalize_tx": "0xd7bc2db8920a085c19eefb6ced0dd54cae65d9824b556024128f331dc0b443ea"} +{"index": 190416, "batch_hash": "0x3d5e845ba9fd11175a07cea8de7bcbb724cedf282991f8a880d65b66fdfde2ec", "finalize_tx": "0xae39077ca0ec8883bb7162f9becdfb86e75207a77b707e6a8978775f9c1e0c95"} +{"index": 190417, "batch_hash": "0x46c0f1747d97b98e01f10942fe329d976f6e1d5528e5b61afe5c8251a8e163e5", "finalize_tx": "0xfe01a5e53afce39fe594ed20fa05c7e2b09f0778aa21b4909071b3ca7a927161"} +{"index": 190418, "batch_hash": "0x4a632ac1ab5858b537b16e91db79539f3f9a9a4819381f02c328ba11c40faeff", "finalize_tx": "0x597de6904cd0be2faa48e0d91645dee4fc850ab7e1f1b970c540d78c6a206a4f"} +{"index": 190419, "batch_hash": "0x1937f9f1adc09d8bcdf2654cfcfd076eedc8dc6fc7a9687b4e6b8bc166e1608c", "finalize_tx": "0x245fc7f5ddffe7cb3f07cf17a89fb95901dc608e8f056680c79cc70f5bda53bb"} +{"index": 190420, "batch_hash": "0x065a11cdfe3e13efc10bfe772e7e9956e0505b6b61cee69ec442ec4344b0f6f2", "finalize_tx": "0x5f005d8284eba8d8d54b97963e0849ca155df4c68d4b90100e0df2a6bf62ecc4"} +{"index": 190421, "batch_hash": "0x447293bdf0a78eb788df77fb34235fb171e5d6192b52c0fb01933f75cbbbeb49", "finalize_tx": "0xca3da513b9d8da686d4b8b5165ed837146ef2e98f2a0ec4414ebc1acc217fc6e"} +{"index": 190422, "batch_hash": "0x9a3da3cb17ccfbaf6def8e0f542c689b924412673f01415b2e5b70948251702d", "finalize_tx": "0xdd413d5ecda7a842c77bb9d79305f3bef3401f3c1465e4760077ed288a91b5b9"} +{"index": 191883, "batch_hash": "0x010cb621fb735bbb9be6b47c35e611131cd71bea7de0b84731dacf093308a7fa", "finalize_tx": "0x678483c9de5052634e98122ad0bc1d97ff7c891fe3bd9feeb7b204f26923192d"} +{"index": 191884, "batch_hash": "0xfbd1e1a0ef2843e1b35e46e34c831f280177f959e4d63477a2e2e5aec95bbf74", "finalize_tx": "0x538e7bb623c12d45dba61c6853cb213df56e54dc1ac554cbb3ee21e125e34516"} +{"index": 191885, "batch_hash": "0xaf55747c4f271751750b0491a3b7c4132ea1088a27332c907140eadd7ad5aa30", "finalize_tx": "0xa2de1dfd348ce99226f656826f377b2f100d013676cb12beed2ef6621d3d4760"} +{"index": 191886, "batch_hash": "0xde8cdd7397a65078f0b4b93a2914b738e860e5cbd4eefc25495b5856ead2a7d6", "finalize_tx": "0xb65ced97be117a3fa6a2fa0dc5211cd9c1dc9560ebdf42fa2380fd57bd40d4af"} +{"index": 191887, "batch_hash": "0x54cc8375fc07dcd4a2c8c1d2ae82467e1b3ee662102fe7fb7df1bdc1d4c7d159", "finalize_tx": "0xd0b60464855cab7be9f7a43554cbd52c3034a55a63f70d1a1c6da35cfcce97d3"} +{"index": 191888, "batch_hash": "0xe50633398b88e6d4e54c7d41e35613d2ef949fa7e65179c36b71d4cadede7370", "finalize_tx": "0x438ef50a43105820a097b41d992c6053b3a97e66d49e11b5c81f2ac8bced70c0"} +{"index": 191889, "batch_hash": "0xa090f1d07fca61328d317056e43972e0589ab63be16c85303cae302b87fc5cd4", "finalize_tx": "0x306d984b397a2f3d0dbe1b4d5f033799561975c91d5bed66aca8c08f2e0b4fc6"} +{"index": 191890, "batch_hash": "0xe2f3388ffe5a6021b84b1fe45f26131468fd5ba80c7a6941d02ce88a9f479101", "finalize_tx": "0x59882496f917d2fa83e78c67d37a931e7eaa6978c0c8b72eb238441eccf74835"} +{"index": 191891, "batch_hash": "0x9642110f9e1445a1b5fa05d04a5c8a01709673831edbc9305d7f3b52445e46d7", "finalize_tx": "0xf03a1688e648dcd8e06e8634e7eb588772b455472f440669911b808178b7770d"} +{"index": 191892, "batch_hash": "0x7f2dea64efa45867fd5b1d9df5fcf91dcdc8c571be4410aaa287c2faf1c2d4e1", "finalize_tx": "0x7ba4add71195f76b7fe037ad80db34dea133eb98dd4e97f5ae868d6929f580a3"} +{"index": 193533, "batch_hash": "0x5bb9ba73c13d46140c89f65a85febd1be3f6f9512c36e45de4a58233b62b39f4", "finalize_tx": "0xceed81ae173f0f2ce52d3fb863b5872aac4172fe7403efb0684cf7459fb07590"} +{"index": 193534, "batch_hash": "0xb8d5a140a3c15cd7a858cf022b4d03c0ed39bfbe32709407076d6345b66a3a35", "finalize_tx": "0x5a4db7335f154f9619396fe727b7a76950fc43a1a3e8e3d613e490941685a3ef"} +{"index": 193535, "batch_hash": "0x88202a6991233a4926bfadd5c9f11cb0467e513513e2c108ea28ee26dc2eaa9f", "finalize_tx": "0xde10c0cf8a514480c5bedf28fefdda0d9813b185a68e7d5d0266c2a9bcf1f950"} +{"index": 193536, "batch_hash": "0xbf8ee1277d898de19494ffe0ab8a606318b4e01eb55d7ebe951068bd2b778a1a", "finalize_tx": "0xf55ee04e4ac23f864b5351ec12af405fc060f8c3e99acc1160af7a8612e5e2ab"} +{"index": 193537, "batch_hash": "0x60060e837751106b6be346aac30e46e41cdc294c3972cc7346ebb77794207e84", "finalize_tx": "0x351d43c45b2715700d629ce49a6d143a3397caae7776ffe3d36e409facb97f2f"} +{"index": 193538, "batch_hash": "0xbe5e96a5c978248b9e135604265aaf0190558375a0a93b2984d2231d21cb7237", "finalize_tx": "0x20947a4d3a2d0221b8b28875a4f3134b368046b98ceadd2ce80d678ffe5c2a00"} +{"index": 193539, "batch_hash": "0x65f30090cc9244a270f41e6d779bc5ed8eb26d8620af756608f1491c61bd4913", "finalize_tx": "0xdfa77b67e6a264efc251af734228a9b2cc40526171be93ceddb3ef17c9446603"} +{"index": 193540, "batch_hash": "0xb151ea71c1211732f2db355fb815633b16025c9f09718210d9621158267a5fc9", "finalize_tx": "0x11ebe9cb710e888315c4fa8b76eb38530e20d4e1cbd1d27c14bcef7d9ebf165c"} +{"index": 193541, "batch_hash": "0x54da01fefe1d190f5d064f5ed2f53583bbb5c4e5d922443731bd9c8a7262505a", "finalize_tx": "0xd1b8f1ba7b699001a3c5df7cdbf9a9244d11341dce72b7d8e8679c6da7c9a447"} +{"index": 193542, "batch_hash": "0xfaf8eb92b42a043f951e89331f9974bf101c2802c4f3fc72b51ccba94e5e62fe", "finalize_tx": "0x9c0fa11065335d98da0aeb894415575ca913ee826979dedad383a65192332526"} +{"index": 194753, "batch_hash": "0xd8df6187d66380a0a17d4c6b051288d7b322cb5228bfad6bba25c4776bf0868e", "finalize_tx": "0x024bfba012dfb0fd1cf272b93fbcbab7f56a42f18f8104d9a8b5d8d69c336d09"} +{"index": 194754, "batch_hash": "0xccaa2f9161bcbdd71db8fdeca9e0373e5f60de46a8197bbbce2c4c510f20186e", "finalize_tx": "0x6c3488a25ffa1697378aec290b8d5182fee34b5dd8e4c2d7895f4857a611d667"} +{"index": 194755, "batch_hash": "0x411f0aebc6770d7856521028e711796e8a71c93fd97ccd6ae14a8ec9ed515092", "finalize_tx": "0xede95f6bc7b2a49783d7ea5304ddebbc0986dc1ddfca2fc544181dce8d9900da"} +{"index": 194756, "batch_hash": "0xf64530337950f254e71c9227b2f47b0e54325075ac4cf35531c53ff9e41a887a", "finalize_tx": "0x6aeadda8a8e2e03c2a445708328740daede1e9b3b09fdaec6d639d3696d5d4c8"} +{"index": 194757, "batch_hash": "0x01c60daf379ad63bec10fd35a8af3b2f539ebe6669d9e4ad50b5c1fb76771a90", "finalize_tx": "0x20b66af31f6f7899ea327fb5f80a41c5fc8384f565a0434564d8ba0ea0f23c91"} +{"index": 194758, "batch_hash": "0x28331756007a8fc22a6c10cbfa09b159ddf80c3b14a2679b879db980afb49c7e", "finalize_tx": "0xf6ee3de0651a591b33028b145c30ceeed9e7f09b889663d7396405fd892eafa5"} +{"index": 194759, "batch_hash": "0x278007e8f0c4afcec00b10e6315c940240a6506eefbf03971dab21878fa017ec", "finalize_tx": "0x25ae0de86fc7c922740aba4da1a7e1e3e00ac2106ca9d1cd572bbc2b2248e5da"} +{"index": 194760, "batch_hash": "0xb54a7ce97d072a68d77bf15563bb87594aec0a620786a0585a05af68c666603a", "finalize_tx": "0xf9267befb93aa9ed260ef1b625c9b02148b4aa19721db0272cb0c2ad5f732e58"} +{"index": 194761, "batch_hash": "0x48a69f0b29dfc5f629cb406b69f536d6134bedcb321fb4d124fe807de6d7dc60", "finalize_tx": "0x0bbf60f047251f0372db5ca4412ec391213504889a41303fc4b09fb29077cdf2"} +{"index": 194762, "batch_hash": "0x7d26ac322aa90422ead5f2ed03cb8884524900e4ceb052a8017a310b8227e9d0", "finalize_tx": "0x93a6f85f4b9b8a49a50f6ae4e5d38e6f240a05f3c98918ca48796399ae1272c1"} +{"index": 195213, "batch_hash": "0xeceba4dbf16db1f7d50bf6642e438e00aa8a4a8a4bbeff6a129911bd9d788a62", "finalize_tx": "0x0695957de8e0f6841e94ef039e7858346a88691499612bffb9ce4688af5c027a"} +{"index": 195214, "batch_hash": "0x97952a19f553e3ac48b3ce0c02e34ea947f3616c474bf1efe4446cc29d4ef8e3", "finalize_tx": "0x87c5264e4c18c587bf3df8187905c102a7a0a24059ae1f7b412fe389dfddc442"} +{"index": 195215, "batch_hash": "0x26b820523adc066c8c15510708b9c667d92523b18d9b2480b4676aade8d7731f", "finalize_tx": "0xc14760bf4e8f1e94c14b50688f71b01fa1e3bbd969fc5ee3c92b2805fc2f340d"} +{"index": 195216, "batch_hash": "0x05bf12f6dfb8a91281750b7909ef5565c75ad83bed9b9665d3470643814733d6", "finalize_tx": "0x448e8bceebdc220d26fe46e56ecb95db8d35435170b87c94a1f4bf32d97acb21"} +{"index": 195217, "batch_hash": "0x687a26acdd9e0a67e366459f65721147d18867320643a87bbfb990eaa231d987", "finalize_tx": "0xeee7c0dd4a3fd785baeb06efafb9cb57fea1580b68447f54748d2a5ccb1cb102"} +{"index": 195218, "batch_hash": "0x6b227ff68ea69eb0a4a5add53fbf8bbdb53f6cf95f92eaa6e63b40c5ff1276f3", "finalize_tx": "0x91eeece77d2d51f4ee8c5603fa95aa53d004777356e4384de2591a761d2b0c90"} +{"index": 195219, "batch_hash": "0x2e4486472a992fe2489131dfcd38ae1280d3a3ff581bb668e076b755097acb91", "finalize_tx": "0xd62c480234a0a8ae04c289fe09cdbc5bd2d0e36a10de42878467239ce63de85d"} +{"index": 195220, "batch_hash": "0x7215dcbaa92ddc8c16dc09cf658997dabfe759b176330934f612e58479129d53", "finalize_tx": "0xd4702bac1e74a39ae65fcb6dee36665e2aa299d2df677c195aea83748ab88749"} +{"index": 195221, "batch_hash": "0x0c9acf7b48b44a3a2c08ab41416e45d2c5308076b58233f2345c0ef3f939b102", "finalize_tx": "0x8f2cab335c800e5d8961cef89b05d516d14f20237b9ce08c9e09401b989dae53"} +{"index": 195222, "batch_hash": "0x2458fc70070050a292b0e35a2107b5041acc85b0fa77b2a589d780bdd03fd085", "finalize_tx": "0xa06f03d87b30b12f8eeade9efc1b31a467040a25458296bc63b1479d828adedb"} +{"index": 202293, "batch_hash": "0x5ab08f5134f37c36a847c0088c23adbfcde8fd720e446f400a729253350e1ea3", "finalize_tx": "0xc12c3dfd7d8cdc4b0a87f004f047c68bd02eac90b0c92a80a46ccc831edca396"} +{"index": 202294, "batch_hash": "0x44d32b0c6981eac0830f6bde05d4a0a5e42dba18d37d2204252d7e2071fde848", "finalize_tx": "0xb96250097b7291ef8f4a01d4f07bf2408636491d40f86fd508e792936029dd99"} +{"index": 202295, "batch_hash": "0x1b9a2d57961212d6d6e5b1f20be6ddeb03c4d860db7174aec9894f6bb5733f63", "finalize_tx": "0x7db6557c3d4bdb69e3297bea59422e3a1059b07d30392dab43664b3f081a6ee6"} +{"index": 202296, "batch_hash": "0x64525e837800ad62fec9b6271a006e328c715c92ea6164083fb7e728ebd4f322", "finalize_tx": "0x6ca77c6e576d705e8138b593a07e4100aa3538fa00644bf2ba85afe0d90222c0"} +{"index": 202297, "batch_hash": "0x2070f7e68f763d47dee77aaff00e123cb4f3f0342739acb985355746616588a8", "finalize_tx": "0xb206f1e9abc3349ae33077dcb1840774d983f24045d8aa628fb8b5704f71aeb4"} +{"index": 202298, "batch_hash": "0xefea136c867791d04ee1e3b46a1d9ffa0ba3a5449f14a2aaa917126c5a20c418", "finalize_tx": "0x780f0b600028f0cd60003cfcd7d9da332c37e18024e0fd5d53bcc91a754259af"} +{"index": 202299, "batch_hash": "0xef5be0827e7d8d7e6c0ee823cfa034c685843a5884596b77349bcf281d3f0c48", "finalize_tx": "0x29254fadaa639a2dbcd5b1a629747e5dbeb3feb70d9efda165f46b921121a25d"} +{"index": 202300, "batch_hash": "0x7a1507dd5e6bf8dca310496d9d532224fa36df2c924c87ddb2dde1a52fd2d46a", "finalize_tx": "0xecb93a68a3a72c2371a0528c80f8c643a44600919dfac8e87e63271458983352"} +{"index": 202301, "batch_hash": "0xc03fd586a458a814662cff770ddf5228533d1d2679cdfeb76615766df4a17a1d", "finalize_tx": "0xe06acd64e9fc2d5618eed242626489ab100122fc2d8e4efe6947ff8bc48ab1e1"} +{"index": 202302, "batch_hash": "0x865576f3f4cd0d267bc7ab20289760650e94e3fedef3d4f30f9be17730ce9780", "finalize_tx": "0xe389d98152da97bdf2008c51aa2cd6d5d2cda2f6a4a403dd993b7de818e3626e"} +{"index": 205103, "batch_hash": "0x83c5d658eefc2a10481fadcb741cdb5e1b9694ab938b933cd1f4afccfdca5aa8", "finalize_tx": "0xee9a3ef5eb7934a576d564720f2db93da06e9b27cacdf7edb3729cc1a2cba1dc"} +{"index": 205104, "batch_hash": "0x994fb681209cbfd4191302ec9ff516d7a7c2b802f62c62ac5714187bc5d73b21", "finalize_tx": "0x1b29f6ca387908f20f2a84b53f22f96d65cfd80638350ad47105a74debe335f9"} +{"index": 205105, "batch_hash": "0x5c5b4bbfe8e79fded964670163e2aecca16c1daf7cc628f977f050096987763c", "finalize_tx": "0xe2954a8efcbf0c53ed96dc20db0750d84438517aacfc1c0d170dea19c36351fb"} +{"index": 205106, "batch_hash": "0xc103bfe9ed915f4f77bceda1cedfcbf7078ade7a3b728b3230577363d79a15fe", "finalize_tx": "0x99e00a28bf12c9a00e8493d741fba2c89331a45405cc78c768a9b5c24b904837"} +{"index": 205107, "batch_hash": "0x48b87a156189631d82157cadc63e797033052b8907d900330e3e9c2cf01a6bcc", "finalize_tx": "0x9de4aac81ab4590ce1fb3f9aa00fff9d2655f91a4e6ed2c9bdc88d2ff921a3eb"} +{"index": 205108, "batch_hash": "0x3f85a738ce524b2f74597e66a5d61f5a76f27a3f077c21e62fda5d50ea02a441", "finalize_tx": "0x1de86c06917ff978044cbb6a9ebd2d4dd8a8bf63a94c2a207780846bf6191660"} +{"index": 205109, "batch_hash": "0x5468062da5e6f6d7725c6fd724aa2fe8a6936a9ccddcd2c7ba25376b84879d1c", "finalize_tx": "0xf1597f1ac1c3565352bcb866c84086f04ca6657cc0aeebbffd97b0018ef3f6bd"} +{"index": 205110, "batch_hash": "0x9f3a66ef0aa671bf65e7553015a6d7aab4d505445589e88a288b6ac07b072480", "finalize_tx": "0x1c9a42f211acf2e30f2f0096ed357aee481dd7b1e39d0b618bca387a5be1e321"} +{"index": 205111, "batch_hash": "0xd51c2367a5ed74ed3262b79454ce0e3e059182ebc1d49a7c883f5868b9c0714f", "finalize_tx": "0xba383502d08f3574e9bdba39a7c95ea76d253e378e85a0863220f9ac7b0b98e0"} +{"index": 205112, "batch_hash": "0x12f7b35af6aa50d00b15e534fdd0e341bb316c050026e63920c7bbdee1dc1617", "finalize_tx": "0x7fd844d93fa7b5916bf21b03a00bcb1ee00835c18092d5139e6b03432a2124f4"} +{"index": 206953, "batch_hash": "0xd35a6eaa81666217c575ebc1d143a64bb95356d7b8f69f92dd497a010f695a27", "finalize_tx": "0xad8596d77161b1f34601271b3c063028df3743fbecd670842f0c926c93e2e52f"} +{"index": 206954, "batch_hash": "0xc6d7e0f0b65f45595d7c6cc3d9133d4d7b4d4ce992e5ad716bdfc8ff2fbc0e1f", "finalize_tx": "0x19532812f0d2d5a7cdfa0d0d94c213ce0379dd33a7ef3f1c48180e4c129c9c0e"} +{"index": 206955, "batch_hash": "0x374941d3318831802f185eec8239fe85241151217ba1a6dbd8e3474e8d746baf", "finalize_tx": "0x5fa2a2c37ec8c9824981cc242411fd97ed70ec85f3cce5ac297915a4ab00cb34"} +{"index": 206956, "batch_hash": "0x9622e7695a0f938ce31b1ad7308233b0cdeca53b3a01224dc4f533e01c53e58a", "finalize_tx": "0x5603eb8020d0100df6a892766207b178efcc127e29b9c611124a047b8f0e874e"} +{"index": 206957, "batch_hash": "0x0161b9e01fc0334ba27f82c0d334b3e62e91882ac6d796e340f36d4404f2b30f", "finalize_tx": "0x5eec9f80d00c3d28577d64075769e384509d3f461ecd483a6365f75707d91bb1"} +{"index": 206958, "batch_hash": "0x8e1d3dc2a7111606574b8ee59454cad5d3db6b6fad1b9651f1e3a8fd8096f803", "finalize_tx": "0x204de2bdabacf04ed8b4928dc97560088415bb37f64adcd1fce420b28b94b915"} +{"index": 206959, "batch_hash": "0x49da59b290ec78226e3169202301cddd5b3e50acc7cf64e4eb95da226eba1ff0", "finalize_tx": "0x689f25fe517a552ab61709ebae88efb3728520f5cacdf29ce8de0bde89fb09c2"} +{"index": 206960, "batch_hash": "0x7eda569de033a5da9d8e0c048eb35b1eb2f853defe08d33fc6f6f724be3a108a", "finalize_tx": "0x83247dca6ab6590d1ce3cc822393152f7ab3fb31c8583d6201bd833c43a47a60"} +{"index": 206961, "batch_hash": "0x257efa574868a23706356b80ab186e4b79e79ee8f9070a7279ac65be8d6f7a05", "finalize_tx": "0x9e3cbcf3d60889307932c95b70d7344552bd652510c0453bcada988f8d070d8a"} +{"index": 206962, "batch_hash": "0x6ec1b58efc5204180614421cb6545db11ba1740293f85f2d3f67af2bf7ef78b7", "finalize_tx": "0x54bb60f43828973c5395dae90349f47065d851a8196ea41cdd68a37274ca0818"} +{"index": 207203, "batch_hash": "0xd7b3bb086b4aba4b0ae21eb9f2ea7118f5758d6613bf96472a9b40e53c54712d", "finalize_tx": "0xf9da3f59252afb74b381880ad771bf4cda36e689d235ec611e6c2b2c0735660b"} +{"index": 207204, "batch_hash": "0xa624a829cd7cf3ccde071c519f0b874a900e6ed539e9c75c329a08f85b6823d7", "finalize_tx": "0x2b239ae018a0fc19dbee3d866a8414c4d19f895568cad7b623938d443c3955a8"} +{"index": 207205, "batch_hash": "0x2cc026ada5b4e1ce92ef819fb8408831f6a40aa98f247753c7b643d80d8f04c8", "finalize_tx": "0xc442695b78070d8d0736ffc0dc344a9239d34f485b57ce1fbc5405196e5c1848"} +{"index": 207206, "batch_hash": "0xb51665608e4ab2d573ff1c0ca45852f62cade13472b27839144f172380ef4990", "finalize_tx": "0x340d06ee4f4a3cf93028233eb9d90ab08e65a3032ff8d10b90a1f7b47b5c2324"} +{"index": 207207, "batch_hash": "0xe35a7de8c8cf1e96b582721b5d8a8fc71bc32622fa8655fc3f4f5b7b68eaa7bf", "finalize_tx": "0xfae24cd55333e7d2992326336933721ab9aa028d7d4cc5c9a29c14611e3317e7"} +{"index": 207208, "batch_hash": "0x4c258d9ceb5d1aa3280ababed4774284c11aa825011c5dc0215f29dba65ed6fb", "finalize_tx": "0x8ea293a4d079306d7438d40d99acdb7ab09bba446f5871928cce890ed7279e08"} +{"index": 207209, "batch_hash": "0x817e99f880750f9fb50e777efb7c55a4faf19040bdf049637bcfa93aa279ac92", "finalize_tx": "0xf001e5fcf46920fff8acaebb0a3ada24451847be48b3b8b7643a12909edd8343"} +{"index": 207210, "batch_hash": "0x7ebda66cbace587ad60078e8a8122bd2ec589deb1e16c831277443f7e4a796a6", "finalize_tx": "0xb0c37634ea40bb1b7fb4593d65992430bac7cafa0820aa9d51f3e480aaaf8006"} +{"index": 207211, "batch_hash": "0x149b1136b67edfd97de09ab48da27f706561bdb4dd3300fe887c70ff80c67ec6", "finalize_tx": "0xd35f2fce53c148860ee9d3b169c858821fcdd538f6b2809bb334c3d491731420"} +{"index": 207212, "batch_hash": "0x35efface0a8f78dc793946b1960f053b40cea7cbccf6091f8f14d0d4454e7be1", "finalize_tx": "0xc569f92038292e3cad77e260ff6abd5d03cdd230d5861c9d77c404df61ea53b3"} +{"index": 212813, "batch_hash": "0xdc6ac8f6139e29f8f3879ebbd29321fc7c574b72c25767b08b803df9731b494b", "finalize_tx": "0x5732dee29854f8979b2b54a211b57f7707c5ccf044814bc81827f244063e19e5"} +{"index": 212814, "batch_hash": "0x64a4d22aa9225ff8672f4d1f9e5ddff6f607adcf144f5d61534c0991cfb1aabc", "finalize_tx": "0xc9e50ce83dfe9ab41610ba0023308492872897052037ead868724592380b67b7"} +{"index": 212815, "batch_hash": "0x3149892dfef1a11a32882dfbed120a4d3768f1125778d5b87fd7fe7b3dd1950b", "finalize_tx": "0x8d067a15cd505981f5c765ecf98f8116118722d6e26df4f6d16fa4b385c7626f"} +{"index": 212816, "batch_hash": "0x3fed2912749bb5199628fa60c03d509fceb30cad7e4c5faa86e04e7031ca254f", "finalize_tx": "0x2369e70c8786a419062f55a29b90e740107aefd63bcce6779f3d53c34f30a8ff"} +{"index": 212817, "batch_hash": "0x72ed5033177319cd91bca4aee8b08d74de811d8c849c1e804d289ac6957de3a4", "finalize_tx": "0x3666ff2727dc9398784e10fd9d26f7a547df7b1710982e875f79bdeadd78a1cb"} +{"index": 212818, "batch_hash": "0xd0dd5558aa687e95e15f6bc0b9e8f79c5eb3670f74b5a6d2b628581d5491c35a", "finalize_tx": "0x25fac1b0a7c0beccfe020ad602e5093017df43a313ce94d9d12c79e20ca52748"} +{"index": 212819, "batch_hash": "0x4e1a9e57f4624012d7113c4fea191ba4ad87192b7fdf9758b04ff9f7c56e670e", "finalize_tx": "0xacd3cb4dfa4d26c144b47fde50133acf5424bb70d799fcb3f98517c6c4dc842f"} +{"index": 212820, "batch_hash": "0x5b03ae73ec14beb5b1af3b1a1c4ef233d17e4e0e381a4add594293a08bcbe815", "finalize_tx": "0x9801de01b8695645f556cf65367f3e8bc649b0a3de79a31507f3bd8543e542cf"} +{"index": 212821, "batch_hash": "0xce71b962f1051071d2c262b9f62102fd899a5173b2e43d28cf9f330ce4fd6339", "finalize_tx": "0xfe6796e003b62914d959b6fff107d16d0546eb902b19638bbd9530037c0da2c0"} +{"index": 212822, "batch_hash": "0x33c360471e7929c6049e8a0d0c6f8eefe0304c020ce25a76447ff5156510d575", "finalize_tx": "0x6995df74d1eecc2a8a7a521aae5b47c9892d9bc12212de40d20af47ae399480f"} +{"index": 212863, "batch_hash": "0x14d62afac7c67d467387bfdfb493e918772eb2a9269bb98f500d463b96075be8", "finalize_tx": "0xf2f565a6cfa2abd8f9f0dfb5013b353b433b2ba9490784c331bd96f4dad0dcc4"} +{"index": 212864, "batch_hash": "0x6653b69033a8c72a9fed1dd534e1a67bdbba74297da146babea7f20d4af4af49", "finalize_tx": "0x5b651b3064b664d852bfc3b22ab32a18dc0fed7264ae9124f88ab57592628b7f"} +{"index": 212865, "batch_hash": "0x0037bfc23cfa61719c29d2c0ff22e8092be23cc27c1c12bd8477f99f7f95211f", "finalize_tx": "0x42acca03e8b9fed88a1a9ab17bc9ff3dd7442b597e0459258a43a1f4142eff18"} +{"index": 212866, "batch_hash": "0x3bf9f9e8e7b61b5c2654b56779889cdde36e2648d2ad8c0bdf609afdec773954", "finalize_tx": "0xa6a2caca4a6c489cd6420ad6f96792bf97719f696aa349eedc24dc7419d06ebd"} +{"index": 212867, "batch_hash": "0x2c401871d52922f8224ca70fc9ac30e1dda9354e92f765fe977da2f2d96c5cdb", "finalize_tx": "0xce5401059964046aeeb340d7825d1547d1e83060814397de37c059fe2a0d88e6"} +{"index": 212868, "batch_hash": "0xf8525299cfda6508cafdde3f93ff73496c44e4594490328257c742b4a7ce7b9b", "finalize_tx": "0xec9caf0196c7181e5d3a0c2c4be72d34be754f7275f47bdc1cf9c724f9f210ab"} +{"index": 212869, "batch_hash": "0xebd2cf8a2a259778d2b383bfae2c57a59f4dc910924983342062158a405fe456", "finalize_tx": "0xe774f1ea57766e95e6c9909f26b9dab1dc5cda4355acab2c6612a8f6377fe346"} +{"index": 212870, "batch_hash": "0xf66e867d8386450fa76434f75fda5cdda7a8df3048944fad5013ab427df2eaff", "finalize_tx": "0xad0eaf43145ac1f08c2017d529fc098dfcf7ba9995316e94ac19614fc2a5aa7b"} +{"index": 212871, "batch_hash": "0x54fdfa8fce20897dcd4fce82833f0e9ee236878f94aa98fa9f0f368e5500bd00", "finalize_tx": "0x6349aaf32b0fb91544e115e5ef0f412769f0bbb63f50685ed53d6b9d758b5415"} +{"index": 212872, "batch_hash": "0xe9040ed7d0b1e569faaaf15a9961b63fdb2e0c16579c939712e0de22b68d1209", "finalize_tx": "0x5ec35e8c419ad66a537b2c39ca5f8c28e297eb38d6ab273b2dffb36402714243"} +{"index": 217043, "batch_hash": "0x15402f4a7b2f82f216412250ae17fa63e0f3cf9f3a776c97e9422bd3e3033dcd", "finalize_tx": "0xe42a69d516f505c972bf562047d57aad0b85851b0609d58a52a6c3739ab8dfad"} +{"index": 217044, "batch_hash": "0x2714b9273abcebb7e2b3387060d658d5a5224ee8a0c39e2b97185058179d34a7", "finalize_tx": "0x0160a2edc491f49bd61fbf8a5b992a6a6586ffba36dae0efb699a5d60ddb17f6"} +{"index": 217045, "batch_hash": "0x96b60cbea40e961062be12af4456f58ac62c7a01c5907db80c94652922fc5b09", "finalize_tx": "0x0d8a8155301545aaec9f1a440490be0e1a39370ddb327cda1913a3ca39fc51eb"} +{"index": 217046, "batch_hash": "0x5d4149372e9187ef2c526fb385969461c7fe74cda09bb9d8981228593076b58f", "finalize_tx": "0x2fae21a5e4462c9fa5bc1ec2b5b50220441411353b57dc1a6df72e1670813dd5"} +{"index": 217047, "batch_hash": "0xa487236dee6c3c9f94ac80593f85fabcc4327f2845c1aad684c0bd5768b29d07", "finalize_tx": "0x99fae0b5d493961596dbaa759c75f10e625871898d6205f5de18350c9256077c"} +{"index": 217048, "batch_hash": "0x19ce1fd242ca8395da7f3da673266e8c1c3a01ab18d8640fd7f496af0f09e35f", "finalize_tx": "0x1dc10471c83022cd737d4e4b1b61d4bb32e6495731b4e34dd84392994e4dd92b"} +{"index": 217049, "batch_hash": "0xc0b1156002d31eb9ccf9f5ebfe8b0d7f376b24cfc9d1c6128c23bf35482c2490", "finalize_tx": "0x3f9a014dcf859c3b33e46eaa6e31a241648ac82bdf9bcc936d0be0eb7588c676"} +{"index": 217050, "batch_hash": "0x249ffb3a9076722b0e82d0abd10e683393742994525cad9a7efb8064f8228713", "finalize_tx": "0xe2a9115c182e88cd003b1388bfe8f29b8af45aedb8413acdd8bb178c043b55ca"} +{"index": 217051, "batch_hash": "0x1c1f15be45157f636b7074a56cbcce93280ec84b6b0f4d815d7dc5c7ee26be4c", "finalize_tx": "0x23b89cf3c6ed3d4bdc252cfcaaed1dbabfc5dcbaedf4157150d0867f596c1bc1"} +{"index": 217052, "batch_hash": "0x29288e8112462aebb485fe23a0bf10ab727f430b420db2b6f98f00f3ce584e03", "finalize_tx": "0x269cf827c494a9712e6cffdcfed20a023fbd599122f69388c07bd4e436bb802c"} +{"index": 218443, "batch_hash": "0x6fb0536d300333198c354a1cfaf01eb0579bb1c32d673dad9e824a04dcb0754e", "finalize_tx": "0x560c7ee3b3a403a15e47ee6d1a2114f708716c7e78ffc7bf794f3155e1261d1e"} +{"index": 218444, "batch_hash": "0x953567a496eabd6a32e4e1bf0e4c422d1798f5a7547fc5cfcdf00e8624d17eae", "finalize_tx": "0x040099bd669997b4e2184cabdda45900eb75ee2cd7879f3c9690647520ae2da7"} +{"index": 218445, "batch_hash": "0x0314bb8a0a18edb2afd9f4ee94867a6a8314661c905c7f7df2df40f5e92ddce7", "finalize_tx": "0x93bd5a229274b20947883d2c42d3e2541a1145dfe308f264a1c63097da210f95"} +{"index": 218446, "batch_hash": "0x52c282a121274e49c2fe899aec713d5399d713ce9a362cd166762dfa67da31a1", "finalize_tx": "0x4965f713bba4449bfcade02a5a8f587422f8845dde70d0fbb1f3cee84e31403b"} +{"index": 218447, "batch_hash": "0x7ef6e28041e5573b9c5c2607a6b0a6ab532fe05d8ab85a0308badd2cecf2bd12", "finalize_tx": "0x2236f90a689f7f8824397f50dcb49189312b2bd52cbab1dadfefd88d28e65864"} +{"index": 218448, "batch_hash": "0x0f31cc742ca725459d8bfe5cfc5b33dc8d0386d0589f1f93bfd59f31e042dfa5", "finalize_tx": "0x776c3253b2bc24a3349eda792df581e52bf6b9e6764e916caa9938645a2fafe3"} +{"index": 218449, "batch_hash": "0x1635fe197ed0d1574f5f0dff0d4f52db0f1105b06b81f3e76eaa580150f366b8", "finalize_tx": "0x7c972bea237d145e514fee750c0f012423330e73ead7668a4ad11c3e73d345e4"} +{"index": 218450, "batch_hash": "0x4323628ddd32c2f622f2f833fb32304d1bfb209d89ac9a970ae240a5d0f3fa24", "finalize_tx": "0xc1c86ff00d4bc76b0dc58512be4a299372460a6923408dd8d2570821d3b7dfc0"} +{"index": 218451, "batch_hash": "0x21e36b0530a97238d34f67b2b86e40406ae6d238212ab096e245c8f89aa9f30d", "finalize_tx": "0x05290891ed36eb38ddf32fca2a8be563a7f0a89860beae31936d9354b9352372"} +{"index": 218452, "batch_hash": "0x37fc87437477d4c21cb8dc3cbb69bcf8a5bc19cead7b83e22014d3fa6924f9aa", "finalize_tx": "0xeb4626acb54282e2ff2b9b086e834ea17cf483ef594dba347bfb96222184c01b"} +{"index": 226803, "batch_hash": "0xcaf2632c125a8cb5711f29494543703558d254d3feaf976fc6d2d212464af2bb", "finalize_tx": "0x8b72849e4800e30630654d5339d619f9142e99ae7818146b067f6591ac696016"} +{"index": 226804, "batch_hash": "0x6053cc23e25cf42c9f53d9be8d8a8a5cd8e45896c33ccb834c3d350237040e5b", "finalize_tx": "0x638d21384cdc6740e6ede9bdace53f151f6e24d5618013ffad9c002934a9afd5"} +{"index": 226805, "batch_hash": "0xf2fc6d27b45e00a3f11f0d8fe716cb41825493a508a494e94b81d5cba0407974", "finalize_tx": "0x42df59d2cacb32b54e6b5f304da2a150a918c7ea250fbb5f822cd0686959e30c"} +{"index": 226806, "batch_hash": "0xae67f5a0603c4040d17cc974525ad8a72cd891ecfa419603eca7440f77d5858e", "finalize_tx": "0xfec64ac74582cc923a7056e904df463fb1c75166b818dc8b23ce33a95f862b5b"} +{"index": 226807, "batch_hash": "0x252947ebecb04013e13725d46718461ca8c0befa5598f9251f99c3d9586b3601", "finalize_tx": "0x2107f82813bafe531b93c0a29212d5bb8b627b7ced097d2cffe09bdfab2d0db1"} +{"index": 226808, "batch_hash": "0xfd86207e346d6964856d4223cabe342986c52b485c7f0188876c26004bd742b7", "finalize_tx": "0xd66bcd3f917f1637a449495021504fe6d285bb97e9e671be49c5a0692d2e2fc3"} +{"index": 226809, "batch_hash": "0x97a403cd2146eb36293f4e2841287bab394c41c3c0b2b50d7c73278f1c1d764d", "finalize_tx": "0x03b2545d821d62ed31d20c7f8da9469e300fd9a4a9942c24005cbb197c2aab7a"} +{"index": 226810, "batch_hash": "0x1b599cd94dd08856bb20ca2400e1bb0d51e7ec83f62abc769571cb5bc766254a", "finalize_tx": "0x6932871342ac8cf7dbb35ba0411adcd24c6fc353b1a04b217047e1809f7a9c41"} +{"index": 226811, "batch_hash": "0xee7f7aaf9a6b873a22cd7c9e29496bdeec816ff5a320b34b54ed7a0efdd9acb2", "finalize_tx": "0xb57789a812788960b826f7f16d19f73675b50c9175d40513772a700be68af5e3"} +{"index": 226812, "batch_hash": "0x11d85f5b48e91e0af61af8b8f1105392108656fabc962d5602f9b770eda78ac4", "finalize_tx": "0x2246ea3b4fc16e1bb4514c39eddaa27d3a71dfb642f11a056ca3e8b24f11f9e5"} +{"index": 231603, "batch_hash": "0xb3e0a6ed27ea568e6acd8f2b1fd5c1d88c549db1cb7b21b600058453a5f816f3", "finalize_tx": "0xd01a7bb3979167b659cb862765759611a56147b32b22a04ad55cdf24b259e127"} +{"index": 231604, "batch_hash": "0x0c294a5739d1eaeb17685f4ca69c1365daab292d396b510a9d57ce7b2aa54e0f", "finalize_tx": "0xcde6dc1aaa169b369100a64bb9289ad791469aa1fee867cc39f2dce0a9c633b5"} +{"index": 231605, "batch_hash": "0x390f4803eddf79dfe052b9901b6df79eb4110b92f2a1c07001e244b2d73f7184", "finalize_tx": "0x57bfb6f2060133bfcc5f922701d8522914da6e3bfa495e2e405d6fe17d30152c"} +{"index": 231606, "batch_hash": "0x63cf9a2aca482d232f9dbd738d61cf3f7afa45f1957de5794a34e861da9d1695", "finalize_tx": "0x7ef84f7a55544273aef6670674682051de81d29550da89c5b84e90adf2c6a36e"} +{"index": 231607, "batch_hash": "0xf9e42c1cf63e89aeaf96304f26bd5d5ab86ed7914fce2997d8ff3c8f40593135", "finalize_tx": "0xbdf4e0e5f0a217bba55a32e485ddb914f6dfb5cac675423094ed7b7ccd9276d9"} +{"index": 231608, "batch_hash": "0xb10222b6fcbc3811ee4526d6ac8617e8563d1d93e0a7090e07887ca0c2111817", "finalize_tx": "0x83aed6ee8a45e722ecfa8e32addfcf0ddfe1b9e13cecafa57cf79b082d4728e0"} +{"index": 231609, "batch_hash": "0xf89d7d79241fc6c2db4e1f573f4358ba90ed9f2e66594e490ca37be28c390366", "finalize_tx": "0xd23f361a95b2e932114aa8e5f1db26c3f1d77c1d4219dc2e3888928f4e1e2f27"} +{"index": 231610, "batch_hash": "0x402d04aacfb60ca83fbdcf763e485d2a232740ceea40d5bcfd1757fdaa27126b", "finalize_tx": "0x06a46f741f268e2e6eb1e349ea32367cd8e85a698552c90dbc7827a786f0637e"} +{"index": 231611, "batch_hash": "0x4c2901a0964c8d226723aba3c04f33898b2d4953543377faa5ec2d155f1be3b4", "finalize_tx": "0x5791b35a2d53126508b6440bdc06ee7ed87ca35b2dab56b7f64c3103568b096e"} +{"index": 231612, "batch_hash": "0x194425504f39cc16b61151a6590dc0df72f9782af410f04590d3126485ac309d", "finalize_tx": "0x49254963a9731968cdb965c9651cb53088721d3eacaf8c13590f18f47d78bb07"} +{"index": 233453, "batch_hash": "0x753b67a735fac5c5bfa9a1dbcb84db7790af5e7b3ec0d8dbabe8661c25b64f40", "finalize_tx": "0xddc72509fdce88905e0f509b2ed2e0b076166e0da35569d005370c00bcf9b2dd"} +{"index": 233454, "batch_hash": "0xfe69c166ecb803be4674afc599d2ac4ad8dfaa3b7afaafed63ab6d74a1d30016", "finalize_tx": "0xfae839f3845c41678606d2386c6b94071ef5d104425a8ad931936b0d3a40dcd3"} +{"index": 233455, "batch_hash": "0xb9f967d1bc95fcc44b48af8cb857af6c2dbcb82a0222c4f82567d04afd282381", "finalize_tx": "0xe50c6f647fd60cab2eb13dea583b8712a732ef314c409545d8f70455f2e014ba"} +{"index": 233456, "batch_hash": "0x453b0984b55f55827fb4cb7ae27b1b40f4b98757801a36177f83761ddad82573", "finalize_tx": "0xaee1679eafa3948458b9e94a3007970dd24e4240bc0df6a64aaa10487efa77e3"} +{"index": 233457, "batch_hash": "0xb8d1b4e835b37948db463b486d50fa9ad6c802428cd526700b3ab8e87122e096", "finalize_tx": "0xb95d17f60c7f338110135b57428c345a5b0a833980b0e0bbc8b7aae461243863"} +{"index": 233458, "batch_hash": "0xf266c2b69ebd44baa38412bd77e478ff1df8de3f13354fb8fbfcf098d36efd42", "finalize_tx": "0x54c146d1915dbc28f2fe32652f2b5b548b3b1a3543fac4f7b3010dcb56693eee"} +{"index": 233459, "batch_hash": "0x5a5cf45ce1603c36a0b69643fa841f685e9ff2e37b29446df30740860e83a25e", "finalize_tx": "0x6ec5036a46cf1c73c9be5c63c7eebaf8339f7eba1da3b53d7db1a3ecf7648655"} +{"index": 233460, "batch_hash": "0x5588847b811172867786ca5fb844e59dbf21556207da5ca00c20eec510d981c3", "finalize_tx": "0xb297568f4cb9935975fda06f9a6d9a72872fb279edca2bffc70517872c69680d"} +{"index": 233461, "batch_hash": "0xac04b7eb7f67a523f66f9481874c87629a16df5c9e60831e294f81b5b653343d", "finalize_tx": "0xab58e5b7afc5390687ae067a52b5c1655e9f4b680a44d2e4774a205fb89fbe9e"} +{"index": 233462, "batch_hash": "0x27eb8c07a38f69c264069760e0a7b9f9b2ddf2642eb143639b3f83c329c379e1", "finalize_tx": "0x3da417e4988f1ac5036ec0f8fbe1008ed36e13279c6351849f68870ee325be92"} +{"index": 236213, "batch_hash": "0x099d4d01fa6bb5fc9e5f3a4ae5e3a71c3e279eb234c1c8246798daeefc4c0fdb", "finalize_tx": "0x7e3febc32202c5b9d442ee1ed8e477149133a523aaa9bc79fc331d5660353c28"} +{"index": 236214, "batch_hash": "0xc4a4c82695eec48232e2faa1fe64f4ccfeb346d562f17a8fcde55244e91ba472", "finalize_tx": "0x31f4eca26fc2120f97e54d7e0f78a7d99f0370b704646631aedffb929a1ba688"} +{"index": 236215, "batch_hash": "0x3939686f769e1141bb41a32d5d4d838622e7646178494cdbd4441b88482b750e", "finalize_tx": "0x80fcfefe22d9cce32279bae65c8d65f3f641d23f72c22ba1e38997b20b419c54"} +{"index": 236216, "batch_hash": "0xd4fa76fd18c5975ac290d5ffa65c322b461ea13b364ea37a103d005913946787", "finalize_tx": "0x7a0ce5990f69dac817ac9d3d0fee15a59260c09b0bc0c4c656f3848f347d5533"} +{"index": 236217, "batch_hash": "0x54e3532fbd27327311cbf0843ecaba7fbac22d56bb45f120da03f34f63ecac49", "finalize_tx": "0x770ee13d49fc2ffd928505c96c87a56a79d3160bcec75ee27315701ace230d51"} +{"index": 236218, "batch_hash": "0x77ad3647a730a5990e6e9ca7942f041f50e15903077c352f4eac8f80c3e89aec", "finalize_tx": "0x73f9754ddbf11071dae751d04c6140528c5a4ec3e0702e34c5574021b581e10f"} +{"index": 236219, "batch_hash": "0x77f2480003cab7644c1f5ea1de2046dc63dc3af46e2270996c81368d5c478e41", "finalize_tx": "0x602468cfebcfb8a35729536176917d2468b567721be71487110643d1c441ab06"} +{"index": 236220, "batch_hash": "0x2a44c49cc98c6521dbcaa0af9e56a126980a846df68925fe0f178cb67e811d31", "finalize_tx": "0xb5c753235a51936866d4ccb617aa168d135552feac9ff40b3cd3ff54fc38689c"} +{"index": 236221, "batch_hash": "0xfaa07379cf804399b4763386e6ae262438696cde04331dd25615b3239d5f4076", "finalize_tx": "0x4b39280f1fe42d0fc44c485dcc269637825cbcd33e2e5fcd1a5911e527278527"} +{"index": 236222, "batch_hash": "0xdf7c737842725c7cdb68b5bef8f1074879bb23787cef75e19c34b1c3fa97c6cd", "finalize_tx": "0x99606cf1ec5e3d6035cf441c909add5594250ab34eada7d1ff06274d923c2030"} +{"index": 237093, "batch_hash": "0xac10501ac3c33ad822797a6b7e3a45e6664bff362096ac26c7fc5e412dfbc1af", "finalize_tx": "0x6bfa7dc4a08ec9b51c12218c117bbf47d89c26e2e2e0944d6dccf220db9641d1"} +{"index": 237094, "batch_hash": "0x4bdee83370bcfff2c214e7f9c2060f3e76554c78b36d96f66d6b3781abb59b09", "finalize_tx": "0x1bb4682c2d25c744cdac05f57c900a0be166673c72b3260abe33266638e65465"} +{"index": 237095, "batch_hash": "0x27139e45cf04e657adadee7a9fafbc87ae6abe07b4b2903ce0cfaae64782b54b", "finalize_tx": "0x5d4a2d3c1bfac09d08f5f2ee359ebe06765afcc6e4879de70460fb33fc5b2bca"} +{"index": 237096, "batch_hash": "0xf7ea184f986a5796ba94766c62627cd1f508e510d88303a72375e023c96bb6ac", "finalize_tx": "0x2710197f1cce75a6471f8eb4680b173c875e5ad90c3fc95b3b65a24370430439"} +{"index": 237097, "batch_hash": "0x2842772b30f92d9a72233a2f2b848fe38bcaf6a0ff009881e973a1205430c565", "finalize_tx": "0x8f80747aec392b123d2b78192faa10a93a8b6360fd22b880b5f15b5a6c4f7589"} +{"index": 237098, "batch_hash": "0xa18e7cf80d3aa73db77a948379579792124cf58219cec23fdf3260faab51a035", "finalize_tx": "0x2fca61a306e50f8ed9abeaf6d3ca652239a9b0f1c0faef1ba5d3b0b9bde5a2eb"} +{"index": 237099, "batch_hash": "0x16c2aede8272e449f54e5ad6f0f47989ba726f36699bc9f44920dbaad98670b9", "finalize_tx": "0xfa375d9da25ba53067454f86f142c146d81659de35026adb5d99fb6e56904562"} +{"index": 237100, "batch_hash": "0x2e32b3c0921afc90650675e9e4a92858b159a14ce7c596aff5b4d87659d0d23b", "finalize_tx": "0x0cf1b1622a6ae08952c0d025c42cef08b0b0db436783a477d063be9e29858d79"} +{"index": 237101, "batch_hash": "0x011e90c1ffe4303a69a7f1658c1fc3fd8a07e67527b0ac9d634d7f3b67d3a078", "finalize_tx": "0x899c1f29ee81f91d96fcd2373905b9c03b20958b8673f1ea72c80c789dbfc1cd"} +{"index": 237102, "batch_hash": "0x93284087445d149f6b460fa089db5b959bb7de55f806a1aca4d302d7d22cd997", "finalize_tx": "0x9f308d92e13fd9a012206b6a11f68b63b102e45d0892ec23a8fd168b5577c212"} +{"index": 238403, "batch_hash": "0x2ee9e5007994515e75bb13cb24254b5950172b243e38f7849590a0f239c5d532", "finalize_tx": "0x68458532df4dd457e2293343ed4143e71b239aa99394a066d60f24ff267fd962"} +{"index": 238404, "batch_hash": "0x009ea715cb52b0a2996824b541aa840bd5cfeb75d2e232c6e7a98be78ab5aa7f", "finalize_tx": "0xf3e08939219a10c5579ac55b59b3c4ddbc30ba07d0642df7af583d25bbb33dc2"} +{"index": 238405, "batch_hash": "0x5fa424514d322d958a309564cf70369ec50b9777d494ae6f0b762f872c895810", "finalize_tx": "0xdb455a354bbde1d867151aa2de47e820b57207b6fc79f6b9cb569119ae3801a9"} +{"index": 238406, "batch_hash": "0xa1b30fc811c9c68e69902a2b0c4edc6f3ec24f3e2c38b4e1e8ea20a5a0c1b520", "finalize_tx": "0x62365404dac0dad0e6077aed103d1ac5c64a0c07b40e938214729cf83357d7bf"} +{"index": 238407, "batch_hash": "0x0d5961cc0216a628f931267dc1a36f0bea0872a8d1c152079b136dbadeaa6825", "finalize_tx": "0x5cb16add444dc20a5c37116dabf000ce6abbb0f315f52005478326bf51ebebd8"} +{"index": 238408, "batch_hash": "0xe70f1e4fbdc066186a9f7b1614077298eaa4a14b0d1ed7a617776ec571fcf08b", "finalize_tx": "0x1ac3b46dbf4dadbc72ad85f84050cef79279313af325d4bff6e392089ba8b079"} +{"index": 238409, "batch_hash": "0x033fc9bd4a6c04917aa0931fbc48631980db08ce32e76e3880e425bc9715592d", "finalize_tx": "0x63324786e606b40e7c1ff87ac97b9d470d8aec39ecd1dc20f0d843747aa02426"} +{"index": 238410, "batch_hash": "0x8347f3b3d10e91f2b5b4ad6da6fc03b9e0ecb58dc1172a8377866c4843f66bd4", "finalize_tx": "0x61c45cb300f51cfed8d36b6b62cac632000dd3b82ade4a1b2a1fa82eb77e0611"} +{"index": 238411, "batch_hash": "0xf9be013c01b5c78c1b15a447f64093e41b13bec2589022150603fb559c9df312", "finalize_tx": "0x429d522021753f186bd3d0452255300ba2939b3a8198a2096e0edde32fb4b4d8"} +{"index": 238412, "batch_hash": "0x0bccaf4ca06751e216a26d374b24aadcbf74898da857428f40c478d6f90ddbd4", "finalize_tx": "0x61d541fe1ac2fbc8246dcd0c88d2e0a320a244418c166e6dc15f2fb4b98dc91c"} +{"index": 252313, "batch_hash": "0x1ea18e933cf2cc7f54bfade5bf6773199d619ad6534c824c87cae1f4cc79a0fc", "finalize_tx": "0xf2963ba11573ecef68cf01e119a58d6cfef46d7def04d52d51fd0f5003bd5ca4"} +{"index": 252314, "batch_hash": "0xd60f38374e99aceb51f252b3978e98ec82b6e9de95858ee6c2b2987465bfe28a", "finalize_tx": "0x09718a40dedcac15f2dea4c5bb7b49c567333cdd52bfdffc9c055bd8395a74bd"} +{"index": 252315, "batch_hash": "0x45101f10102557612343f10681e7b2c64084bac5c4c9972def35bbe10896ebb6", "finalize_tx": "0xfb6aae745c1b1d4872861d1f4a655d50abea6966b26b85b1ca6033a236049a40"} +{"index": 252316, "batch_hash": "0xaedab44946d498146937203d352bbfc5fdc2eaca54a363ae2d8c185e045c4f70", "finalize_tx": "0x4d92fed1bae3ab94ae669957654ba483cdfab270d079d3b0109e79d25d8eef1d"} +{"index": 252317, "batch_hash": "0xc1d9d6095be4614496346694acd60921b49c76fd1c6ea4581a541c4a1123d00e", "finalize_tx": "0xf27510ecf762c91a2dc3def70060cded0aa18127f24759311cb742c7e46aaefc"} +{"index": 252318, "batch_hash": "0x8447d77dca12d3d5d18c9921250dff9d4b2b8484845b4cedac2caa6030607239", "finalize_tx": "0x1dffc1e8d067dd68552bdc886707afc751e52fefd6c12f9cd927c02e3ce50ded"} +{"index": 252319, "batch_hash": "0x8b2563345610cf8f273c5bfc5d9cd7fbaac5386bf45af6ef2782ebc0e2e7926f", "finalize_tx": "0xdb406856cbb912313038b46c8e40a7419bc7342cb6646523b431b91c982e4b48"} +{"index": 252320, "batch_hash": "0xc2c75784d6b683e6949d40e53a28b86cf02c597610db5b0a7a455eda5cdcdeed", "finalize_tx": "0xbf207df07e5abb57ca1deaf54c1ad4a0d9c90ceaccbaab5c4d0119075dcdba4c"} +{"index": 252321, "batch_hash": "0x71c0ead56ccea83b0a282a829c04dc79dee4cfd080d61b4524b73ef1b1708063", "finalize_tx": "0x5f7f5400fd2d80d23c4db1225fa704d6485f80be34cce8ab9393fa0248202ec8"} +{"index": 252322, "batch_hash": "0x1ec4b0ed7e807310c2f2b3b14d618ca8f62901bf3e761d7293123457ac4fc568", "finalize_tx": "0xa59f9b63de274ae2c10307561322b427a7ea5dd545463556caaae4dffdbf1861"} +{"index": 253043, "batch_hash": "0x0aa2dacfec340eb96c93689113150fc173ddc5121a8767aa48bb17da85e4bc28", "finalize_tx": "0xf5458b782f4c9bdc26934134376d3663f09e5e2a30e5a27a94eba179787d8061"} +{"index": 253044, "batch_hash": "0x195aa4ecfe0b6616629f1efb00b6d3565530fe551a8111adf75edb18718af626", "finalize_tx": "0x1cf68d863b789f6ea04a1f36b752ae9a577f76c87b15ceeb7f8d929a3de116de"} +{"index": 253045, "batch_hash": "0x4e62f7c07dd88c48465e3bb31900d8683b72f6161536bc1cae76c2cc6b19a398", "finalize_tx": "0x0ee683da456762cf4a9640294b3f359ef8815f9aa3626f123a925466710115b2"} +{"index": 253046, "batch_hash": "0x34bbc4a6364c89d56fb3175689b613b665677a3faee2fbb301d0d834648de1f3", "finalize_tx": "0xd421843ad57b14280ab8872d37d18b751d9e599a213da88cfda3e6fd01beb7e5"} +{"index": 253047, "batch_hash": "0x869a8149d6c7041f48fd983e2b527260e5d3d9dc95f148290f92ab558f8cc47d", "finalize_tx": "0xea7a1773273676f04dab5bf914e11859407f3436d3cd28dc3f760cf2bc958a59"} +{"index": 253048, "batch_hash": "0x2afbe288cacfab1933f8d29d38425f53ca8f93888a6e4eb93236e57fe7f0a303", "finalize_tx": "0x827764950608e709244b8802e0f7a735d5c7fd5f7847e8b05ed9ebc920698bb7"} +{"index": 253049, "batch_hash": "0x8d4890d26cba9f2c620f6014ef84315e03d4b62073248fa79275435363da3f7d", "finalize_tx": "0xaf4a54173f84df69911a8b15def5fda6b9f332276c629be518299ade714b2900"} +{"index": 253050, "batch_hash": "0xd8dfe69e2c7eb85de5a417b95495c2de36e2309619b23d733036106e462ccad2", "finalize_tx": "0x0a203d86d550cd0d2f80d756e4469b667579495ad8865b8feda726fd60b8a0ff"} +{"index": 253051, "batch_hash": "0x98091ed188a5282e43c8e125dfe21bd948256e040c4375446830a22b0b8a5b30", "finalize_tx": "0xd5efdbcfbbc2bee6d15c4e7278930890655616a535a4c15d7bce35e5ec54e394"} +{"index": 253052, "batch_hash": "0xbd8f6c874b6535a3ed1c6efaee01f347cd0243412e216354871db9d032c553e0", "finalize_tx": "0x0d3cdd7f90ca763cb20db604704cc8ce2b09dc1a4f97d65e7b044cd526ad5f0d"} +{"index": 260203, "batch_hash": "0x6a4b7c05863a14a21d859bff26158459099f93b3943b3c70c0ef8014ffef00cc", "finalize_tx": "0xb5b499addbd8420a147623c9203025e1fb3517138e80e1ecc8485c5d5f2b022c"} +{"index": 260204, "batch_hash": "0x62ae8b0ef254043f326dde1bbdddff037052263a53abb6c67beaea460043df9b", "finalize_tx": "0x048f43307a4d05330126e2ad1cf50f63085e9c7aac31f5964edf02e0a938b22f"} +{"index": 260205, "batch_hash": "0x3319b7773214aa27688204ce4db8ebfa4728e2d57262fcf7fec1384ce027f889", "finalize_tx": "0x8f65182aaddc676370f280769a47e58f452901025ac5bb9a43ad01558772e702"} +{"index": 260206, "batch_hash": "0x505f518997900bde7096dbb6010c61d7be72d11d940f6ff600256f0796dd25b9", "finalize_tx": "0xeec6054eb82ba922763f55dbb971186aa3eb5d72639dab75c3069e577722b35a"} +{"index": 260207, "batch_hash": "0x27e6b57f832467ef5a93a1c6daf4799911006a714453e19ef61f1ad13cd19769", "finalize_tx": "0x4828b6c787378a0dff79c24360c07c24ca3855231f9ddc18407c905cc65d0c32"} +{"index": 260208, "batch_hash": "0x74914cc0ee9141e4c5e088848c6ad19b05424c79d0504e421b16e3c015760045", "finalize_tx": "0xcf186f98c412e06f3eed3c58b57133a9872693b6d6a9334eb3cb4bf6fe396f64"} +{"index": 260209, "batch_hash": "0xe9a429bdb187373e22d065ea64d260a451c940a886cd9d8934ce4ae20fa72b9d", "finalize_tx": "0xc581db9a16422ef5b8a9b32b1fc53764975ee8357d36a7943034fe390fd94916"} +{"index": 260210, "batch_hash": "0x6ee1faeb038a0dc387d509f6dc5b1bcb1ebb60e9c19bcd46a44f2653b5e3b52b", "finalize_tx": "0xfac3ef86fe39e6b1e6b5fc10c82667bf248048510d0fa4b2069bd81900589daf"} +{"index": 260211, "batch_hash": "0xe7193eef35efce76f81f3bea1660f742aba157f0e92e3e3fd3d31abc3b5b89e1", "finalize_tx": "0x3ac482ceca68eeb56b6dc03dec16a79aa7ef36a1e77a839e1fab10aadde5875c"} +{"index": 260212, "batch_hash": "0xef09103cabdc3171736592b02ba4445073b6fd8ea95564c8af07a32071b45d9f", "finalize_tx": "0x010c50111a61fe5931e55fab3b7c475550ffd9be986a06bea7d8950954476770"} +{"index": 266073, "batch_hash": "0xe42bcb8abff5350759d1d9594795ee21171daeb6f0b244e81300920ba5a593fe", "finalize_tx": "0x7c22a0cbb8143487fc01d04966b0c3a3ba5af4af233b92d359c5d4fe5dbfc55d"} +{"index": 266074, "batch_hash": "0x9aa061889fc23098cd868f03bca56a1af39159ceb5ffe8a6c6d1edb31dfba1cf", "finalize_tx": "0xc42fbf5014d6e84ab7928acc925ff5d2d897178796292c363c80d5a21f21a108"} +{"index": 266075, "batch_hash": "0xb614a36c98d8fea3b76beea96373d9567baa021a8d1d6eeef946aa905abd4ad7", "finalize_tx": "0x2da1e6cfc05d28bb446313246892a6539ea773f145d00ea2646a32810c16bb5d"} +{"index": 266076, "batch_hash": "0xb575b785353d0758f168509e8642a137ea2e08b6d689d24a5dbd637fc9b581f7", "finalize_tx": "0x1105a906194a4999527af1828b2b6da3e47898c231a5d134cf098390d2fb0ff5"} +{"index": 266077, "batch_hash": "0x900d29d81392014dda06269241e244065e0da53f91e1f09737aa8581ac69caf2", "finalize_tx": "0x91e154048f5ec8de83e7624f65be0843771470e6488c2bba1200c5c3ac04ef61"} +{"index": 266078, "batch_hash": "0x8af80e6d81287bae634bc6b470bb8c58b9234d3f6dd5dbea7d66bac8b465d4e8", "finalize_tx": "0xe6fbad0d44ac280f6162dd4491c153b39920b4e861593468e77f1c9c1927939c"} +{"index": 266079, "batch_hash": "0x855df99f18c32fc38987bcd3d2c9ea1c2c80d59cd3b3980c852ec8abf4f55d06", "finalize_tx": "0x28f13a457e558c02f60ca4e08ac05090b625dfc61e1d39c2040bffa088d1ff63"} +{"index": 266080, "batch_hash": "0xd001b82e1eb46ba4a6da53d271eb4bb17b53902c5363439d58ab8dca59c89118", "finalize_tx": "0x7df9480f638f7d567108488c1f516ca04afd5f96f1b09ae89149008f98b1316d"} +{"index": 266081, "batch_hash": "0x7179c0e520c092ecb032baddc6d54cc8a40d299bc71cc444ff7c485899050b84", "finalize_tx": "0x78111a1cb292b8bb2ed55486c82845baad5b0fe5037a5657fa3d73b93031e281"} +{"index": 266082, "batch_hash": "0x4e6b0c471cbb50ac68e008d8159e8dbf7a65a5f2dc34bce191095d82b9718963", "finalize_tx": "0x8c91e48076217853ff286ed1c39f3ee3ecac880fcc70924670c07f0be67ea3da"} +{"index": 267223, "batch_hash": "0x15e15d9483894f4df1a289ffb3779e7b258ea8c2c72870b35f6ed2c262107af1", "finalize_tx": "0xc7a71fc1477f8339e3bf6240b659a33cd7494f04c0f0d004e341b7b06db052a4"} +{"index": 267224, "batch_hash": "0x0907bf972869622c24c0040bd7adf3c502f5d5a1ffe9fc9235b5d2f655d9e66b", "finalize_tx": "0xfa2602b681883f93b422e55d061e3ee1cebdf8b46d2fa7fc13bd6cbe6edcf502"} +{"index": 267225, "batch_hash": "0x093a1b29307c508f3cb7414ee95bde8d9c1d1b7c6a063891f6f42c033f3536e5", "finalize_tx": "0xdebc3229a31e201666221586f89706c51a46303a609f2ff9dc4e27060f5ec52a"} +{"index": 267226, "batch_hash": "0xbad1841b3717e553360c39b4c74dc584e5c3580e70a52b7a56fcb7563bcf0436", "finalize_tx": "0x712f2cacc210cc8bb3f830bce25c6fa85c69d0630de8a57510bfbbd9c0502a70"} +{"index": 267227, "batch_hash": "0xa4867396b2960e31af78865fe663b9cec8897b4ef73be64a1cc826ce133eb4e5", "finalize_tx": "0x87f4c5241588cd80022844c34e7929514a6f8bb1dda569acd78a1a416d909d37"} +{"index": 267228, "batch_hash": "0x3c199d311cb244d7737485f7f38ef723fa9319ba98d40f16255795940482a519", "finalize_tx": "0xa930fec9d272d558dd2b73d8b336500369bf97879cb637355dabd7eb7965b791"} +{"index": 267229, "batch_hash": "0x23ebc064696ee8481231da92872858218c1aef001e704728fb7d4cf6833b21b1", "finalize_tx": "0xa129223624b4fdee563b76846a66d07057d3552e8067a3269e7c836ca7e94467"} +{"index": 267230, "batch_hash": "0xee4c7def2a85e79598ec0bc76ec485ddfc80e6520a23e63bb96c170798f2e08f", "finalize_tx": "0x421f99859ff5b49d167cc129398ee358cef21d2f1942c8483a118b4bec696b69"} +{"index": 267231, "batch_hash": "0x431d4c20cd81f2681294d952c638c40c90bf29fdff0b1009813fcfd23f7d8e53", "finalize_tx": "0x87c437628334248930b26c9364f5f3ec8bdebcc158cd09f5452c1f0b3e91703b"} +{"index": 267232, "batch_hash": "0x70f2288680d1770eb2e6953094fe1ab67e5ffe4c013c2b892ff4a8fa70e32d63", "finalize_tx": "0xeea9ee1fad083fb8e761b9ccb914f47f5542a1c31a5f49be037d5c7b6a51c2f8"} +{"index": 268023, "batch_hash": "0x2bde7e4de6b7ccda07c2cb7444aaa4e7a8ecc83adcd36133db19b24ae2cc8bfc", "finalize_tx": "0x26ef13e846e787bb100f30dddec0752248e36145532b344306828a643838d467"} +{"index": 268024, "batch_hash": "0xabed143776c71021393193234537061dbf8b32b4ef16db2664283971bca5e1b1", "finalize_tx": "0xc48399bd014c8e3b53e443a05f2a01e6225a2acfd8213b010b92daf25f3bf5d9"} +{"index": 268025, "batch_hash": "0x77796d6215eab3f7f99f0a859e0a0e0f688200f6241cae6734f95b4f624f9f4a", "finalize_tx": "0xd5a814afa6fad698efa4ccf0684d3b26a51063a80f1afa9655ed0c31e0ec0e48"} +{"index": 268026, "batch_hash": "0x48868d6504855baaf8e037f96f2a179f9e9084fb8483a2acbcb57f2ffe5ae15f", "finalize_tx": "0x12b0ace707ebb41b55fad44d3717848c57248299efb48c10d9791b9d1771d45a"} +{"index": 268027, "batch_hash": "0xb625245adac3dd02e155b97d2ab65043f14243755d86e2c8c33d4aabf82c6070", "finalize_tx": "0xb1576bdbd3a0bfe857d35cfddf7beb81a8dbac7bc049eb26f38b6cdeba0ad8e7"} +{"index": 268028, "batch_hash": "0x13b8303b99f1d837c1e82a5c2dab750f3934ba2274ee2706984b9c31bccdb40a", "finalize_tx": "0x6601dc60d303aaca2c61ef3dbe33a53ad3e0c044a2280f7e9c5bd8c25abc7642"} +{"index": 268029, "batch_hash": "0xc25b68867dcfb25a1ae2f2151bb2b93d3d7f39cb0e3b9ce9c244c070a378eb3c", "finalize_tx": "0x31421c3fdc908a0402e28872da06910bcb0e24901723f745378577a2671b6865"} +{"index": 268030, "batch_hash": "0xea49ac129fd8d31e1ce1fd533e045d50046d71a9a8aa3050f04b19c18ca211bf", "finalize_tx": "0x9ab2491b23f18b85808cad6c13f228dd0cd0c0eeca58b61b1bfb17bee39506b6"} +{"index": 268031, "batch_hash": "0x78b6cb55f3a904117aebfd75c9e15bb2f343a9a7ee63ce1600dfe4e63b20c011", "finalize_tx": "0x2fa1e958703c6f173b42dde32c0dedb65a9794f2ea4a8ccd66a4e7618edec4d3"} +{"index": 268032, "batch_hash": "0xfe4d4e98d657be10d3da4c216ebf2078c71aaa0ea37d35633fb5617cd99f014f", "finalize_tx": "0x8515d8fa1d7dc4dd21fdc668d608ae7bbf8bb04cd8a1b87af78606d50a6d762c"} +{"index": 269563, "batch_hash": "0xa1e93daac5b8384884480ad088c0de09cc30c3f146f9b17c02ba2005a9f36e50", "finalize_tx": "0x53952c8da73240eb1ab4275478501c73eeba957008e7565311a5d251aeae5c7b"} +{"index": 269564, "batch_hash": "0x3725d80cd67e6e3fbd9ce8dd32e66f74a40a60da56decb1441ca884f8f1241d6", "finalize_tx": "0x0c623f1fcd836b0ab0ae1e47035101c9ca3796b300e6af0ebf676396df2b58fe"} +{"index": 269565, "batch_hash": "0x82a73272e935fc6650be611ca0b7e3e785cfc2ec43a542304d0516597501399a", "finalize_tx": "0xf8856ac98869318c0bc76e9a56cd03e5ab222f6ce095f9f0708a1d868e402492"} +{"index": 269566, "batch_hash": "0x455c99fa19e8cbc0e318977be013cdd613460a04d0bdb8f9ce80752bb5c854b1", "finalize_tx": "0xe9611a7e5668f46f2be50642823a6b48ed8fc57c57c9e3852be4f8f242b88961"} +{"index": 269567, "batch_hash": "0x11a872a9b484f8c1052118ae8aee71db74366c05a3d805a9af3c6c8862fd2a39", "finalize_tx": "0xecc5d912e51ee203891ea7436a8e0b05e39f24e096ccb10194d112634e99c663"} +{"index": 269568, "batch_hash": "0x284559427806ba27cd4a6091b3139d848ec454664f65775838622f702cd62b88", "finalize_tx": "0xb7d292a1f56508e7494872ed0bdd645764a41b7a5f9af4fa3c58d364c55c71d4"} +{"index": 269569, "batch_hash": "0xca128a3d430897b74364dc37cabae62b40a516bc04d8fd7f30a1658302ea9581", "finalize_tx": "0x3275ddb9e988ea002d1cc2b176368cb64728479470dc4fe25e0bcd7707cda401"} +{"index": 269570, "batch_hash": "0x41fbd65e96d8a9e408f1432a68a982f394c34bc3cf716c0b4337c9ee6111531b", "finalize_tx": "0x1ccce5f086db47cbc2c99e6a3b69c81f161e1af1ed3c16c4a70bfd50795df572"} +{"index": 269571, "batch_hash": "0xf2e662558d3bdfb0e554499067f6becb85a2c3d780c733b1f3e2830115c6f8c1", "finalize_tx": "0x61fa8feb9ef3fbd6989a347b0f58e7df73fb340d73fa884f10980e433c7ee23b"} +{"index": 269572, "batch_hash": "0x614df2648f6b10a9b4bdcbdce9d632a5484382958ecbe91b4648585152c87fea", "finalize_tx": "0x8d533f8038e91ed94a40e8340774dd8a385964335691c15ca1d619cf4933cb54"} +{"index": 270843, "batch_hash": "0xa9db9af1208fb967696d5a0e45ecb9e4bb3a597a7bdf5f17c7875c6bb5b31999", "finalize_tx": "0x1fbcf77e0aa0c1b46bcdf9dd546844cac6016134b85c18239fcff2f70a835e55"} +{"index": 270844, "batch_hash": "0xf4d4845f2e338c3a9e6a0dd515b0c3ae81014c13dd7175a5bbfc0b0abedd6f9b", "finalize_tx": "0xb53d48572ae5a32e9dfd552f5a65b03f76477e01bc8fb8ce33e611bc8e352dcf"} +{"index": 270845, "batch_hash": "0xa0da23f30ebf21e207dd7ca63a7b3b2018d52a917b5130244a9a2671f10fc3bf", "finalize_tx": "0xcbddddfbf2424234c1f27ede447aae9fa5daece01e270fd9f67eb1cb2a1d7dc8"} +{"index": 270846, "batch_hash": "0xefab8c0d312e41383174371933c1d06b798d7845b30fb44ce23089a21fdf16f7", "finalize_tx": "0x4dd7b00e79a6b5abb1bd1c8c79bedd0b1f1fb7eeb378eb30b253cb8484c07469"} +{"index": 270847, "batch_hash": "0x9c1e826674eaa946fb1b0099abca0a727ea6b9ebee610fb23589c2880e43507d", "finalize_tx": "0xf2a1833f1afb1292ddbe8de97d3b135474f455b4dbb6a70cfdda50a11e0cbf42"} +{"index": 270848, "batch_hash": "0x308957c8b9f18b5d6bf41e854108db548ffd6d65a46b08ec32f90ee528bf2e98", "finalize_tx": "0x1b9175cb23b8fc0ff618e8d88aa0f6ad31e1cda385cbfa9e93c412cc01e74e2d"} +{"index": 270849, "batch_hash": "0xff2772a06b451f181cb54c5b7dcacf7a0283a441051874e30c3704f77eb5bc69", "finalize_tx": "0xc624813df1a89280b8825abf3f695402f9b3052fbc5fbc6ab70e13cb4cd3fc89"} +{"index": 270850, "batch_hash": "0x9c0f186dcb67e123a3d11f8c39db76f25bb022bc78edd431b9ef6be04ecac983", "finalize_tx": "0xeee01fb9f21d85ad43dd2830b166bf68bd55b915848d0f68e7cfb3c96b57e59c"} +{"index": 270851, "batch_hash": "0xd796f32a3a292226e38da1f764a421ea9e98609a171d236dabe6d2e6a5f255ae", "finalize_tx": "0x13fe86b233484dfdc5c667faa6bb1ceec0a2bfb78c0afa7a3a017be4f1f8d2f6"} +{"index": 270852, "batch_hash": "0x2516052272961b1bfbba6ab87d658fed00fbb4aa03979c03f8ec1ad08513a9f2", "finalize_tx": "0x8be409a1039d82e17bf8d8b203e633ca2f34a7ca0da4ca14070cafda23fb446f"} +{"index": 271753, "batch_hash": "0x70b42a54ce4fdc83bdf2e28572adc782803160edaea26f100e0f9eb4aaf01d35", "finalize_tx": "0x268eed41a8438296125aee93a96b28c5cfe2f726dac3aff20767fdcf3b7d12ff"} +{"index": 271754, "batch_hash": "0xb2ca84cac2db743d8b1a29f6c937833a38d4c9f75528b8f0b9457c477af109c6", "finalize_tx": "0x20eda80aa398a6732c8bfedbaacf97c935b67f24b6aa81f8dd3fb39be23e0a83"} +{"index": 271755, "batch_hash": "0xad697f50c65b5703f39b0ed279438ffac163277f1f07b83bc3d5ddf6e1e8ba5b", "finalize_tx": "0xd7d285d72d99df04aefa4c0c75d5c1882708b248f6b75591b138978f30ea863e"} +{"index": 271756, "batch_hash": "0xf065ada6a0c42161c5cfb82d55ef4654d5a6735d4bc434ba6e78a0613f1562f2", "finalize_tx": "0x4b443ea4fa4ef83e400faffac69939d5a6c4b40ad819d13765e0b91c0c3f3372"} +{"index": 271757, "batch_hash": "0x8dd5d00a723c300efba71a1b7dbf7be82880d56b498b34d7f806a21fb8b0d909", "finalize_tx": "0x5b629a12f9412a18638b1afcbe171cfea236a6f4c8fe242ef1e5e32d9938d249"} +{"index": 271758, "batch_hash": "0x7813f0894617626b83c628256280e5ac2262608ac972098748e3edf90b15cde1", "finalize_tx": "0xc12f491c0e94f495f2c0639684458c4b3f95e1b2e307b54ec674975fea36f260"} +{"index": 271759, "batch_hash": "0x9afb725ac76c4fabaeca9c5908b7aa96d26ca024f6ada86523f200d20944d708", "finalize_tx": "0xf366d52a0a3a30fffb4ab214d79237e21fbfc47ba6b230669de7414d88f0d9c5"} +{"index": 271760, "batch_hash": "0x4ef51278560895e1595c4f2909ee4756d5ff8f4d9f3005f755ca135bc0d951c7", "finalize_tx": "0x416d364279cfd669e39d83a567ff380bf7c05ade8a49c64f357ad2ee02282431"} +{"index": 271761, "batch_hash": "0x662da821d4663b7e95a9db630dd4cb60a461b53f29d6269abc66cbe44fd45181", "finalize_tx": "0x351db006536fe99f8527beb5196b89e7a2cbe38f4b8058612f5218804965b4d9"} +{"index": 271762, "batch_hash": "0x05b5b411de3bddc790357ba9ecd18d66168c12baac2104be91c28052c91e6083", "finalize_tx": "0x1e71cfe8ae39243236ead4419d077a165b4ce8d63df15829469a299658f83434"} +{"index": 271763, "batch_hash": "0x88f993da0de33a1f32df5fb2eb94c1786a242aeef1a3f808e003d1d28a143d19", "finalize_tx": "0xf31def56cf2e19caaaf864887ce01843471fd5bdf48db533c257a6e84ef0aa72"} +{"index": 271764, "batch_hash": "0x1fc762702c2ab519298ad0adac0307bc113679985f0d3b89309e51dd1524de2a", "finalize_tx": "0x5d6d0b94c28eb53eb9ffd963dbd1d7ca13608d3e5b83b40253febdc2c619a3ca"} +{"index": 271765, "batch_hash": "0x3bcbc5538ef35d3380911999be5dc6f87325f282c2c5de293a4a3cc394eecba0", "finalize_tx": "0xe6f097480f8bc94c6be5304c88ce6e4619286a31a90df4d26ecbe443e9efbdc0"} +{"index": 271766, "batch_hash": "0xb359dd175130fc2acf1a2a9123496be9d1378eb6289ac3994d81973e363d47d5", "finalize_tx": "0xf5a951f413e178762bd5c7efb0c3bde07ff84ff315be668a7e725cff8140700e"} +{"index": 271767, "batch_hash": "0xde6460ac620107b1b9ad40f81a8b092a142ba898bb396eba5d5b61efeac4053e", "finalize_tx": "0xf1f5b39ee7621e30c19f8f20c1bac7d2a52143f34c5de09dbca02124e17a133b"} +{"index": 271768, "batch_hash": "0xfea8fdfb2a82ed8ef086a93a667c07e0103e9c1b9be495f633f594c639491dfa", "finalize_tx": "0x97a166ed71e1a2413325e604e47dcc199655ecc05bad931c8c236a1c64aab671"} +{"index": 271769, "batch_hash": "0x9d4cc25a14b61b75ab69725894186d5d4d6d0d209809f153e796a7d459730aed", "finalize_tx": "0x9a1e263cea1433e3999b326073a1254ade5dc398a3e87266ad6115bca2f083a9"} +{"index": 271770, "batch_hash": "0x45449aa26ead9458849f0e12516c427419c492a1177087dc7ef0bfb97e0a3ece", "finalize_tx": "0x13ef25294b8240a98c0ebac7c475d49c0e818e242d7f4f0a5dec7126d6348070"} +{"index": 271771, "batch_hash": "0x679a3d6fd79f6a74760f6efbd33cc1c939edcf6bd9bc316eaed9f7c73e571201", "finalize_tx": "0x1825ea57ec679eac26946b1c6d3ec1474ea1a13e98896d2cf4809bd1219ff21e"} +{"index": 271772, "batch_hash": "0xfff66bcba45ce86bf1c4fbe5507a9614ba787718ed844b3a7835df5c48d8184c", "finalize_tx": "0x7e28d93bf7ff54d6dd6171656bc19cbe4b794b82b9951bc809dab3a06b3ee9c9"} +{"index": 273093, "batch_hash": "0x9d9b448df6fa10c40967757400b8a182e58d49954491b087f6e6c7cc2630c279", "finalize_tx": "0xd8bb7f7ae63c15767c8431e5732426646ca3d883f404c36aa140f58456616c09"} +{"index": 273094, "batch_hash": "0xf81502f07cca9e009781f5b4d42db7e61ee38c43d8941fbf9ef2b667cfbd0f10", "finalize_tx": "0xcc3811e226d48d101c0fd4a1ce725f6dbd3d2e68655a686d395a3946c3307f70"} +{"index": 273095, "batch_hash": "0x0e11423f929e64b22650fef3c8b1a0bae200262ffbf1006a48da203f46195d51", "finalize_tx": "0x5e6908bd4960f6752f0e723a625a971d862ebd8f3ff1e53e8bc157371cd4fc7c"} +{"index": 273096, "batch_hash": "0x7b3d89a1469d8fcc6a7c721bf0b078471cafcc40003cfa92f16b1b7fea042913", "finalize_tx": "0x2c4cf1efcd5c03b14b41fdf47f51ea2741afb7f9bb8cc91161e483bf2fb8ff83"} +{"index": 273097, "batch_hash": "0x8a59ea19b115c2fa74915bbf1e58375a074f17b5412157209aecf384155d6c9c", "finalize_tx": "0xee742b57fc557d1b187aa4194cc635c3e8823ba424d9c468d9a20c3ac7d977c7"} +{"index": 273098, "batch_hash": "0xeaf82f29e785df37bc41ffb787bcbf92971abf7703995e356556379c1208d84a", "finalize_tx": "0x5ba72b8ed48721afe5b16116af2a8a05eae327d5c7ed798251207759823631fc"} +{"index": 273099, "batch_hash": "0x74835384941cb4dac0b2c76b748c775605b986f5a30ad97f324f28adcff8c41a", "finalize_tx": "0xd3a33abba6e253ca5cde52acf7d9979903876cd4c5b50dc1f7ca6381ded5fe7a"} +{"index": 273100, "batch_hash": "0x8bd6e80873324052a32e3ccd42191ce1f809c6393080991ca507598359862c61", "finalize_tx": "0x6a17ce4659cad3e7b0e9063b0d9090d6695bb8eb3b348fba7ef2d157b7a334e5"} +{"index": 273101, "batch_hash": "0x1537e99f47e096db6d3def633006f0b8b4a2f8458ab7b375f8073758a299f82d", "finalize_tx": "0xb400e7e0e34d6b74e91ac89fd8f8d6b1cb7caac3b4e7814862b3d73cda8571eb"} +{"index": 273102, "batch_hash": "0xefe3d32159ad01759248e966527ee432e59d26dec47a63cccf77597ef76c8212", "finalize_tx": "0xf22a39a41508e283cd2a45ac235ebcdc09a0749667c64deefb91c226dc5aa681"} +{"index": 273903, "batch_hash": "0x826842ec7fb66aee07634249893eb6a45ffc2510a1acdcd5b7c4c4fdfcfad938", "finalize_tx": "0xf3d3026c1694704a86062f58267df4ccd7a6b9cd2d2ad642aa0e6bd6857e0e12"} +{"index": 273904, "batch_hash": "0x578ddf3d293286ac3e297790c9ab88b14665515af15ad02aaaca2e5937ecbf7b", "finalize_tx": "0xbf8c5fd055883a7e42f76d3e1769de2d99fc7957309b69d2bde74831189c58d0"} +{"index": 273905, "batch_hash": "0x4dd2184e22d83b400820be57a0bc7dff6f410ee099cd3473f04a76afb857cac6", "finalize_tx": "0xc60eb3225c894f7a0f7e7f27e516e06bd23dc5125c4b181dffbf57c107409ecd"} +{"index": 273906, "batch_hash": "0x0649cc966d704d27adb6f8f1e13e0b477f86288d045f8c371c52844d23cf0ed8", "finalize_tx": "0xf88348f252e2b59ede637788da3be01a1f9392abec2d5e6e35d13f85957c6297"} +{"index": 273907, "batch_hash": "0x772a6ba30b318e0ff095b688d6b99e87f929e2080add7f320e308fa24b9dcd3b", "finalize_tx": "0x50b86179223fe8e477c4bf877e78834dd05315173716b8cce6a5b85b383c052e"} +{"index": 273908, "batch_hash": "0xfd04bf72a7c296ce224f93fdd756bbc1d6fb094cb65a731098ca2af51ec833ce", "finalize_tx": "0x156f9f1d95582cb7d530ce63fd24411fa5bed4b331d9831a52b82660054bdaa2"} +{"index": 273909, "batch_hash": "0xe67d91760e928c633c8ffdf911b204b86d1e54d3384f2383e313a5417214646f", "finalize_tx": "0xd7d66456a67249a7512324908d127becaf675683bc6a8affc7b2bea18d4cb562"} +{"index": 273910, "batch_hash": "0x95e838a07600280114d853a13a25a411cee9949f04b099e9dd6ec3ae024fa745", "finalize_tx": "0x752ca5f3e31b37a0bef8a37ce3b7ebae1282e010dc6f1ac59cc606311506cefe"} +{"index": 273911, "batch_hash": "0xca53cdc2971e875969c4dda49e95f1dab0188d228c3f0a878beaf9ea4c7456fa", "finalize_tx": "0x7f47a13bb7d91976712c8873dc5c82143ecec5b44c438fd8d90b10073b670aaf"} +{"index": 273912, "batch_hash": "0x7559ced94696e92c3ff1252f41e128ddaff9b915156492abd8c3dafab41a0eed", "finalize_tx": "0x42b14b31d77dd8757ce677f62609d4f66148316990e219a9b07becd454c438f1"} +{"index": 274315, "batch_hash": "0x8d4c09a28965f304a86c8fb2916f749f538cc88ce455fb49b650fb7f019cadba", "finalize_tx": "0x65c79aa26aec6d6be7c20de93b2d96ee4fec06477fef6b62b023a28e6cead78d"} +{"index": 274455, "batch_hash": "0x4e17bc355b1546cbe2d37833c26c3b883afdecb5fc4af31a4d4d34f762dd9a07", "finalize_tx": "0x4d6bd32f8a0e5281f5d788d771fba9f6cbe251627551eba9164a3c59687b9a5a"} \ No newline at end of file diff --git a/hardhat-test/testdata/plonk-verifier/v0.12.0-rc.2_pi.data b/hardhat-test/testdata/plonk-verifier/v0.12.0-rc.2_pi.data new file mode 100644 index 0000000000000000000000000000000000000000..a30abdd6158eefd31fc19a250b47d131ec77da20 GIT binary patch literal 416 zcmd;V`LonTY?VOri?%v9iwAEzyZ5fh%T(YI`LUg?K6TqK1~j19zk~H{n*WO8GB(pY zm69fC(hPiw;*P$L?Arqv7xT}mWq*S%zk1Eub?eauN#Luns+ynfTr@FdWtHo%C+j@W zwZIu5$6cSI_VHU%u}P05F-V_~PlDGrQ4CWn4@Y0I(21+z}p{ z=eNmGV(I{yn7GEhq_X(K2&Ue5-`g7_Y!RrJ#Lv`If9%G3coppUtwEVOfOUP8SX^4a zlh?x3E4J1OpK@Y3!*xC}^`5Rc)lHZ}p240OQwQ)Go1i$?1EOqtnR@*SH$8i^gC)n7D^m#1R=ZsIF!@KhyiyFUVngzt;=u8i^MnE) zy%g$9fC~wNmChzEL@?gd)4dIeC%b%NjpbV)p>hWOm~5#r&q25Q(+}MnMXC(gng$mXv*Yc1 z1_ZAqV=)+ZLb;ih?`rFh?bxg$%YC*Nq=m8)Iw)@vCDb?P+PGT)hNtQLhkE`~c$(ZxcKN#_5Z_&owd+Ye?+m z4NkJ5*cYu$=}&Q9_2#k1R0jK?1ARk^mO%Ic8CN(bpUvr5__?(*q}QQE{ge9?gwkFt z{qZsGeErn7xJFCzyE}#5FXboY0OEi~pU5n|JhPU7*I+SGT}q9}!5mvb`P+7pS` z!IdSWV==cgN7uj}Rz{PyQl?d_e>Z!W<%JSmykvT_aUUQvAmuP-whGBe{}c2U(T%e_ zr!n8}zb)|J#5}Nw7;%d^q~LdvOHk`GEYPL4N`o#+sv-=pP%| z=^c8gh{QvH!;zd0gI773OJd(AW&^jBJ}nV|B|It_M7Kdswnvw;_sbJqHo zf$*B}+=&S)D9&nggm?W+D;|zOV?ykQ!jIAQ=nINw65tKd+XpxBI{+817CF`nH zbuybs;LL)rOc4oBCgT$@ak1Ye?%ujzK~fm|FJ8{G*W65WL;3fY7Wyj^5X|>NEnxpO zE=SX6JDP-C+kme_gX56w1cARrty5~Cx znhx@=saDWa=&lD}{IXs4@Wc-ItLur2^;))vPCCjgyESHHaKjG?8p0j#kU=p9rs3^ibgE;t+Gdv9 zqtHzrq+L)u>}Kv?$~&l!Up4%!kD6Yo=IS82rjUz;#SxwIZ#(hpp42xwQrZa0@yHe3 z&1m$~y5+Ju*ujEyUFE&W?doNjCr+bkvZz&4ajciaLl^fMFx0{pkRO?wMUH2O zWT>EJZ@}cC0{X0YH}UPk8-zyj*1UTq?Q04_hr$&=omH^nf=n~TChBjHow@z~OkFT-h~(H$QIp#!F83t5 zGAv9=>5CEW=Ll>h@9x-^T0Jb|){U2hNeyA!kp^B@)a?!Qm=rySag>YBOas0#{{XT$ BNZfi5rqVUu9_c1tJCTifcwwf}!a Jmq+6>0svp|QQ!ao literal 0 HcmV?d00001 diff --git a/hardhat-test/testdata/plonk-verifier/v0.12.0-rc.3_proof.data b/hardhat-test/testdata/plonk-verifier/v0.12.0-rc.3_proof.data new file mode 100644 index 0000000000000000000000000000000000000000..c62b0bae673741e4a2248bafa451d2fe1a815313 GIT binary patch literal 2144 zcma*lX*?4Q90%~3qcBH~1;YswKT; z>UBbk=qAL0@=#M6Q=dfY#22g7J?+b3XX*f;ex;R>`;Q+k&eKyua~4do=jr z>{dP95gytGKguy(@w@`UM^i|b6Emj{GTAMNH2tSxhL#>91Y@LI{M0LU1q;9)8&n{( zJL=dS?%H1yS7J%YJ9q1pyagO1VFSzoh7x@ASl3NF{08L?3wdx7@l6jeO=HARhN`*5kV!J2flx!uIRzf*vwT7 zn_Dw$%MRHW99y@bFE*R7*q*QB)$d1R)OW4?QLC^Dk7Gip8+}V2{AtvJLo3PRbyQoK zF{W2}3csB|2|LFT_bQqb7vp@f-xYM&R(Mh9J6I)PsgxG~F|0U)DsL*x3S}Tw-KtQjkl|%P*JL}vUp$C%kp6l5Dp*>r6KGpKQ!|s4wo7%q< ze1+xc1;_MB%E8X>g0Aik658pX&)zu9YV34jw1Lt>~x%!l9;4o8jK#G z1oi1(0`dKYl8+s@B*$?p{_sN~bBR5B75PAuX-r%S~X`aoM^{QlTL?_CcQw zwW=t0PUqRq7b@O&nal#tDcCPQ_k8gh>JzmjbubZrWc`l`-i#16vJTNKp;iQ5&NR%> zGJpI1mQk1prB-~d!VV`{WlM3ppMC6nx+mBnf zT`luprK_Kc%l4|ut;Vfq?9Om6)V%joBA#kz0|Cnh z0ogXr^`Pwltw@LHCk+OAd{5bqI2JyI9^fi|tJqW~(qLcvXu?-ztNvV@85$T&2)U_Z zD&vl}p3dRK1ncugBwM;^xJXOqa&c-(>qdKgxE~Sq7StR5O!TWW5x1>GgN5l*8|h+Q z!X40}*7eoCgkLUrSyH@it`)L+#I3(BX70^$&Ncgo>UJc2)w;m5gWM2RafGZZ23$Fw z7l^4$RpxB+nVG8<7@i~$s_#eqgL?9e`CI<)mPNk!hPN@@I~Qy7J@TM`=gKbpu$>Q= zd#XXZoQjHHGm)L8guZ9Xj(@9Y1Pi)A~Z}g?9gAoY}xVW;-pbzf9jrfDmf^!p(GOn3~ z>L@iuN~0Q<@KGP)z~-;h`mr0}tH_g}%|EUvJoeYoALHX>Dq|z%y3Hwis9^0Q+`c zLq#|9rAXI~^CSET_q|J5`Sr_{yJ`ujiG5BQMLR(Jq1kjpOO$A8LlRd^86uV8WlB9z zp<8t*D+>mJ3UFYEKI|rRCSvr9OyqWkg2TwgIkYN9G^0D;g~g5QUD%?ZFOY$6^?6rq zdi4168wvah5*rNvE2Rxq3l2q?&3##I-6Cm|(xSz1^?x+rESo#cW(hOSh*Z$wzW{zx AH2?qr literal 0 HcmV?d00001 diff --git a/hardhat-test/testdata/plonk_verifier_0.9.8_pi.data b/hardhat-test/testdata/plonk-verifier/v0.9.8_pi.data similarity index 100% rename from hardhat-test/testdata/plonk_verifier_0.9.8_pi.data rename to hardhat-test/testdata/plonk-verifier/v0.9.8_pi.data diff --git a/hardhat-test/testdata/plonk_verifier_0.9.8_proof.data b/hardhat-test/testdata/plonk-verifier/v0.9.8_proof.data similarity index 100% rename from hardhat-test/testdata/plonk_verifier_0.9.8_proof.data rename to hardhat-test/testdata/plonk-verifier/v0.9.8_proof.data diff --git a/package.json b/package.json index a555a81..3113d74 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "eslint-plugin-promise": "^6.1.1", "ethereum-waffle": "^3.0.0", "ethers": "^6.11.1", - "hardhat": "^2.22.0", + "hardhat": "^2.22.6", "hardhat-gas-reporter": "^1.0.4", "husky": "^8.0.1", "lint-staged": "^13.0.3", diff --git a/src/L1/L1ScrollMessenger.sol b/src/L1/L1ScrollMessenger.sol index 544beb2..c70719f 100644 --- a/src/L1/L1ScrollMessenger.sol +++ b/src/L1/L1ScrollMessenger.sol @@ -26,6 +26,13 @@ import {IMessageDropCallback} from "../libraries/callbacks/IMessageDropCallback. /// /// @dev All deposited Ether (including `WETH` deposited throng `L1WETHGateway`) will locked in /// this contract. +/// +/// The messages sent through this contract may failed due to out of gas or some contract errors layer 2. In such case, +/// users can initiate `replayMessage` to retry this message in layer 2. If it is because out of gas, users can provide +/// a larger `gasLimit`. Users need also to pay the cross domain relay fee again. +/// +/// The messages sent through this contract may possibly be skipped in layer 2 due to circuit capacity overflow. +/// In such case, users can initiate `dropMessage` to claim refunds. But the cross domain relay fee won't be refunded. contract L1ScrollMessenger is ScrollMessengerBase, IL1ScrollMessenger { /************* * Constants * diff --git a/src/L1/rollup/IL1MessageQueue.sol b/src/L1/rollup/IL1MessageQueue.sol index 210f2c8..422e11b 100644 --- a/src/L1/rollup/IL1MessageQueue.sol +++ b/src/L1/rollup/IL1MessageQueue.sol @@ -29,6 +29,14 @@ interface IL1MessageQueue { /// @param skippedBitmap A bitmap indicates whether a message is skipped. event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap); + /// @notice Emitted when dequeued transactions are reset. + /// @param startIndex The start index of messages. + event ResetDequeuedTransaction(uint256 startIndex); + + /// @notice Emitted when some L1 => L2 transactions are finalized in L1. + /// @param finalizedIndex The last index of messages finalized. + event FinalizedDequeuedTransaction(uint256 finalizedIndex); + /// @notice Emitted when a message is dropped from L1. /// @param index The index of message dropped. event DropTransaction(uint256 index); @@ -57,6 +65,10 @@ interface IL1MessageQueue { /// @notice The start index of all pending inclusion messages. function pendingQueueIndex() external view returns (uint256); + /// @notice The start index of all unfinalized messages. + /// @dev All messages from `nextUnfinalizedQueueIndex` to `pendingQueueIndex-1` are committed but not finalized. + function nextUnfinalizedQueueIndex() external view returns (uint256); + /// @notice Return the index of next appended message. /// @dev Also the total number of appended messages. function nextCrossDomainMessageIndex() external view returns (uint256); @@ -126,7 +138,7 @@ interface IL1MessageQueue { bytes calldata data ) external; - /// @notice Pop finalized messages from queue. + /// @notice Pop messages from queue. /// /// @dev We can pop at most 256 messages each time. And if the message is not skipped, /// the corresponding entry will be cleared. @@ -140,6 +152,17 @@ interface IL1MessageQueue { uint256 skippedBitmap ) external; + /// @notice Reset status of popped messages. + /// + /// @dev We can only reset unfinalized popped messages. + /// + /// @param startIndex The start index to reset. + function resetPoppedCrossDomainMessage(uint256 startIndex) external; + + /// @notice Finalize status of popped messages. + /// @param newFinalizedQueueIndexPlusOne The index of message to finalize plus one. + function finalizePoppedCrossDomainMessage(uint256 newFinalizedQueueIndexPlusOne) external; + /// @notice Drop a skipped message from the queue. function dropCrossDomainMessage(uint256 index) external; } diff --git a/src/L1/rollup/IScrollChain.sol b/src/L1/rollup/IScrollChain.sol index 7af9845..637b006 100644 --- a/src/L1/rollup/IScrollChain.sol +++ b/src/L1/rollup/IScrollChain.sol @@ -81,26 +81,32 @@ interface IScrollChain { bytes calldata skippedL1MessageBitmap ) external; - /// @notice Revert a pending batch. - /// @dev one can only revert unfinalized batches. - /// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch`. - /// @param count The number of subsequent batches to revert, including current batch. - function revertBatch(bytes calldata batchHeader, uint256 count) external; - - /// @notice Finalize a committed batch on layer 1. - /// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch. - /// @param prevStateRoot The state root of parent batch. - /// @param postStateRoot The state root of current batch. - /// @param withdrawRoot The withdraw trie root of current batch. - /// @param aggrProof The aggregation proof for current batch. - function finalizeBatchWithProof( - bytes calldata batchHeader, - bytes32 prevStateRoot, - bytes32 postStateRoot, - bytes32 withdrawRoot, - bytes calldata aggrProof + /// @notice Commit a batch of transactions on layer 1 with blob data proof. + /// + /// @dev Memory layout of `blobDataProof`: + /// | z | y | kzg_commitment | kzg_proof | + /// |---------|---------|----------------|-----------| + /// | bytes32 | bytes32 | bytes48 | bytes48 | + /// + /// @param version The version of current batch. + /// @param parentBatchHeader The header of parent batch, see the comments of `BatchHeaderV0Codec`. + /// @param chunks The list of encoded chunks, see the comments of `ChunkCodec`. + /// @param skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. + /// @param blobDataProof The proof for blob data. + function commitBatchWithBlobProof( + uint8 version, + bytes calldata parentBatchHeader, + bytes[] memory chunks, + bytes calldata skippedL1MessageBitmap, + bytes calldata blobDataProof ) external; + /// @notice Revert pending batches. + /// @dev one can only revert unfinalized batches. + /// @param firstBatchHeader The header of first batch to revert, see the encoding in comments of `commitBatch`. + /// @param lastBatchHeader The header of last batch to revert, see the encoding in comments of `commitBatch`. + function revertBatch(bytes calldata firstBatchHeader, bytes calldata lastBatchHeader) external; + /// @notice Finalize a committed batch (with blob) on layer 1. /// /// @dev Memory layout of `blobDataProof`: @@ -122,4 +128,16 @@ interface IScrollChain { bytes calldata blobDataProof, bytes calldata aggrProof ) external; + + /// @notice Finalize a list of committed batches (i.e. bundle) on layer 1. + /// @param batchHeader The header of last batch in current bundle, see the encoding in comments of `commitBatch. + /// @param postStateRoot The state root after current bundle. + /// @param withdrawRoot The withdraw trie root after current batch. + /// @param aggrProof The aggregation proof for current bundle. + function finalizeBundleWithProof( + bytes calldata batchHeader, + bytes32 postStateRoot, + bytes32 withdrawRoot, + bytes calldata aggrProof + ) external; } diff --git a/src/L1/rollup/L1MessageQueue.sol b/src/L1/rollup/L1MessageQueue.sol index 6ffee52..9f01510 100644 --- a/src/L1/rollup/L1MessageQueue.sol +++ b/src/L1/rollup/L1MessageQueue.sol @@ -64,8 +64,11 @@ contract L1MessageQueue is OwnableUpgradeable, IL1MessageQueue { /// @dev The bitmap for skipped messages, where `skippedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. mapping(uint256 => uint256) private skippedMessageBitmap; + /// @inheritdoc IL1MessageQueue + uint256 public nextUnfinalizedQueueIndex; + /// @dev The storage slots for future usage. - uint256[41] private __gap; + uint256[40] private __gap; /********************** * Function Modifiers * @@ -76,6 +79,11 @@ contract L1MessageQueue is OwnableUpgradeable, IL1MessageQueue { _; } + modifier onlyScrollChain() { + require(_msgSender() == scrollChain, "Only callable by the ScrollChain"); + _; + } + /*************** * Constructor * ***************/ @@ -343,9 +351,7 @@ contract L1MessageQueue is OwnableUpgradeable, IL1MessageQueue { uint256 _startIndex, uint256 _count, uint256 _skippedBitmap - ) external { - require(_msgSender() == scrollChain, "Only callable by the ScrollChain"); - + ) external override onlyScrollChain { require(_count <= 256, "pop too many messages"); require(pendingQueueIndex == _startIndex, "start index mismatch"); @@ -367,9 +373,53 @@ contract L1MessageQueue is OwnableUpgradeable, IL1MessageQueue { emit DequeueTransaction(_startIndex, _count, _skippedBitmap); } + /// @inheritdoc IL1MessageQueue + /// @dev Caller should make sure `_startIndex < pendingQueueIndex` to reduce unnecessary contract call. + function resetPoppedCrossDomainMessage(uint256 _startIndex) external override onlyScrollChain { + uint256 cachedPendingQueueIndex = pendingQueueIndex; + if (_startIndex == cachedPendingQueueIndex) return; + + require(_startIndex >= nextUnfinalizedQueueIndex, "reset finalized messages"); + require(_startIndex < cachedPendingQueueIndex, "reset pending messages"); + + unchecked { + uint256 count = cachedPendingQueueIndex - _startIndex; + uint256 bucket = _startIndex >> 8; + uint256 offset = _startIndex & 0xff; + skippedMessageBitmap[bucket] &= (1 << offset) - 1; + uint256 numResetMessages = 256 - offset; + while (numResetMessages < count) { + bucket += 1; + uint256 bitmap = skippedMessageBitmap[bucket]; + if (bitmap > 0) skippedMessageBitmap[bucket] = 0; + numResetMessages += 256; + } + } + + pendingQueueIndex = _startIndex; + emit ResetDequeuedTransaction(_startIndex); + } + + /// @inheritdoc IL1MessageQueue + function finalizePoppedCrossDomainMessage(uint256 _newFinalizedQueueIndexPlusOne) + external + override + onlyScrollChain + { + uint256 cachedFinalizedQueueIndexPlusOne = nextUnfinalizedQueueIndex; + if (_newFinalizedQueueIndexPlusOne == cachedFinalizedQueueIndexPlusOne) return; + require(_newFinalizedQueueIndexPlusOne > cachedFinalizedQueueIndexPlusOne, "finalized index too small"); + require(_newFinalizedQueueIndexPlusOne <= pendingQueueIndex, "finalized index too large"); + + nextUnfinalizedQueueIndex = _newFinalizedQueueIndexPlusOne; + unchecked { + emit FinalizedDequeuedTransaction(_newFinalizedQueueIndexPlusOne - 1); + } + } + /// @inheritdoc IL1MessageQueue function dropCrossDomainMessage(uint256 _index) external onlyMessenger { - require(_index < pendingQueueIndex, "cannot drop pending message"); + require(_index < nextUnfinalizedQueueIndex, "cannot drop pending message"); require(_isMessageSkipped(_index), "drop non-skipped message"); require(!droppedMessageBitmap.get(_index), "message already dropped"); diff --git a/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol b/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol index 0be3acf..dbe4951 100644 --- a/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol +++ b/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol @@ -51,6 +51,10 @@ contract L1MessageQueueWithGasPriceOracle is L1MessageQueue, IL1MessageQueueWith whitelistChecker = IL2GasPriceOracle(gasOracle).whitelist(); } + function initializeV3() external reinitializer(3) { + nextUnfinalizedQueueIndex = pendingQueueIndex; + } + /************************* * Public View Functions * *************************/ diff --git a/src/L1/rollup/MultipleVersionRollupVerifier.sol b/src/L1/rollup/MultipleVersionRollupVerifier.sol index eba5e14..9b0ac12 100644 --- a/src/L1/rollup/MultipleVersionRollupVerifier.sol +++ b/src/L1/rollup/MultipleVersionRollupVerifier.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol"; -import {IZkEvmVerifier} from "../../libraries/verifier/IZkEvmVerifier.sol"; +import {IZkEvmVerifierV1, IZkEvmVerifierV2} from "../../libraries/verifier/IZkEvmVerifier.sol"; /// @title MultipleVersionRollupVerifier /// @notice Verifies aggregate zk proofs using the appropriate verifier. @@ -111,7 +111,7 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { ) external view override { address _verifier = getVerifier(0, _batchIndex); - IZkEvmVerifier(_verifier).verify(_aggrProof, _publicInputHash); + IZkEvmVerifierV1(_verifier).verify(_aggrProof, _publicInputHash); } /// @inheritdoc IRollupVerifier @@ -123,7 +123,19 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { ) external view override { address _verifier = getVerifier(_version, _batchIndex); - IZkEvmVerifier(_verifier).verify(_aggrProof, _publicInputHash); + IZkEvmVerifierV1(_verifier).verify(_aggrProof, _publicInputHash); + } + + /// @inheritdoc IRollupVerifier + function verifyBundleProof( + uint256 _version, + uint256 _batchIndex, + bytes calldata _bundleProof, + bytes calldata _publicInput + ) external view override { + address _verifier = getVerifier(_version, _batchIndex); + + IZkEvmVerifierV2(_verifier).verify(_bundleProof, _publicInput); } /************************ diff --git a/src/L1/rollup/ScrollChain.sol b/src/L1/rollup/ScrollChain.sol index 20e08c2..0cf493d 100644 --- a/src/L1/rollup/ScrollChain.sol +++ b/src/L1/rollup/ScrollChain.sol @@ -9,6 +9,7 @@ import {IL1MessageQueue} from "./IL1MessageQueue.sol"; import {IScrollChain} from "./IScrollChain.sol"; import {BatchHeaderV0Codec} from "../../libraries/codec/BatchHeaderV0Codec.sol"; import {BatchHeaderV1Codec} from "../../libraries/codec/BatchHeaderV1Codec.sol"; +import {BatchHeaderV3Codec} from "../../libraries/codec/BatchHeaderV3Codec.sol"; import {ChunkCodecV0} from "../../libraries/codec/ChunkCodecV0.sol"; import {ChunkCodecV1} from "../../libraries/codec/ChunkCodecV1.sol"; import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol"; @@ -45,7 +46,7 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { error ErrorCallerIsNotSequencer(); /// @dev Thrown when the transaction has multiple blobs. - error ErrorFoundMultipleBlob(); + error ErrorFoundMultipleBlobs(); /// @dev Thrown when some fields are not zero in genesis batch. error ErrorGenesisBatchHasNonZeroField(); @@ -68,12 +69,12 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /// @dev Thrown when the batch index is incorrect. error ErrorIncorrectBatchIndex(); + /// @dev Thrown when the batch version is incorrect. + error ErrorIncorrectBatchVersion(); + /// @dev Thrown when the bitmap length is incorrect. error ErrorIncorrectBitmapLength(); - /// @dev Thrown when the previous state root doesn't match stored one. - error ErrorIncorrectPreviousStateRoot(); - /// @dev Thrown when the last message is skipped. error ErrorLastL1MessageSkipped(); @@ -83,9 +84,6 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /// @dev Thrown when the number of transactions is less than number of L1 message in one block. error ErrorNumTxsLessThanNumL1Msgs(); - /// @dev Thrown when the given previous state is zero. - error ErrorPreviousStateRootIsZero(); - /// @dev Thrown when the number of batches to revert is zero. error ErrorRevertZeroBatches(); @@ -270,23 +268,19 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { bytes[] memory _chunks, bytes calldata _skippedL1MessageBitmap ) external override OnlySequencer whenNotPaused { - // check whether the batch is empty - if (_chunks.length == 0) revert ErrorBatchIsEmpty(); - - (, bytes32 _parentBatchHash, uint256 _batchIndex, uint256 _totalL1MessagesPoppedOverall) = _loadBatchHeader( - _parentBatchHeader + (bytes32 _parentBatchHash, uint256 _batchIndex, uint256 _totalL1MessagesPoppedOverall) = _beforeCommitBatch( + _parentBatchHeader, + _chunks ); - unchecked { - _batchIndex += 1; - } - if (committedBatches[_batchIndex] != 0) revert ErrorBatchIsAlreadyCommitted(); bytes32 _batchHash; uint256 batchPtr; bytes32 _dataHash; uint256 _totalL1MessagesPoppedInBatch; - if (_version == 0) { - (_dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV0( + if (1 <= _version && _version <= 2) { + // versions 1 and 2 both use ChunkCodecV1 and BatchHeaderV1Codec, + // but they use different blob encoding and different verifiers. + (_dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV1( _totalL1MessagesPoppedOverall, _chunks, _skippedL1MessageBitmap @@ -295,90 +289,157 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { batchPtr := mload(0x40) _totalL1MessagesPoppedOverall := add(_totalL1MessagesPoppedOverall, _totalL1MessagesPoppedInBatch) } + // store entries, the order matters - BatchHeaderV0Codec.storeVersion(batchPtr, 0); + // Some are using `BatchHeaderV0Codec`, see comments of `BatchHeaderV1Codec`. + BatchHeaderV0Codec.storeVersion(batchPtr, _version); BatchHeaderV0Codec.storeBatchIndex(batchPtr, _batchIndex); BatchHeaderV0Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); BatchHeaderV0Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); BatchHeaderV0Codec.storeDataHash(batchPtr, _dataHash); - BatchHeaderV0Codec.storeParentBatchHash(batchPtr, _parentBatchHash); - BatchHeaderV0Codec.storeSkippedBitmap(batchPtr, _skippedL1MessageBitmap); - // compute batch hash - _batchHash = BatchHeaderV0Codec.computeBatchHash( - batchPtr, - BatchHeaderV0Codec.BATCH_HEADER_FIXED_LENGTH + _skippedL1MessageBitmap.length - ); - } else if (_version >= 1) { - // versions 1 and 2 both use ChunkCodecV1 and BatchHeaderV1Codec, - // but they use different blob encoding and different verifiers. - - bytes32 blobVersionedHash; - (blobVersionedHash, _dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV1( - _totalL1MessagesPoppedOverall, - _chunks, - _skippedL1MessageBitmap - ); - assembly { - batchPtr := mload(0x40) - _totalL1MessagesPoppedOverall := add(_totalL1MessagesPoppedOverall, _totalL1MessagesPoppedInBatch) - } - // store entries, the order matters - BatchHeaderV1Codec.storeVersion(batchPtr, _version); - BatchHeaderV1Codec.storeBatchIndex(batchPtr, _batchIndex); - BatchHeaderV1Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); - BatchHeaderV1Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); - BatchHeaderV1Codec.storeDataHash(batchPtr, _dataHash); - BatchHeaderV1Codec.storeBlobVersionedHash(batchPtr, blobVersionedHash); + BatchHeaderV1Codec.storeBlobVersionedHash(batchPtr, _getBlobVersionedHash()); BatchHeaderV1Codec.storeParentBatchHash(batchPtr, _parentBatchHash); BatchHeaderV1Codec.storeSkippedBitmap(batchPtr, _skippedL1MessageBitmap); - // compute batch hash - _batchHash = BatchHeaderV1Codec.computeBatchHash( + // compute batch hash, V1 and V2 has same code as V0 + _batchHash = BatchHeaderV0Codec.computeBatchHash( batchPtr, BatchHeaderV1Codec.BATCH_HEADER_FIXED_LENGTH + _skippedL1MessageBitmap.length ); + } else { + // we don't allow v0 and other versions + revert ErrorIncorrectBatchVersion(); } - // check the length of bitmap + // verify skippedL1MessageBitmap + _checkSkippedL1MessageBitmap( + _totalL1MessagesPoppedOverall, + _totalL1MessagesPoppedInBatch, + _skippedL1MessageBitmap, + false + ); + + _afterCommitBatch(_batchIndex, _batchHash); + } + + /// @inheritdoc IScrollChain + /// + /// @dev This function will revert unless all V0/V1/V2 batches are finalized. This is because we start to + /// pop L1 messages in `commitBatchWithBlobProof` but not in `commitBatch`. We also introduce `finalizedQueueIndex` + /// in `L1MessageQueue`. If one of V0/V1/V2 batches not finalized, `L1MessageQueue.pendingQueueIndex` will not + /// match `parentBatchHeader.totalL1MessagePopped` and thus revert. + function commitBatchWithBlobProof( + uint8 _version, + bytes calldata _parentBatchHeader, + bytes[] memory _chunks, + bytes calldata _skippedL1MessageBitmap, + bytes calldata _blobDataProof + ) external override OnlySequencer whenNotPaused { + if (_version <= 2) { + revert ErrorIncorrectBatchVersion(); + } + + // allocate memory of batch header and store entries if necessary, the order matters + // @note why store entries if necessary, to avoid stack overflow problem. + // The codes for `version`, `batchIndex`, `l1MessagePopped`, `totalL1MessagePopped` and `dataHash` + // are the same as `BatchHeaderV0Codec`. + // The codes for `blobVersionedHash`, and `parentBatchHash` are the same as `BatchHeaderV1Codec`. + uint256 batchPtr; + assembly { + batchPtr := mload(0x40) + // This is `BatchHeaderV3Codec.BATCH_HEADER_FIXED_LENGTH`, use `193` here to reduce code + // complexity. Be careful that the length may changed in future versions. + mstore(0x40, add(batchPtr, 193)) + } + BatchHeaderV0Codec.storeVersion(batchPtr, _version); + + (bytes32 _parentBatchHash, uint256 _batchIndex, uint256 _totalL1MessagesPoppedOverall) = _beforeCommitBatch( + _parentBatchHeader, + _chunks + ); + BatchHeaderV0Codec.storeBatchIndex(batchPtr, _batchIndex); + + // versions 2 and 3 both use ChunkCodecV1 + (bytes32 _dataHash, uint256 _totalL1MessagesPoppedInBatch) = _commitChunksV1( + _totalL1MessagesPoppedOverall, + _chunks, + _skippedL1MessageBitmap + ); unchecked { - if (((_totalL1MessagesPoppedInBatch + 255) / 256) * 32 != _skippedL1MessageBitmap.length) { - revert ErrorIncorrectBitmapLength(); - } + _totalL1MessagesPoppedOverall += _totalL1MessagesPoppedInBatch; } - committedBatches[_batchIndex] = _batchHash; - emit CommitBatch(_batchIndex, _batchHash); + // verify skippedL1MessageBitmap + _checkSkippedL1MessageBitmap( + _totalL1MessagesPoppedOverall, + _totalL1MessagesPoppedInBatch, + _skippedL1MessageBitmap, + true + ); + BatchHeaderV0Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); + BatchHeaderV0Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); + BatchHeaderV0Codec.storeDataHash(batchPtr, _dataHash); + + // verify blob versioned hash + bytes32 _blobVersionedHash = _getBlobVersionedHash(); + _checkBlobVersionedHash(_blobVersionedHash, _blobDataProof); + BatchHeaderV1Codec.storeBlobVersionedHash(batchPtr, _blobVersionedHash); + BatchHeaderV1Codec.storeParentBatchHash(batchPtr, _parentBatchHash); + + uint256 lastBlockTimestamp; + { + bytes memory lastChunk = _chunks[_chunks.length - 1]; + lastBlockTimestamp = ChunkCodecV1.getLastBlockTimestamp(lastChunk); + } + BatchHeaderV3Codec.storeLastBlockTimestamp(batchPtr, lastBlockTimestamp); + BatchHeaderV3Codec.storeBlobDataProof(batchPtr, _blobDataProof); + + // compute batch hash, V3 has same code as V0 + bytes32 _batchHash = BatchHeaderV0Codec.computeBatchHash( + batchPtr, + BatchHeaderV3Codec.BATCH_HEADER_FIXED_LENGTH + ); + + _afterCommitBatch(_batchIndex, _batchHash); } /// @inheritdoc IScrollChain /// @dev If the owner want to revert a sequence of batches by sending multiple transactions, /// make sure to revert recent batches first. - function revertBatch(bytes calldata _batchHeader, uint256 _count) external onlyOwner { - if (_count == 0) revert ErrorRevertZeroBatches(); + function revertBatch(bytes calldata _firstBatchHeader, bytes calldata _lastBatchHeader) external onlyOwner { + ( + uint256 firstBatchPtr, + , + uint256 _firstBatchIndex, + uint256 _totalL1MessagesPoppedOverallFirstBatch + ) = _loadBatchHeader(_firstBatchHeader); + (, , uint256 _lastBatchIndex, ) = _loadBatchHeader(_lastBatchHeader); + if (_firstBatchIndex > _lastBatchIndex) revert ErrorRevertZeroBatches(); - (, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); // make sure no gap is left when reverting from the ending to the beginning. - if (committedBatches[_batchIndex + _count] != bytes32(0)) revert ErrorRevertNotStartFromEnd(); + if (committedBatches[_lastBatchIndex + 1] != bytes32(0)) revert ErrorRevertNotStartFromEnd(); // check finalization - if (_batchIndex <= lastFinalizedBatchIndex) revert ErrorRevertFinalizedBatch(); + if (_firstBatchIndex <= lastFinalizedBatchIndex) revert ErrorRevertFinalizedBatch(); - while (_count > 0) { + // actual revert + for (uint256 _batchIndex = _lastBatchIndex; _batchIndex >= _firstBatchIndex; --_batchIndex) { + bytes32 _batchHash = committedBatches[_batchIndex]; committedBatches[_batchIndex] = bytes32(0); emit RevertBatch(_batchIndex, _batchHash); + } - unchecked { - _batchIndex += 1; - _count -= 1; - } - - _batchHash = committedBatches[_batchIndex]; - if (_batchHash == bytes32(0)) break; + // `getL1MessagePopped` codes are the same in V0, V1, V2, V3 + uint256 l1MessagePoppedFirstBatch = BatchHeaderV0Codec.getL1MessagePopped(firstBatchPtr); + unchecked { + IL1MessageQueue(messageQueue).resetPoppedCrossDomainMessage( + _totalL1MessagesPoppedOverallFirstBatch - l1MessagePoppedFirstBatch + ); } } + /* This function will never be used since we already upgrade to 4844. We comment out the codes for reference. /// @inheritdoc IScrollChain - /// @dev We keep this function to upgrade to 4844 more smoothly. function finalizeBatchWithProof( bytes calldata _batchHeader, bytes32 _prevStateRoot, @@ -386,46 +447,34 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { bytes32 _withdrawRoot, bytes calldata _aggrProof ) external override OnlyProver whenNotPaused { - if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); - if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); - - // compute batch hash and verify - (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); - bytes32 _dataHash = BatchHeaderV0Codec.getDataHash(memPtr); - - // verify previous state root. - if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); - - // avoid duplicated verification - if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); - - // compute public input hash - bytes32 _publicInputHash = keccak256( - abi.encodePacked(layer2ChainId, _prevStateRoot, _postStateRoot, _withdrawRoot, _dataHash) + (uint256 batchPtr, bytes32 _batchHash, uint256 _batchIndex) = _beforeFinalizeBatch( + _batchHeader, + _postStateRoot ); + // compute public input hash + bytes32 _publicInputHash; + { + bytes32 _dataHash = BatchHeaderV0Codec.getDataHash(batchPtr); + bytes32 _prevStateRoot = finalizedStateRoots[_batchIndex - 1]; + _publicInputHash = keccak256( + abi.encodePacked(layer2ChainId, _prevStateRoot, _postStateRoot, _withdrawRoot, _dataHash) + ); + } // verify batch IRollupVerifier(verifier).verifyAggregateProof(0, _batchIndex, _aggrProof, _publicInputHash); - // check and update lastFinalizedBatchIndex - unchecked { - if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); - lastFinalizedBatchIndex = _batchIndex; - } - - // record state root and withdraw root - finalizedStateRoots[_batchIndex] = _postStateRoot; - withdrawRoots[_batchIndex] = _withdrawRoot; - // Pop finalized and non-skipped message from L1MessageQueue. - _popL1Messages( - BatchHeaderV0Codec.getSkippedBitmapPtr(memPtr), - BatchHeaderV0Codec.getTotalL1MessagePopped(memPtr), - BatchHeaderV0Codec.getL1MessagePopped(memPtr) + uint256 _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + _popL1MessagesMemory( + BatchHeaderV0Codec.getSkippedBitmapPtr(batchPtr), + _totalL1MessagesPoppedOverall, + BatchHeaderV0Codec.getL1MessagePopped(batchPtr) ); - emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + _afterFinalizeBatch(_totalL1MessagesPoppedOverall, _batchIndex, _batchHash, _postStateRoot, _withdrawRoot); } + */ /// @inheritdoc IScrollChain /// @dev Memory layout of `_blobDataProof`: @@ -436,75 +485,100 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /// ``` function finalizeBatchWithProof4844( bytes calldata _batchHeader, - bytes32 _prevStateRoot, + bytes32, /*_prevStateRoot*/ bytes32 _postStateRoot, bytes32 _withdrawRoot, bytes calldata _blobDataProof, bytes calldata _aggrProof ) external override OnlyProver whenNotPaused { - if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); - if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); - - // compute batch hash and verify - (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); - bytes32 _dataHash = BatchHeaderV1Codec.getDataHash(memPtr); - bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(memPtr); + (uint256 batchPtr, bytes32 _batchHash, uint256 _batchIndex) = _beforeFinalizeBatch( + _batchHeader, + _postStateRoot + ); - // Calls the point evaluation precompile and verifies the output + // compute public input hash + bytes32 _publicInputHash; { - (bool success, bytes memory data) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall( - abi.encodePacked(_blobVersionedHash, _blobDataProof) + bytes32 _dataHash = BatchHeaderV0Codec.getDataHash(batchPtr); + bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(batchPtr); + bytes32 _prevStateRoot = finalizedStateRoots[_batchIndex - 1]; + // verify blob versioned hash + _checkBlobVersionedHash(_blobVersionedHash, _blobDataProof); + _publicInputHash = keccak256( + abi.encodePacked( + layer2ChainId, + _prevStateRoot, + _postStateRoot, + _withdrawRoot, + _dataHash, + _blobDataProof[0:64], + _blobVersionedHash + ) ); - // We verify that the point evaluation precompile call was successful by testing the latter 32 bytes of the - // response is equal to BLS_MODULUS as defined in https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile - if (!success) revert ErrorCallPointEvaluationPrecompileFailed(); - (, uint256 result) = abi.decode(data, (uint256, uint256)); - if (result != BLS_MODULUS) revert ErrorUnexpectedPointEvaluationPrecompileOutput(); } - // verify previous state root. - if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); + // load version from batch header, it is always the first byte. + uint256 batchVersion = BatchHeaderV0Codec.getVersion(batchPtr); + // verify batch + IRollupVerifier(verifier).verifyAggregateProof(batchVersion, _batchIndex, _aggrProof, _publicInputHash); - // avoid duplicated verification - if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); + // Pop finalized and non-skipped message from L1MessageQueue. + uint256 _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + _popL1MessagesMemory( + BatchHeaderV1Codec.getSkippedBitmapPtr(batchPtr), + _totalL1MessagesPoppedOverall, + BatchHeaderV0Codec.getL1MessagePopped(batchPtr) + ); - // compute public input hash - bytes32 _publicInputHash = keccak256( - abi.encodePacked( - layer2ChainId, - _prevStateRoot, - _postStateRoot, - _withdrawRoot, - _dataHash, - _blobDataProof[0:64], - _blobVersionedHash - ) + _afterFinalizeBatch(_totalL1MessagesPoppedOverall, _batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + } + + /// @inheritdoc IScrollChain + function finalizeBundleWithProof( + bytes calldata _batchHeader, + bytes32 _postStateRoot, + bytes32 _withdrawRoot, + bytes calldata _aggrProof + ) external override OnlyProver whenNotPaused { + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); + + // compute pending batch hash and verify + ( + uint256 batchPtr, + bytes32 _batchHash, + uint256 _batchIndex, + uint256 _totalL1MessagesPoppedOverall + ) = _loadBatchHeader(_batchHeader); + + // retrieve finalized state root and batch hash from storage to construct the public input + uint256 _finalizedBatchIndex = lastFinalizedBatchIndex; + if (_batchIndex <= _finalizedBatchIndex) revert ErrorBatchIsAlreadyVerified(); + + bytes memory _publicInput = abi.encodePacked( + layer2ChainId, + uint32(_batchIndex - _finalizedBatchIndex), // numBatches + finalizedStateRoots[_finalizedBatchIndex], // _prevStateRoot + committedBatches[_finalizedBatchIndex], // _prevBatchHash + _postStateRoot, + _batchHash, + _withdrawRoot ); // load version from batch header, it is always the first byte. - uint256 batchVersion; - assembly { - batchVersion := shr(248, calldataload(_batchHeader.offset)) - } - // verify batch - IRollupVerifier(verifier).verifyAggregateProof(batchVersion, _batchIndex, _aggrProof, _publicInputHash); + uint256 batchVersion = BatchHeaderV0Codec.getVersion(batchPtr); - // check and update lastFinalizedBatchIndex - unchecked { - if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); - lastFinalizedBatchIndex = _batchIndex; - } + // verify bundle, choose the correct verifier based on the last batch + // our off-chain service will make sure all unfinalized batches have the same batch version. + IRollupVerifier(verifier).verifyBundleProof(batchVersion, _batchIndex, _aggrProof, _publicInput); - // record state root and withdraw root + // store in state + // @note we do not store intermediate finalized roots + lastFinalizedBatchIndex = _batchIndex; finalizedStateRoots[_batchIndex] = _postStateRoot; withdrawRoots[_batchIndex] = _withdrawRoot; // Pop finalized and non-skipped message from L1MessageQueue. - _popL1Messages( - BatchHeaderV1Codec.getSkippedBitmapPtr(memPtr), - BatchHeaderV1Codec.getTotalL1MessagePopped(memPtr), - BatchHeaderV1Codec.getL1MessagePopped(memPtr) - ); + _finalizePoppedL1Messages(_totalL1MessagesPoppedOverall); emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); } @@ -575,12 +649,151 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { * Internal Functions * **********************/ + /// @dev Internal function to do common checks before actual batch committing. + /// @param _parentBatchHeader The parent batch header in calldata. + /// @param _chunks The list of chunks in memory. + /// @return _parentBatchHash The batch hash of parent batch header. + /// @return _batchIndex The index of current batch. + /// @return _totalL1MessagesPoppedOverall The total number of L1 messages popped before current batch. + function _beforeCommitBatch(bytes calldata _parentBatchHeader, bytes[] memory _chunks) + private + view + returns ( + bytes32 _parentBatchHash, + uint256 _batchIndex, + uint256 _totalL1MessagesPoppedOverall + ) + { + // check whether the batch is empty + if (_chunks.length == 0) revert ErrorBatchIsEmpty(); + (, _parentBatchHash, _batchIndex, _totalL1MessagesPoppedOverall) = _loadBatchHeader(_parentBatchHeader); + unchecked { + _batchIndex += 1; + } + if (committedBatches[_batchIndex] != 0) revert ErrorBatchIsAlreadyCommitted(); + } + + /// @dev Internal function to do common checks after actual batch committing. + /// @param _batchIndex The index of current batch. + /// @param _batchHash The hash of current batch. + function _afterCommitBatch(uint256 _batchIndex, bytes32 _batchHash) private { + committedBatches[_batchIndex] = _batchHash; + emit CommitBatch(_batchIndex, _batchHash); + } + + /// @dev Internal function to do common checks before actual batch finalization. + /// @param _batchHeader The current batch header in calldata. + /// @param _postStateRoot The state root after current batch. + /// @return batchPtr The start memory offset of current batch in memory. + /// @return _batchHash The hash of current batch. + /// @return _batchIndex The index of current batch. + function _beforeFinalizeBatch(bytes calldata _batchHeader, bytes32 _postStateRoot) + internal + view + returns ( + uint256 batchPtr, + bytes32 _batchHash, + uint256 _batchIndex + ) + { + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); + + // compute batch hash and verify + (batchPtr, _batchHash, _batchIndex, ) = _loadBatchHeader(_batchHeader); + + // avoid duplicated verification + if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); + } + + /// @dev Internal function to do common checks after actual batch finalization. + /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped after current batch. + /// @param _batchIndex The index of current batch. + /// @param _batchHash The hash of current batch. + /// @param _postStateRoot The state root after current batch. + /// @param _withdrawRoot The withdraw trie root after current batch. + function _afterFinalizeBatch( + uint256 _totalL1MessagesPoppedOverall, + uint256 _batchIndex, + bytes32 _batchHash, + bytes32 _postStateRoot, + bytes32 _withdrawRoot + ) internal { + // check and update lastFinalizedBatchIndex + unchecked { + if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); + lastFinalizedBatchIndex = _batchIndex; + } + + // record state root and withdraw root + finalizedStateRoots[_batchIndex] = _postStateRoot; + withdrawRoots[_batchIndex] = _withdrawRoot; + + // Pop finalized and non-skipped message from L1MessageQueue. + _finalizePoppedL1Messages(_totalL1MessagesPoppedOverall); + + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + } + + /// @dev Internal function to check blob versioned hash. + /// @param _blobVersionedHash The blob versioned hash to check. + /// @param _blobDataProof The blob data proof used to verify the blob versioned hash. + function _checkBlobVersionedHash(bytes32 _blobVersionedHash, bytes calldata _blobDataProof) internal view { + // Calls the point evaluation precompile and verifies the output + (bool success, bytes memory data) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall( + abi.encodePacked(_blobVersionedHash, _blobDataProof) + ); + // We verify that the point evaluation precompile call was successful by testing the latter 32 bytes of the + // response is equal to BLS_MODULUS as defined in https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile + if (!success) revert ErrorCallPointEvaluationPrecompileFailed(); + (, uint256 result) = abi.decode(data, (uint256, uint256)); + if (result != BLS_MODULUS) revert ErrorUnexpectedPointEvaluationPrecompileOutput(); + } + + /// @dev Internal function to check the `SkippedL1MessageBitmap`. + /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped after current batch. + /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch. + /// @param _skippedL1MessageBitmap The skipped L1 message bitmap in calldata. + /// @param _doPopMessage Whether we actually pop the messages from message queue. + function _checkSkippedL1MessageBitmap( + uint256 _totalL1MessagesPoppedOverall, + uint256 _totalL1MessagesPoppedInBatch, + bytes calldata _skippedL1MessageBitmap, + bool _doPopMessage + ) private { + // check the length of bitmap + unchecked { + if (((_totalL1MessagesPoppedInBatch + 255) / 256) * 32 != _skippedL1MessageBitmap.length) { + revert ErrorIncorrectBitmapLength(); + } + } + if (_doPopMessage) { + _popL1MessagesCalldata( + _skippedL1MessageBitmap, + _totalL1MessagesPoppedOverall, + _totalL1MessagesPoppedInBatch + ); + } + } + + /// @dev Internal function to get the blob versioned hash. + /// @return _blobVersionedHash The retrieved blob versioned hash. + function _getBlobVersionedHash() internal virtual returns (bytes32 _blobVersionedHash) { + bytes32 _secondBlob; + // Get blob's versioned hash + assembly { + _blobVersionedHash := blobhash(0) + _secondBlob := blobhash(1) + } + if (_blobVersionedHash == bytes32(0)) revert ErrorNoBlobFound(); + if (_secondBlob != bytes32(0)) revert ErrorFoundMultipleBlobs(); + } + /// @dev Internal function to commit chunks with version 0 /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped before the list of chunks. /// @param _chunks The list of chunks to commit. /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. /// @return _batchDataHash The computed data hash for the list of chunks. - /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages poped in this batch, including skipped one. + /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages popped in this batch, including skipped one. function _commitChunksV0( uint256 _totalL1MessagesPoppedOverall, bytes[] memory _chunks, @@ -625,33 +838,13 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped before the list of chunks. /// @param _chunks The list of chunks to commit. /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. - /// @return _blobVersionedHash The blob versioned hash for the blob carried in this transaction. /// @return _batchDataHash The computed data hash for the list of chunks. - /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages poped in this batch, including skipped one. + /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages popped in this batch, including skipped one. function _commitChunksV1( uint256 _totalL1MessagesPoppedOverall, bytes[] memory _chunks, bytes calldata _skippedL1MessageBitmap - ) - internal - view - returns ( - bytes32 _blobVersionedHash, - bytes32 _batchDataHash, - uint256 _totalL1MessagesPoppedInBatch - ) - { - { - bytes32 _secondBlob; - // Get blob's versioned hash - assembly { - _blobVersionedHash := blobhash(0) - _secondBlob := blobhash(1) - } - if (_blobVersionedHash == bytes32(0)) revert ErrorNoBlobFound(); - if (_secondBlob != bytes32(0)) revert ErrorFoundMultipleBlob(); - } - + ) internal view returns (bytes32 _batchDataHash, uint256 _totalL1MessagesPoppedInBatch) { uint256 _chunksLength = _chunks.length; // load `batchDataHashPtr` and reserve the memory region for chunk data hashes @@ -697,6 +890,7 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { function _loadBatchHeader(bytes calldata _batchHeader) internal view + virtual returns ( uint256 batchPtr, bytes32 _batchHash, @@ -713,18 +907,22 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { uint256 _length; if (version == 0) { (batchPtr, _length) = BatchHeaderV0Codec.loadAndValidate(_batchHeader); - _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, _length); - _batchIndex = BatchHeaderV0Codec.getBatchIndex(batchPtr); - } else if (version >= 1) { + } else if (version <= 2) { (batchPtr, _length) = BatchHeaderV1Codec.loadAndValidate(_batchHeader); - _batchHash = BatchHeaderV1Codec.computeBatchHash(batchPtr, _length); - _batchIndex = BatchHeaderV1Codec.getBatchIndex(batchPtr); + } else if (version >= 3) { + (batchPtr, _length) = BatchHeaderV3Codec.loadAndValidate(_batchHeader); } + + // the code for compute batch hash is the same for V0, V1, V2, V3 + // also the `_batchIndex` and `_totalL1MessagesPoppedOverall`. + _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, _length); + _batchIndex = BatchHeaderV0Codec.getBatchIndex(batchPtr); + _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + // only check when genesis is imported if (committedBatches[_batchIndex] != _batchHash && finalizedStateRoots[0] != bytes32(0)) { revert ErrorIncorrectBatchHash(); } - _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); } /// @dev Internal function to commit a chunk with version 0. @@ -948,28 +1146,75 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { return _ptr; } - /// @dev Internal function to pop finalized l1 messages. - /// @param bitmapPtr The memory offset of `skippedL1MessageBitmap`. - /// @param totalL1MessagePopped The total number of L1 messages poped in all batches including current batch. - /// @param l1MessagePopped The number of L1 messages popped in current batch. + /// @param totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + function _finalizePoppedL1Messages(uint256 totalL1MessagesPoppedOverall) internal { + if (totalL1MessagesPoppedOverall > 0) { + unchecked { + IL1MessageQueue(messageQueue).finalizePoppedCrossDomainMessage(totalL1MessagesPoppedOverall); + } + } + } + + /// @dev Internal function to pop l1 messages from `skippedL1MessageBitmap` in memory. + /// @param bitmapPtr The memory offset of `skippedL1MessageBitmap` in memory. + /// @param totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + /// @param totalL1MessagesPoppedInBatch The number of L1 messages popped in current batch. + function _popL1MessagesMemory( + uint256 bitmapPtr, + uint256 totalL1MessagesPoppedOverall, + uint256 totalL1MessagesPoppedInBatch + ) internal { + if (totalL1MessagesPoppedInBatch == 0) return; + _popL1Messages(false, bitmapPtr, totalL1MessagesPoppedOverall, totalL1MessagesPoppedInBatch); + } + + /// @dev Internal function to pop l1 messages from `skippedL1MessageBitmap` in calldata. + /// @param skippedL1MessageBitmap The `skippedL1MessageBitmap` in calldata. + /// @param totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + /// @param totalL1MessagesPoppedInBatch The number of L1 messages popped in current batch. + function _popL1MessagesCalldata( + bytes calldata skippedL1MessageBitmap, + uint256 totalL1MessagesPoppedOverall, + uint256 totalL1MessagesPoppedInBatch + ) internal { + if (totalL1MessagesPoppedInBatch == 0) return; + uint256 bitmapPtr; + assembly { + bitmapPtr := skippedL1MessageBitmap.offset + } + _popL1Messages(true, bitmapPtr, totalL1MessagesPoppedOverall, totalL1MessagesPoppedInBatch); + } + + /// @dev Internal function to pop l1 messages from `skippedL1MessageBitmap` in calldata or memory. + /// @param isCalldata Whether the `skippedL1MessageBitmap` is in calldata or memory. + /// @param bitmapPtr The offset of `skippedL1MessageBitmap` in calldata or memory. + /// @param totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + /// @param totalL1MessagesPoppedInBatch The number of L1 messages popped in current batch. function _popL1Messages( + bool isCalldata, uint256 bitmapPtr, - uint256 totalL1MessagePopped, - uint256 l1MessagePopped + uint256 totalL1MessagesPoppedOverall, + uint256 totalL1MessagesPoppedInBatch ) internal { - if (l1MessagePopped == 0) return; + if (totalL1MessagesPoppedInBatch == 0) return; unchecked { - uint256 startIndex = totalL1MessagePopped - l1MessagePopped; + uint256 startIndex = totalL1MessagesPoppedOverall - totalL1MessagesPoppedInBatch; uint256 bitmap; - for (uint256 i = 0; i < l1MessagePopped; i += 256) { + for (uint256 i = 0; i < totalL1MessagesPoppedInBatch; i += 256) { uint256 _count = 256; - if (l1MessagePopped - i < _count) { - _count = l1MessagePopped - i; + if (totalL1MessagesPoppedInBatch - i < _count) { + _count = totalL1MessagesPoppedInBatch - i; } assembly { - bitmap := mload(bitmapPtr) + switch isCalldata + case 1 { + bitmap := calldataload(bitmapPtr) + } + default { + bitmap := mload(bitmapPtr) + } bitmapPtr := add(bitmapPtr, 0x20) } IL1MessageQueue(messageQueue).popCrossDomainMessage(startIndex, _count, bitmap); diff --git a/src/libraries/codec/BatchHeaderV0Codec.sol b/src/libraries/codec/BatchHeaderV0Codec.sol index fabfe68..3668586 100644 --- a/src/libraries/codec/BatchHeaderV0Codec.sol +++ b/src/libraries/codec/BatchHeaderV0Codec.sol @@ -17,10 +17,10 @@ pragma solidity ^0.8.24; /// ``` library BatchHeaderV0Codec { /// @dev Thrown when the length of batch header is smaller than 89 - error ErrorBatchHeaderLengthTooSmall(); + error ErrorBatchHeaderV0LengthTooSmall(); /// @dev Thrown when the length of skippedL1MessageBitmap is incorrect. - error ErrorIncorrectBitmapLength(); + error ErrorIncorrectBitmapLengthV0(); /// @dev The length of fixed parts of the batch header. uint256 internal constant BATCH_HEADER_FIXED_LENGTH = 89; @@ -31,7 +31,7 @@ library BatchHeaderV0Codec { /// @return length The length in bytes of the batch header. function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { length = _batchHeader.length; - if (length < BATCH_HEADER_FIXED_LENGTH) revert ErrorBatchHeaderLengthTooSmall(); + if (length < BATCH_HEADER_FIXED_LENGTH) revert ErrorBatchHeaderV0LengthTooSmall(); // copy batch header to memory. assembly { @@ -45,7 +45,7 @@ library BatchHeaderV0Codec { unchecked { if (length != BATCH_HEADER_FIXED_LENGTH + ((_l1MessagePopped + 255) / 256) * 32) { - revert ErrorIncorrectBitmapLength(); + revert ErrorIncorrectBitmapLengthV0(); } } } diff --git a/src/libraries/codec/BatchHeaderV1Codec.sol b/src/libraries/codec/BatchHeaderV1Codec.sol index 228173c..45c31ae 100644 --- a/src/libraries/codec/BatchHeaderV1Codec.sol +++ b/src/libraries/codec/BatchHeaderV1Codec.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.24; +import {BatchHeaderV0Codec} from "./BatchHeaderV0Codec.sol"; + // solhint-disable no-inline-assembly /// @dev Below is the encoding for `BatchHeader` V1, total 121 + ceil(l1MessagePopped / 256) * 32 bytes. @@ -16,12 +18,16 @@ pragma solidity ^0.8.24; /// * parentBatchHash 32 bytes32 89 The parent batch hash /// * skippedL1MessageBitmap dynamic uint256[] 121 A bitmap to indicate which L1 messages are skipped in the batch /// ``` +/// +/// The codes for `version`, `batchIndex`, `l1MessagePopped`, `totalL1MessagePopped`, `dataHash` and `computeBatchHash` +/// are the same as `BatchHeaderV0Codec`. However, we won't reuse the codes in this library since they are very simple. +/// Reusing the codes will introduce extra code jump in solidity, which increase gas costs. library BatchHeaderV1Codec { /// @dev Thrown when the length of batch header is smaller than 121. - error ErrorBatchHeaderLengthTooSmall(); + error ErrorBatchHeaderV1LengthTooSmall(); /// @dev Thrown when the length of skippedL1MessageBitmap is incorrect. - error ErrorIncorrectBitmapLength(); + error ErrorIncorrectBitmapLengthV1(); /// @dev The length of fixed parts of the batch header. uint256 internal constant BATCH_HEADER_FIXED_LENGTH = 121; @@ -32,7 +38,7 @@ library BatchHeaderV1Codec { /// @return length The length in bytes of the batch header. function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { length = _batchHeader.length; - if (length < BATCH_HEADER_FIXED_LENGTH) revert ErrorBatchHeaderLengthTooSmall(); + if (length < BATCH_HEADER_FIXED_LENGTH) revert ErrorBatchHeaderV1LengthTooSmall(); // copy batch header to memory. assembly { @@ -42,56 +48,11 @@ library BatchHeaderV1Codec { } // check batch header length - uint256 _l1MessagePopped = getL1MessagePopped(batchPtr); + uint256 _l1MessagePopped = BatchHeaderV0Codec.getL1MessagePopped(batchPtr); unchecked { if (length != BATCH_HEADER_FIXED_LENGTH + ((_l1MessagePopped + 255) / 256) * 32) - revert ErrorIncorrectBitmapLength(); - } - } - - /// @notice Get the version of the batch header. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @return _version The version of the batch header. - function getVersion(uint256 batchPtr) internal pure returns (uint256 _version) { - assembly { - _version := shr(248, mload(batchPtr)) - } - } - - /// @notice Get the batch index of the batch. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @return _batchIndex The batch index of the batch. - function getBatchIndex(uint256 batchPtr) internal pure returns (uint256 _batchIndex) { - assembly { - _batchIndex := shr(192, mload(add(batchPtr, 1))) - } - } - - /// @notice Get the number of L1 messages of the batch. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @return _l1MessagePopped The number of L1 messages of the batch. - function getL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _l1MessagePopped) { - assembly { - _l1MessagePopped := shr(192, mload(add(batchPtr, 9))) - } - } - - /// @notice Get the number of L1 messages popped before this batch. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @return _totalL1MessagePopped The number of L1 messages popped before this batch. - function getTotalL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _totalL1MessagePopped) { - assembly { - _totalL1MessagePopped := shr(192, mload(add(batchPtr, 17))) - } - } - - /// @notice Get the data hash of the batch header. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @return _dataHash The data hash of the batch header. - function getDataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) { - assembly { - _dataHash := mload(add(batchPtr, 25)) + revert ErrorIncorrectBitmapLengthV1(); } } @@ -133,57 +94,6 @@ library BatchHeaderV1Codec { } } - /// @notice Store the version of batch header. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param _version The version of batch header. - function storeVersion(uint256 batchPtr, uint256 _version) internal pure { - assembly { - mstore8(batchPtr, _version) - } - } - - /// @notice Store the batch index of batch header. - /// @dev Because this function can overwrite the subsequent fields, it must be called before - /// `storeL1MessagePopped`, `storeTotalL1MessagePopped`, and `storeDataHash`. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param _batchIndex The batch index. - function storeBatchIndex(uint256 batchPtr, uint256 _batchIndex) internal pure { - assembly { - mstore(add(batchPtr, 1), shl(192, _batchIndex)) - } - } - - /// @notice Store the number of L1 messages popped in current batch to batch header. - /// @dev Because this function can overwrite the subsequent fields, it must be called before - /// `storeTotalL1MessagePopped` and `storeDataHash`. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param _l1MessagePopped The number of L1 messages popped in current batch. - function storeL1MessagePopped(uint256 batchPtr, uint256 _l1MessagePopped) internal pure { - assembly { - mstore(add(batchPtr, 9), shl(192, _l1MessagePopped)) - } - } - - /// @notice Store the total number of L1 messages popped after current batch to batch header. - /// @dev Because this function can overwrite the subsequent fields, it must be called before - /// `storeDataHash`. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param _totalL1MessagePopped The total number of L1 messages popped after current batch. - function storeTotalL1MessagePopped(uint256 batchPtr, uint256 _totalL1MessagePopped) internal pure { - assembly { - mstore(add(batchPtr, 17), shl(192, _totalL1MessagePopped)) - } - } - - /// @notice Store the data hash of batch header. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param _dataHash The data hash. - function storeDataHash(uint256 batchPtr, bytes32 _dataHash) internal pure { - assembly { - mstore(add(batchPtr, 25), _dataHash) - } - } - /// @notice Store the parent batch hash of batch header. /// @param batchPtr The start memory offset of the batch header in memory. /// @param _blobVersionedHash The versioned hash of the blob with this batch’s data. @@ -214,17 +124,4 @@ library BatchHeaderV1Codec { ) } } - - /// @notice Compute the batch hash. - /// @dev Caller should make sure that the encoded batch header is correct. - /// - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param length The length of the batch. - /// @return _batchHash The hash of the corresponding batch. - function computeBatchHash(uint256 batchPtr, uint256 length) internal pure returns (bytes32 _batchHash) { - // in the current version, the hash is: keccak(BatchHeader without timestamp) - assembly { - _batchHash := keccak256(batchPtr, length) - } - } } diff --git a/src/libraries/codec/BatchHeaderV3Codec.sol b/src/libraries/codec/BatchHeaderV3Codec.sol new file mode 100644 index 0000000..c07014b --- /dev/null +++ b/src/libraries/codec/BatchHeaderV3Codec.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +// solhint-disable no-inline-assembly + +/// @dev Below is the encoding for `BatchHeader` V3, total 193 bytes. +/// ```text +/// * Field Bytes Type Index Comments +/// * version 1 uint8 0 The batch version +/// * batchIndex 8 uint64 1 The index of the batch +/// * l1MessagePopped 8 uint64 9 Number of L1 messages popped in the batch +/// * totalL1MessagePopped 8 uint64 17 Number of total L1 messages popped after the batch +/// * dataHash 32 bytes32 25 The data hash of the batch +/// * blobVersionedHash 32 bytes32 57 The versioned hash of the blob with this batch’s data +/// * parentBatchHash 32 bytes32 89 The parent batch hash +/// * lastBlockTimestamp 8 uint64 121 A bitmap to indicate which L1 messages are skipped in the batch +/// * blobDataProof 64 bytes64 129 The blob data proof: z (32), y (32) +/// ``` +/// The codes for `version`, `batchIndex`, `l1MessagePopped`, `totalL1MessagePopped`, `dataHash` and `computeBatchHash` +/// are the same as `BatchHeaderV0Codec`. The codes for `blobVersionedHash` and `parentBatchHash` are the same as +/// `BatchHeaderV1Codec`. However, we won't reuse the codes since they are very simple. Reusing the codes will introduce +/// extra code jump in solidity, which increase gas costs. +library BatchHeaderV3Codec { + /// @dev Thrown when the length of batch header is not equal to 193. + error ErrorBatchHeaderV3LengthMismatch(); + + /// @dev The length of fixed parts of the batch header. + uint256 internal constant BATCH_HEADER_FIXED_LENGTH = 193; + + /// @notice Load batch header in calldata to memory. + /// @param _batchHeader The encoded batch header bytes in calldata. + /// @return batchPtr The start memory offset of the batch header in memory. + /// @return length The length in bytes of the batch header. + function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { + length = _batchHeader.length; + if (length != BATCH_HEADER_FIXED_LENGTH) { + revert ErrorBatchHeaderV3LengthMismatch(); + } + + // copy batch header to memory. + assembly { + batchPtr := mload(0x40) + calldatacopy(batchPtr, _batchHeader.offset, length) + mstore(0x40, add(batchPtr, length)) + } + } + + /// @notice Store the last block timestamp of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _lastBlockTimestamp The timestamp of the last block in this batch. + function storeLastBlockTimestamp(uint256 batchPtr, uint256 _lastBlockTimestamp) internal pure { + assembly { + mstore(add(batchPtr, 121), shl(192, _lastBlockTimestamp)) + } + } + + /// @notice Store the last block timestamp of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param blobDataProof The blob data proof: z (32), y (32) + function storeBlobDataProof(uint256 batchPtr, bytes calldata blobDataProof) internal pure { + assembly { + // z and y is in the first 64 bytes of `blobDataProof` + calldatacopy(add(batchPtr, 129), blobDataProof.offset, 64) + } + } +} diff --git a/src/libraries/codec/ChunkCodecV0.sol b/src/libraries/codec/ChunkCodecV0.sol index 1d4751c..a4d49b8 100644 --- a/src/libraries/codec/ChunkCodecV0.sol +++ b/src/libraries/codec/ChunkCodecV0.sol @@ -26,10 +26,10 @@ pragma solidity ^0.8.24; /// ``` library ChunkCodecV0 { /// @dev Thrown when no blocks in chunk. - error ErrorNoBlockInChunk(); + error ErrorNoBlockInChunkV0(); /// @dev Thrown when the length of chunk is incorrect. - error ErrorIncorrectChunkLength(); + error ErrorIncorrectChunkLengthV0(); /// @dev The length of one block context. uint256 internal constant BLOCK_CONTEXT_LENGTH = 60; @@ -42,10 +42,10 @@ library ChunkCodecV0 { _numBlocks = getNumBlocks(chunkPtr); // should contain at least one block - if (_numBlocks == 0) revert ErrorNoBlockInChunk(); + if (_numBlocks == 0) revert ErrorNoBlockInChunkV0(); // should contain at least the number of the blocks and block contexts - if (_length < 1 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectChunkLength(); + if (_length < 1 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectChunkLengthV0(); } /// @notice Return the start memory offset of `l2Transactions`. @@ -81,12 +81,7 @@ library ChunkCodecV0 { // only first 58 bytes is needed. assembly { chunkPtr := add(chunkPtr, add(1, mul(BLOCK_CONTEXT_LENGTH, index))) - mstore(dstPtr, mload(chunkPtr)) // first 32 bytes - mstore( - add(dstPtr, 0x20), - and(mload(add(chunkPtr, 0x20)), 0xffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000) - ) // next 26 bytes - + mcopy(dstPtr, chunkPtr, 58) dstPtr := add(dstPtr, 58) } diff --git a/src/libraries/codec/ChunkCodecV1.sol b/src/libraries/codec/ChunkCodecV1.sol index 51f0993..4390fe4 100644 --- a/src/libraries/codec/ChunkCodecV1.sol +++ b/src/libraries/codec/ChunkCodecV1.sol @@ -28,10 +28,10 @@ import {ChunkCodecV0} from "./ChunkCodecV0.sol"; /// ``` library ChunkCodecV1 { /// @dev Thrown when no blocks in chunk. - error ErrorNoBlockInChunk(); + error ErrorNoBlockInChunkV1(); /// @dev Thrown when the length of chunk is incorrect. - error ErrorIncorrectChunkLength(); + error ErrorIncorrectChunkLengthV1(); /// @dev The length of one block context. uint256 internal constant BLOCK_CONTEXT_LENGTH = 60; @@ -44,10 +44,10 @@ library ChunkCodecV1 { _numBlocks = getNumBlocks(chunkPtr); // should contain at least one block - if (_numBlocks == 0) revert ErrorNoBlockInChunk(); + if (_numBlocks == 0) revert ErrorNoBlockInChunkV1(); // should contain the number of the blocks and block contexts - if (_length != 1 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectChunkLength(); + if (_length != 1 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectChunkLengthV1(); } /// @notice Return the number of blocks in current chunk. @@ -83,4 +83,17 @@ library ChunkCodecV1 { function getNumL1Messages(uint256 blockPtr) internal pure returns (uint256 _numL1Messages) { return ChunkCodecV0.getNumL1Messages(blockPtr); } + + /// @notice Return the block timestamp of last block in current chunk + /// @param chunk Current chunk in memory. + /// @return _timestamp The number of L1 messages in current block. + function getLastBlockTimestamp(bytes memory chunk) internal pure returns (uint256 _timestamp) { + assembly { + let chunkPtr := add(chunk, 0x20) + let numBlocks := shr(248, mload(chunkPtr)) + // blockPtr is chunkPtr + 1 + (numBlocks - 1) * BLOCK_CONTEXT_LENGTH + let blockPtr := sub(add(chunkPtr, mul(numBlocks, 60)), 59) + _timestamp := shr(192, mload(add(blockPtr, 8))) + } + } } diff --git a/src/libraries/verifier/IRollupVerifier.sol b/src/libraries/verifier/IRollupVerifier.sol index 3ae9ab1..b5f7752 100644 --- a/src/libraries/verifier/IRollupVerifier.sol +++ b/src/libraries/verifier/IRollupVerifier.sol @@ -26,4 +26,16 @@ interface IRollupVerifier { bytes calldata aggrProof, bytes32 publicInputHash ) external view; + + /// @notice Verify bundle zk proof. + /// @param version The version of verifier to use. + /// @param batchIndex The batch index used to select verifier. + /// @param bundleProof The aggregated proof. + /// @param publicInput The public input. + function verifyBundleProof( + uint256 version, + uint256 batchIndex, + bytes calldata bundleProof, + bytes calldata publicInput + ) external view; } diff --git a/src/libraries/verifier/IZkEvmVerifier.sol b/src/libraries/verifier/IZkEvmVerifier.sol index 853aca1..244b0de 100644 --- a/src/libraries/verifier/IZkEvmVerifier.sol +++ b/src/libraries/verifier/IZkEvmVerifier.sol @@ -2,9 +2,16 @@ pragma solidity ^0.8.24; -interface IZkEvmVerifier { +interface IZkEvmVerifierV1 { /// @notice Verify aggregate zk proof. /// @param aggrProof The aggregated proof. /// @param publicInputHash The public input hash. function verify(bytes calldata aggrProof, bytes32 publicInputHash) external view; } + +interface IZkEvmVerifierV2 { + /// @notice Verify bundle zk proof. + /// @param bundleProof The bundle recursion proof. + /// @param publicInput The public input. + function verify(bytes calldata bundleProof, bytes calldata publicInput) external view; +} diff --git a/src/libraries/verifier/ZkEvmVerifierV1.sol b/src/libraries/verifier/ZkEvmVerifierV1.sol index 45bfe90..1ff15e1 100644 --- a/src/libraries/verifier/ZkEvmVerifierV1.sol +++ b/src/libraries/verifier/ZkEvmVerifierV1.sol @@ -2,11 +2,11 @@ pragma solidity =0.8.24; -import {IZkEvmVerifier} from "./IZkEvmVerifier.sol"; +import {IZkEvmVerifierV1} from "./IZkEvmVerifier.sol"; // solhint-disable no-inline-assembly -contract ZkEvmVerifierV1 is IZkEvmVerifier { +contract ZkEvmVerifierV1 is IZkEvmVerifierV1 { /********** * Errors * **********/ @@ -33,7 +33,7 @@ contract ZkEvmVerifierV1 is IZkEvmVerifier { * Public View Functions * *************************/ - /// @inheritdoc IZkEvmVerifier + /// @inheritdoc IZkEvmVerifierV1 function verify(bytes calldata aggrProof, bytes32 publicInputHash) external view override { address _verifier = plonkVerifier; bool success; diff --git a/src/libraries/verifier/ZkEvmVerifierV2.sol b/src/libraries/verifier/ZkEvmVerifierV2.sol new file mode 100644 index 0000000..85380a8 --- /dev/null +++ b/src/libraries/verifier/ZkEvmVerifierV2.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: MIT + +pragma solidity =0.8.24; + +import {IZkEvmVerifierV2} from "./IZkEvmVerifier.sol"; + +// solhint-disable no-inline-assembly + +contract ZkEvmVerifierV2 is IZkEvmVerifierV2 { + /********** + * Errors * + **********/ + + /// @dev Thrown when bundle recursion zk proof verification is failed. + error VerificationFailed(); + + /************* + * Constants * + *************/ + + /// @notice The address of highly optimized plonk verifier contract. + address public immutable plonkVerifier; + + /// @notice A predetermined digest for the `plonkVerifier`. + bytes32 public immutable verifierDigest; + + /*************** + * Constructor * + ***************/ + + constructor(address _verifier, bytes32 _verifierDigest) { + plonkVerifier = _verifier; + verifierDigest = _verifierDigest; + } + + /************************* + * Public View Functions * + *************************/ + + /// @inheritdoc IZkEvmVerifierV2 + /// + /// @dev Encoding for `publicInput` + /// ```text + /// | layer2ChainId | numBatches | prevStateRoot | prevBatchHash | postStateRoot | batchHash | withdrawRoot | + /// | 8 bytes | 4 bytes | 32 bytes | 32 bytes | 32 bytes | 32 bytes | 32 bytes | + /// ``` + function verify(bytes calldata bundleProof, bytes calldata publicInput) external view override { + address _verifier = plonkVerifier; + bytes32 _verifierDigest = verifierDigest; + bool success; + + // 1. the first 12 * 32 (0x180) bytes of `bundleProof` is `accumulator` + // 2. the rest bytes of `bundleProof` is the actual `bundle_recursion_proof` + // 3. Inserted between `accumulator` and `bundle_recursion_proof` are + // 32 * 13 (0x1a0) bytes, such that: + // | start | end | field | + // |---------------|---------------|-------------------------| + // | 0x00 | 0x180 | bundleProof[0x00:0x180] | + // | 0x180 | 0x180 + 0x20 | verifierDigest | + // | 0x180 + 0x20 | 0x180 + 0x40 | prevStateRoot_hi | + // | 0x180 + 0x40 | 0x180 + 0x60 | prevStateRoot_lo | + // | 0x180 + 0x60 | 0x180 + 0x80 | prevBatchHash_hi | + // | 0x180 + 0x80 | 0x180 + 0xa0 | prevBatchHash_lo | + // | 0x180 + 0xa0 | 0x180 + 0xc0 | postStateRoot_hi | + // | 0x180 + 0xc0 | 0x180 + 0xe0 | postStateRoot_lo | + // | 0x180 + 0xe0 | 0x180 + 0x100 | batchHash_hi | + // | 0x180 + 0x100 | 0x180 + 0x120 | batchHash_lo | + // | 0x180 + 0x120 | 0x180 + 0x140 | layer2ChainId | + // | 0x180 + 0x140 | 0x180 + 0x160 | withdrawRoot_hi | + // | 0x180 + 0x160 | 0x180 + 0x180 | withdrawRoot_lo | + // | 0x180 + 0x180 | 0x180 + 0x1a0 | numRound | + // | 0x180 + 0x1a0 | dynamic | bundleProof[0x180:] | + assembly { + let p := mload(0x40) + // 1. copy the accumulator's 0x180 bytes + calldatacopy(p, bundleProof.offset, 0x180) + // 2. insert the public input's 0x1a0 bytes + mstore(add(p, 0x180), _verifierDigest) // verifierDigest + let value := calldataload(add(publicInput.offset, 0xc)) + mstore(add(p, 0x1a0), shr(128, value)) // prevStateRoot_hi + mstore(add(p, 0x1c0), and(value, 0xffffffffffffffffffffffffffffffff)) // prevStateRoot_lo + value := calldataload(add(publicInput.offset, 0x2c)) + mstore(add(p, 0x1e0), shr(128, value)) // prevBatchHash_hi + mstore(add(p, 0x200), and(value, 0xffffffffffffffffffffffffffffffff)) // prevBatchHash_lo + value := calldataload(add(publicInput.offset, 0x4c)) + mstore(add(p, 0x220), shr(128, value)) // postStateRoot_hi + mstore(add(p, 0x240), and(value, 0xffffffffffffffffffffffffffffffff)) // postStateRoot_lo + value := calldataload(add(publicInput.offset, 0x6c)) + mstore(add(p, 0x260), shr(128, value)) // batchHash_hi + mstore(add(p, 0x280), and(value, 0xffffffffffffffffffffffffffffffff)) // batchHash_lo + value := shr(192, calldataload(publicInput.offset)) + mstore(add(p, 0x2a0), value) // layer2ChainId + value := calldataload(add(publicInput.offset, 0x8c)) + mstore(add(p, 0x2c0), shr(128, value)) // withdrawRoot_hi + mstore(add(p, 0x2e0), and(value, 0xffffffffffffffffffffffffffffffff)) // withdrawRoot_lo + value := shr(224, calldataload(add(publicInput.offset, 0x08))) + mstore(add(p, 0x300), sub(value, 1)) // numRound, which is numBatches - 1 + // 3. copy all remaining bytes from bundleProof + calldatacopy(add(p, 0x320), add(bundleProof.offset, 0x180), sub(bundleProof.length, 0x180)) + // 4. call plonk verifier + success := staticcall(gas(), _verifier, p, add(bundleProof.length, 0x1a0), 0x00, 0x00) + } + if (!success) { + revert VerificationFailed(); + } + } +} diff --git a/src/libraries/verifier/plonk-verifier/plonk_verifier_v0.12.0-rc.2.bin b/src/libraries/verifier/plonk-verifier/plonk_verifier_v0.12.0-rc.2.bin new file mode 100644 index 0000000000000000000000000000000000000000..b77f53864b0bfbe0da8b5af7ca3acfc961aaa86d GIT binary patch literal 16464 zcmb`Od3;S*_y12MB9WLf5#ttOsK`V@2sS~?a<5qo`xslTvBqj;C#cfFP)b$VhH9y) zR0rcmTa=o$RMlx!OIxK?Ra*Q$>)dm0c%Ikm>-ppN$31Jk_gd?-)|u{b$NVy3Jo_!bQ51ae==+9ryWG}^>dG>Dhe1eh!V!MC|OWeMo-I+nUA%coJZDAofi84C1+Z} zqjf}JLCDnnsOkAJ3+&-?=FQE)p_al(3l_{P1%u_V99F;zSP3g(6|92Quo~8awbFvk z0K+S>A&-&A$m8U3@&tK;JV~A;Pm!m{)8uLLEb=UPMGSaF4DuLxj66;rCr^+k$dlwr z@)UWBJWZY^&mzx)7iho>G{|G#yvjZMk1X?C_=`stc75)}RSmnvY-%tl`H%TE&g7SC zyJqm%RAG3Lmxc-shm#|`)662z6-+aYHr;dW(~30;NMuNI6lE-XI73lDBSVv8QO2H! zGJ*_YFf$1Kf(%c7ey|zDFlZ3><{%w4L4qRWNGiVfV6hNLWM+^;it-iHo(Eap91&m^ zHM)qZ00z&Cmz_|Q)QggO5QAt@Qs?B5dSIUi)zO*)BreI(lriPu3`GG885&NoK^f}d z42uGc`jf*cWA8&50SxmnGZ>Qu3wy?3i5Y_xW-Q96NTZsQW1%|8c&NIlK%kg`3`q{7 zjJSt06a_dkG&zDYT0Wd%Q9z=#$d(FVwj|uwr4D6Va5={n}e}fTCf>H z$2FLf$H^1q3GyU)k~~G8B2Sa2$+O6_;1x6Ag&O2B@)&uXJWieelmt>emf`tUjP6#K_aE8+zDslY7xz`L;k_o)z)~@PQ*dVw3G5 zmwAQs2<4CI2V$Ib#y+HDdCUOAO*RAA1KGlB25^K$VOTy8mL&Gj{ZFUNL$6S?1no)* z<)Ify6KRkpvWSq0SEyOi0F^X6^a3#=24X~@X!myh!}_waUu@lM1n|w1d$|?AW5W%6i5+iA`Q|+7Lf(AK&1^(X~RP= z5F=tBM#PCYh!Y7S0TM)#NP;AhB2pklq`mULK4Jgk3xRkRR71Mr0isj4VoJNDXY)J!I##MXw~JeYdR9pok8aOHNu^rqYXJ8vWB@@cA7n zOXx}nG0SkIR$u<_mra)iZXT0=Zu-4}l@DC{WXRuTXLY*Lv2BYF51%br(NPsh4cqHk zvSQwn39XI{OP*ReV}6T~`8flUs=oc#qRrn_tMU6KM^z%VM8Eg<#+*w?9q?_lVTrfO zzj3AiALXAZpK~?%O*7@E)1CS|stT#qioU+-^X^aI>NY00gLhVwJxx#kRrmg~Dyy2b zoIfDsvG-Ousv4;^aw_k>)a&P-HLh1X`O}E@Lw+Ci#r&XTiRH6PJUh5ba`uJh9|gARk~G4n8o`iSE91mcHgo%*uhkecb$78Aou6Oz_2H<+ zyzL;>WX{@k$6j?*IZ|V5=B50)b@ye_dP3-u&~A@MY})#1_>s+9r-kNEeQWin2OL#_ z)UugJ`Ja=m<~>7?th+R^$j#`fsZ*c&dFQ#^XU3Lp*Q-&6qbiZgwtaBv){ytF{$1_$ zE1%vk$xnSSqf6D5XNr_8=dCom&zRal*yTBKvuE_8 z*=Yw?ju$Im){d&i7pnlL%tG0Je%t-8YuCPXA`PTg+V*1Z`9as7`hM}8jCCvZrRo`d zvObQR{M!DUIftLx|La1ZY9vEy#F~9&0}pT7aeC|4XHT79I5F_fOF{azKkqy{chLT+ z4I_v7hKb}zEiwPgjD_jXE_~-|%${ey-jGqF&f>ot9a?HMo4>bga+Bl2Q58syJ329= z?LXD#l^U3MGkEpd>P132<}|%}Vs22!de83Oo4DLjl}Jr)RDbq{-kpOg_bK{B?2f2X zkJp%zw6(W4u3%H$VWmq3C`VO!<&?)_FQ$IwiGTf1-f`%sEj#KG!^(Zqzw(GZDFAGNDZ6G zYBwGEV#t!^N2iwDl(+6s>f4KVwm(_d)9lEiDOSx_994r;; z^mv6yyYD)x8mSRew~cH+x%~KTEaYB6O08Y1)_+`M$?mT{sTkMz$K20C20E%1QY%^W z0~dTSee=EK%n$G9BrTo#d{WhKZZGp2zPY_{=;=Xkd=o!ZSgwz2Z8 zedV9dJ~`yKJ69Z4j@0<|eK)V(J!yI8V<+yPJT~u{TX#=}9pQh^et+oLyEW>LcaCec zKx*+1uIol)YP|4x-k1;8Z~FB6Fs_xopf;Wp_hvfdn|8y;^Yx;PV$MyFo>49xN^_TIX7l({&e8e|CSinC8+Y@ z4GBYP#ts-Yc6E9p`pf_wE zoOn0{dO#3m<##{|E7;OODey~^B6^0b`os7j<(n{j%VXWX`$ zcavsJdSBc>Kec4=7fDYZP2M-U|E?3c6^1&h3aR1WOniU#_8$Ybvt5~Au%3Bu#eX-s zUB~4@j#_ZK(yAX8JE|I~A7y=tDoD<`o%i#Q!UGoTIQv>Z@v8Nm>*WfF3fv-ZhG+X zI%^MJDZilc#o}S@2S-&&c2qf1!&Y{yQln33^TS)l56|8_l&v37yw~Uk_cN!Zgq{5U zl^O>fRe{v%`gWIXr(gT&mnBErW*qrF^O@u4uZ84~?z(%^6G(QS>M(9r|z_m-uUX;v~L>E`O@g}p7U8(Rw1>P==I4iv+MbawPIU+++;#Z z-Qa<<&wrO6K6Le$LLuy>qjJ5aQta|CS zxH)s5S?XOi<@pJokapdauy7O-znvpla zQI$w7(ek6|{X$P~s8{`oRtsO<)3Qy}U&kBVzS4AJ*r|#OFFw20QB_E-R%OA}sWm^J zJiX30qpnUjC$*t2w(Qch(lT%m0u*s>bz-)5rDsZA0r>=sq z$*q$%xpm4Ww@wq4b?YpfoVtpJO-@}!W|LD_krS13>M9DG+&XEKTc>Pt>oifUTW1l` z&kH&$mGF!~FtZZ((pK18{QRwCc+5)5`+t5bymtToeY2AOzmx3epp`6dfe4@mOlb5H zMSI_g!sAS^N8neHg-5gn1!hIe1n?FV6ok&rp@DtN*bRWYTuwX73d`lRe_1-ql9r`^ znLEpZmbrh~)#kM9*DmX7Gc4oH$eE<9t8LJ-U%RZMUBRMdzcx;+J$D67%YN+`N4tW; za*SU)#?h`IY1ywG<7x|9_G{x}^J#Nh_G?GG+6>Fle(h*i+n{B?cC@2i-lAo{Hf{i0 zyS%1lzjlntMFMN=I!h)@?zb&L_AE}H5X2gRT+n(CM!LS2kqCy7uO zW7jDn)Wz6!8dMf_F?O9rgu1d+SJfawU0JHD%7{=`mg=f<5Z*J*vQ$@95TUM|T_=f9 zSI(|eM5rrg*J%*mg3NMuorRyv%wtvty2;y5To zdI|#J5({vs^uVE9Nx7h4Nu(%OqY~0)oTeC&qB@J}3|ohui&Zm-l?M)Tt1(bD235+f z#)-J2T1|k8(*z;_F$uzz0f*`oWs-`ZI!&bAI*aO%iC3su-S83iqq>3I>I_`j@W7!c z2UX|Lq1mbnBH`#%msF`~aws9Hs1mx>6;*1=)gVbRiwH6Mc*Gl&N&8Hb$1@_1>zW}m zo)ZZV93nv^L4rsUDG+JKDd%tPZQ6GEpQN`p|qDZ3{VXN#1X5(Kt-7c4iR@U ziyM?FC{s9RxrTHzC1om#an#Ws*3fPpBeE!FIcK$|;ndYMP*;;tOncxUvnB@>S0GL# zK$uemz?blAO6OU5O+|z}d*+%NL^Idaq-go7@r&(cHBxw5V-R zOnTs;MQsMc6%2=ngKBfSo@xrp72tRaQ5vVVq$qOZ4T>oub!gB!+$TC^ zdHS}s*_n!B z3U!iHG?8{QEy^^U%(@1sE-1l5W?e?aoXol$M5i!RP)xYQh$LkS4;)NZSAozObBA$? zYKkgEHAO9oy19u4DAC?W)Q6afjM%QNYY}rW?QM17I~6$6zZwIpdj1_#4eh$Jc6yKsdmk~IAk zf7DZHU#UfvpL~3!f=WeUSBcU`KJfOHDk?49 z*JO>-#H+iz=l-ziqgf^6D~&5Pu2-Ak6LzgSeb7v}7!Tys0t&(GFzw&v*)d%ZN zJEdDa`%9s43VlJydt|;d@s!j*e_K6zc*x28*nKA_t{m}v|2s$DZn`;beBg~6=`X$T z*#o+abW4oBuN;8bxM;(jk_LQH0G(lr_D&**kNq#k za0bLV^DP^+Z26bDZ#mVXW$s^Q&a$Ru=3h2^%eY{$Y&gsLxPb5w0$b-YvVXdw%;Pxt z+@;f(hSMi867Cg}P2*m=lCUml9mm93$1_4)MRYB>3aPGwvK8oVvlTQlrJbpq78nG5 zXemwjE}C@v5=v7JF}k4AEQh##L8aT5Qo5oGDjk~X++(Ic;##pUs0POWa6vV|;j=HO zbb$*hUHUJmbU_ysX0cC9I-_G^xrZ79`<4w_R{mw-TgEebk=s~Y<{ zHD*2yO%d+Yg$b%_ENDimYYa9UOGIhL#?qd#v2wVPU8_NjDT@2jY-~A7p`4U54Oc1C zfKnzy6ju}+TPc$}Y%667P$qS?pp+?HCCq?zm9 zu976BCfrqO!lBeeP$hDk2wSO%bl9h)Kusi~w0BLktArV_ZuylgC^a<@#a#f$R%*%| zww0Q4P*Vma4W*{SRYE1!rK{9bl9HlI#Jct?X;QMNl5#Cui5m{vN}PeXfvAEK=dKbb zB`#bgE}+CERZ0&WpOSLer=&?qA<9X~a+Odi&E|%y)ZBnlb4HcOZO&|^=Gm_Ss=QLk_7c^;qTdkDqAo_8)^?6yJrjTu-&tTaHzSW zTzTzJwtHp?P!^P0(0*n~ z5WPQUNvc#1HReRxC3G>fEQc}$sHNdh6N8Akq=>jfO*xTp$s&>tHIqcjAoi+C+}f71K-n5mj#=9npbYMTgUU9{p=?3KU81@+0@Q|K z|7joFNKlGzAKNJS_^Cnr+eUlw6S9rv6-CUph8KArv#sw7563e8*E2T7oPUySV0yb4!$LEBnU~HV5cZhBB+t1U@foN2)3Q!CTnzPtNk6?as(MV2v`oQ zVFj!OE1jZt3>~oXcc3JN4wR(5W)`vKCM$Gkr~Dn-F^}2a@IoDy!75k|i=y_zDQa(^ z12%4lAc3Hyzea#n=wQKWH(8=Xd+G1c-ayduLfvC_Fkn&Cfx#+R?iN|p!E!s~1+4hy z@SA_XnH5}+*7@;0HAz9+7h8#lv~v7zUv zv_XkW53m&#yx}WEd;d}bHQ4$!ee$cU?nVb zi!^5Ip#8Iz+SKPzzDS#QMC>$QpBXgj+Q=pAR_+-$>cWJ8uZq__+r#Y0y?GV)Bv%^V zI`Kl{q>!}Kl?|>n3(4CZwjk!196OPh{Vsfp*->CNhBne^(~)B~Y~0y8Xap5zv0$|q zAy^Amc+5_QTcj{sN9CWb@)KA0ZEY9-)~?F`jEmm-^NL>Gm$p1QV)E-ROg<6NrA+D0 zW+&#&tKBp(um0urGgkldbItg1`#raZRW5$$dhX2$or>n~JKV6E*@qwOb^h-dVWnc?pR(&v$yO=Kc?sum5<`(b$VIM{_*6aq+(%89RpFh+oiT3C9yk8!%$3h9dHM-6$G~i8pTpcX7R_e) zXX`8wl?gXaf7s~C2O+`P z@lS4Px2N~2AIu!>&5MnixJOQY_KBIXd(TXMdfSX;HU9lQ>VxZt-}v^E?iYvNi!^gA z%%(i1$8g(d%$B45v*mCE8Dp zw5oJ}+x#~>HC%S_-ipaT-}v!+)1$n3L75ZSjp6Af-g@fdk$o}mw)!$-SLiS8Ka3pO z@VAJb!Grsm9*xvV*wPiD z{bLtinaSeMoXUP@Z9-UB+!IUs{&8W&(C{K1O|SIk)rwscFstT!%?3r+eR;v~f4|&3 z^S2hyN6y)Hzw^sqre!uBZh94Fv(QGnZ6s#Hhm(7~c?|?DFXr-?T?|+W%U~5OcZ)2V z&GOGy`KvF+-njRCmM+gOH2e7M&NUfo-~RL8u6Ql+-7{-;_nKvP5#GESuXf)bwtva& z-(M=o`eaG$jQ9Fn?=U~m>J9JeDN+@br_0cj#pxXnCRTF?$=Z5|+U#Snd{C z)WIt3U?C{zZ~kBV+sRS!ZNprPJI8u6W`B5kR!=}#rtvWE3dvfuSA8~ea_DN z>#8Y~H!n1J=CPjruaEn6>FevC2(PzbNBfj|qqe+qquaW#zd0VaFxM2?n-_7Q-&^Ni z8vaYWcSp;Y5AoR-kN@;Uc-G0u9ez9(DNy zDUtN+xn&E6-duX(w~HexSL!(_?|A0Hyp4P3mg+Yv;*TPC7MrH;j4&KXGeBZ1LVQ1E Z@cRbjq5qv)VDj)D!jO0IH~jL({{xs)%uxUU literal 0 HcmV?d00001 diff --git a/src/libraries/verifier/plonk-verifier/plonk_verifier_v0.12.0-rc.3.bin b/src/libraries/verifier/plonk-verifier/plonk_verifier_v0.12.0-rc.3.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ba80d3ca6fa551baed7d77ce4f716706c67ffa0 GIT binary patch literal 16464 zcmb`Od3;S*_y12MB9WLfnb|@N6`4o~!6t}V?lsT*XwhnoHC8J-L6r`MnySh+wv<+j zw&snt=6PsU)oE2rQCd}{6~E6q_naGjp4aQ^`Q!J;J!`%9TI;jcneK4N0K{~Y zduC+|BR6n>VU+7G#H{Szxw!#?duPwe?$+DnrLbN%7n{P}dXs6Im!6w@J6{CkBt6w} z)c47%)@Ru*KgrGQ(RV@akl9ah$}9QUlqn@;Ud){AZ0t#1lrW}5$-L4sdP;80T&!hhKem4Il+gb#IaBf; zuOkBULMG=%P0fv&XAhS>XLdFYwG>8buwY&(7%Ye7umV=VN>~Z2U=^%})vy+QGM4^3Ls38@Lz81s#_oS* z1R26$W)S)X8J^tSU^9qe&>-&3MmlPO1VzY^RGj~4u@FdPW{^UP@)gsb2U*^15nvWJ zI*Td*2G5I^oluz63zK>fgJ@w==j4!jV4p|T(V7AzF3Hi9G3nnKiUJlgG@M|AGSt5_ zEDA8{PY$PyJ^#uGV3>!Q!I&gi*fR!8%owaNV_`-`8r7T}3)Ml!zp4uh1d15QkmNAR zi2Zklq5wyRCPz?4i+^WW6p-j|kfSJL(7!S;W3Xao5lm7<+cOriFk^_}&BjZb+ z@&w%p=*-M89L+H4q3bzJAs(jfOES!&OEOF&!9s#%Cxnw|IK$}CZBaG!cOsfR<|4AoQv*-#5kF$2ZH@&77j9(>k_9_4cb@PQ*dVuS4= zmwAQs2<4CIM`E0GM*mC4@|XdJn`{QKN3w<24B!Zhg0OrfEJ^HN_dlI754}RoVzev8 zl!sm*O{77Z$Ra`}UZG}j1617b&E&ZA`aq2f=GY_ktC8JNu-DrND*lw4bnsw zkp;3qB@9pr!$U6+BVr&%#ECeF6A2;#5=4?nf+Ue5QXoa7i8M$PSwt4d0+lpCB@GX~ zK#Yii7!fDpAWkHR1V|7`A_*O02si@g0>xu;5JRcuv~#|>Ni z^xKy!hy1iAAtLkWKx9!WLuz2#ZXr8vE_@?C_4}m_pNeRIrTBy;r7FHUs^Q=52VU5o zyqK#VWulvrzV*-**4&+O;p8NCT-Ax4zo@!c#Y&`(e?n^mQxri+jbuoTShKfu;NcD1&urfO;^_+u#s}ViElAJ*F=F30}RnTA`2**-dVooE_Am?u)zjBrJ1OB~p_b)|>f3uTDXg`V@Yq?DnV< zPgkFmxVe`%Hg7|nAtj3kC`VO!<)kOdUP}4O6Zh61yu;uxT6ECGhLridf2Co&llRxU z_*=f|h-!$I^|UBi^5ZSNhGnfTl09fu(ZJ!o*NoTMzvor_YfzfLf5;KFkXkyj=z!ys zemd4RWa)>=D!j7j$=4fH80k}uVo0q$(5l<4@Zfs`|ETxf7q8yB_gej@zL~Wxwr!1` zy^{v)yEMyDJ<(Ole=xT0sN-L6=o`S-Zy);3lfN&o{`bhrUqA1t3Z#Zj zXSJFPe>G(BvSX8rZ^&79DCONnJKCM9<7s+y;UufZ8;+_(YKb9#-&vA)b9{@2$5Jy^ zpLp?~BG2eepMIGKIjRb&?4I|f%zzCajgB6h+v1y-t@zsi_Vb=pkRULTW{8 zZs5F6rhc5Cl=11q?8GILUrwy@?Y)IZYV6vwes22RB|g)AYlmo)cY5b!@D|v)~P|i-oNUoa-_zs@B8uUT@#jdI)3uuspE5AxclH#*iru1%uRzwKd4@3taDtW z1yYNCa!WTHRsEHxb4Go#e!~|(B&9`Xygzz^qc^JAB+z?2hv?)pSy42ULqha9W?UWv4% zcVy>cQ``Q0Ch@?;L$4Pd@|EJiP&Owz9 ze-J;YM%e))29BOR;1x%dL$v6vw)ggAzPIVKvCk)c_Kj7!Tb;4Zj@(k8pM2%gJpIA8 zQI4oUYTW3+36*Z#9sTg!$*KESk8gZ3cvSHF`;Q$S*|SuBqNl}7M^z%V>a;UEJ!7`k zc#t@4!Y1+X!sOz?M-rbsmb7>gBupT+9;=Z5Q zw!<)Uu5wzM7Ms^~J-ZU)0Nqxmv!%*)B1YtMB~I zQMHg-deP19_bqRkn0HdYyV<(rf|>)XM&4gOZOorx%U*i!T(hb^)zSu1D}A;7NaxLU zT1KUPkaq4?Y`5+qjVH}oa=xqh>X+6tu30C1s-+oHOT9LG)$1>g`f+911v&4|P76L! zd+mX%<>ocIR5YyJz^KYejw(lL*ov-|tM>_Qc6j61p;;dfX6pwO?K!gk!;C4(VW)n0 zqxu0yRUoyRzSnu{nfX6oTYRid`qAGqUN~{#W=QVHF1t2d)x}1hYv8C#q=p3k@j>kI zcI_9}j32Q-^ZVL=*O~I!+h5(B@@=D8XN}GuIiGc<6;f-8o}ceDyIiPHvuw*PjmIU| z34U_sh3|922d{o=$IW#eozJ?`8mYC`PPtO%rOOr94*e;oMSfcUZR6jm)PKSDc~e@| zY&~g5!(z^?7E*(^9GJ0x}_T>pA`(EUHR-^d#>s`ry$ zE?e=+Cb6j6c)8S36-X`d!w*xYuWNJs(6|*Jy*%UX;j0dexe@*Q(Hq<9%)NJLTFwAR zRU)-mi_fO^3qA8e-D=OYT=3@Z7OkWHJW>DN)h6S^PFGlP>BY5M)A+_e9poOpQ|NCCn*qdiQ9F`N@s$Sn$8$^U340|}>Oo`9l zdfKO2*6`xHBz|O>rSOG#7JjRiWnLof5GRVjw^KVNY~l_{o7_5OlUt{WBHcR6Ca12P zVUtr=j@jhYmE%NFPF*=+lUpZka_f{$Zk;BIcIzygoVxOcO-@~TW|LD_o)g75b>)Rk zZk@Erty4C+b(*NOTW8ti)KxHSa_TBDo1D4|oT!XbS3%h1)=8V(I%Shvr-{nCbruo* zyr8pE5ziO|Gb?g0ZH2wX&)Kl|L3>Dn-3p8G%M==JIQ_yTG8_6i2!QAghnq> zxYzwCJkA7r1b!7+cto3*XI8*W0B>GiUg+#>8rZjt-2k}DWwf)buv|v_m!-2TX<7Q0 zxw9;2nfsSrZBEO6?b5C`!!q8CoJmT%+6FEAwM#qNuC}0Mzcwy5pEjpuzjm~%&9EHp*N%3z4O;eVM?2c(EL!$!;|8#` z%V}EnYezZS zntMFMN=I!h)@?zb&L_AE}H5X2gRT+n(CM!LS2kqCy7uO zW7jDn)Wz6!8dMr}F?O9rgu2pHSH&PgU1_ST!iZ2;n(C@>5Z*J*(o|PP5TUM&T_=f9 zSH`YWM5rrc*J%*mg3K~@orRyv%wtvpy2VmT;8 zdh!C{5({vs^uVE9Nx7h4Nu(%OqY~0)tfm-|qB@J}3|ohui&Zs6jf@<)gVbRiwH6Mc*Gf$N&8Hb$1x&~>zW}m zjuQzF93nv^L4rsUDG+JKDIyJ0L>d%lPZP(8EpQN`p|qFP4N!Fh#1X5`K!uqH4iR@U ziyD+EC{s9Rxw>>SC1om#an#WsR@ZJFBeE!FIcK$o;ndYIP*;OdOncxUvjzthRUl3z zK$uemz?blANatC34Ml`Jd*&J%L^IdWq-go7azbOD9TxlLt%FZpufF#5{$V3~_n-bo zzxhq$rWNnD?Q-3#%R|kY22yJpj%ZCr1R47xuE`zInjE4v1*nGQfrG(nN)QIiiQFho zUrD?goqs~)2F_f#r&RNa)0XG%cs`@XOIt6NtX~_cibR#$LKA7{NYu1IG@UgJOzEIoDGy4Z^5qQBIi_#ZVW@ zkoklGqW(`%-4o2sB+Vx{=n0Oy%Z>>*Q&6U)7}ZJ2RG=^eq=+<#4o#U4FIK&}ejK7s*_n!B z3U!iHG?8{QEy^^U%sK|B4k+G2W*tVvoXk2LM5i!RP)xYQh$LkS4;)NZM}g28bBA$? zYKkgEHAO9oy15AkD8b%G)Q6Y}jM%QNV-a&O?Q;T0ZGxaE)sk+41eMhIrxnsoP!1(1 zBJGkLvwTFiaH0VpIkwNp_ublwoN}m>M17(F6#*3^wM1z@1_#4eh$Jf7yKsdm5;gr4 zf80}PU#Uf9IFoTr%s7dfJnFxA^E;B$WdEfNQF%!2h`{%=x9sL8x{W36rW&H|4 z7b<;N_3YAw67#Cv?7gt%@e1dwyfOW~!d0t0BFyOXo0(*Q zB$0h;GzdrAOvZ`9ztgx!{(t#b8sCvmwvT+#q9wC1fT-r-aG zeXeikdm10<9P1aZp7Qd|JwwhJup=q< zk+1p5+#hpRCpTW$sLQd1qn`U~%Cv+J+mEi5G;Z(fUH-CGMHUEO{Bz>uiSq|td&5{W zcXO*xBSOYcJU==y@WDSzI+c$vS@;oQ`_LDvu>H!1k+nX5_raC-KKN$9;6cq_Jz9I! z#;@+1=F)AST&eFDu6^rbYq2hB=ZW`|SC>j08a)2eU)xR=%h+`K_=)_0p^0}M5w;I~ zl5`Gm3J(6`{$c7_f1AhL#q%F&Bk9t4Y`%LcOU7-EZIv+UO#1o>R= zr5Fwgo0vn=Chm~3$*t2iNhfC6qreu)cupj40Jfl@u;f1p&4d+lwbg%Xy5GqI}DBEi9)f z_vucGlU-NSviqyuOc74DqGjRF=FYODW$s^Q&a$9o=3h3PWlqb6yNui39GY-I^hu0_dxd0ExtFdatP5JlF>%)Mj1X55T}!S)imRY(1-jd81&vH;XDX)!20R_qI^zVSa?Q1x;6>=Tp5=$KgUp~k?zWrLQLe_8mJv5#05{xd+wmJTrvVk$?dKF9k$ zG|W^LS_TQp#}yKbBPggmpGAdNf1ewB$0AS z5own+k>!#FN;g2^hKF7t=1@8#;x2I_0ZPLDg&>A+5x6$tBVu2GKn4^A$br)N8j&vP zn!@ok)3IcxEBiw+U3n%4g0w5F9ud|BN+fI*AcR8=R~Xl#Ba95Qp#dp6>J1HBx*_v1 zeWh&3;WwlaG`<`*6!r)W1yxC(&&gNF!r8SeG<@7W^phhLwRW%iXy1@}H8Sj~M!rss zm`_7fggbR%g6bLxnvv=nfz3t|QJS%lv}bIj9BydWYEUDJ;=VK+S&mXDC#4L-Rmw1+ zl)(_i6$Qsu%HR&$N*Mx_L0v5EGhki$l@uvys?<=@J|)XxTdA=@N*1CLN{yMT zBuS|;ca<7*C^Z&TiQLA*R%$FA_9-b)V~Hs3U1RMkVFs*QekBV^O$FTvDm9U$q^J_PO_WbbJM2@kNJ%3qpw!fGl!_Xp)RehOO&OG$ za;oGWIJQz#;jpdLRDzlcL=93>t`aJ-uKh}ylq{;GT+3GChQqcJXCQ7Ms-VQVtHeo( z3s;E?C~--Z(gVk*q#X7sX;M;%a#FHfB~(hYnc*rmGoaLrQ6+MlFhnm~OT#^*yE-516k|vT4W!iNLl&SCzM@O-x2H~@f-V0k=@KbOcib9dz{qenl zp2WHD{wW*?LHkQcE8p=J9%x;(EYo5h@qoB~t5{^t5dqjr2 zGSa>`NJdh!LNdK;XDRzS&C(9HvZX9gmPV9g*473noqOP*vNdxkOAv9FsIIjDwPx6V z+Q-%slHGM2W+UC91X`tC&cypqEyR5IrWWC-+4}Yav=Ix9> z4i5dk)@NOx?f9VT5oUYoHCv#4d*!rgFEAT6?ip-nA*j8W3)X@a9(phc8~YV)vL47smyBRkY5z?q&z>&8e_Esp8O9 z2^SM4grugdsDHC*NY1XXc`?W3=<&St_u-Sw4g#|=w2@Am4ji*#OhuA^|;bYz$f z8+W!23PFikG_3L>1gl}G$a0G$X6q>3+3?$-li{T;gSzmTow$?O$$&aGu6jp_pn#f! zm0pBk6)c0*Zjpd`C*i8+#3$Uj&~a6beV;5_zh%O)vX^3xWqW$Z#$7+o|0vOF{md`T zPL?+({v^)}d${d>3q83`e$17X;T^|(ZQPkTX6*ABD_&Uq{4-{@f!WYLo4IW)n$7ah z)=419F$*OLSPNEqQ3$J?qHK=YuyO8}oO0rP+w{>7;&<$QDdE-|<8Gh%wBglHLV~m6 zp554XcdwN{n%UZ$Q#NY+ZaMMAXQr3k^Yz5%w@zDH{h!~WKDl-H?e9MCc4=^aq?v7D zHsvurhTBGCwruU6Et@0AFpGfYuo_mtTCmb7@-WPXjXPV&^M?bE#(bZ+cGR@@M>l@2 zWyObE=f2ai!O~0l%P0PF`==jFkMiaOWsGCDho%)<_1vYSdt=^jc{Y7#=(TpAMhm4o%P<@_^`0pXBPMU{o?Y$;e|SwUg^!LS$0jpj2a&`eJZ-n>+^>GbN1uu zzczn4a@N*|onAkin$c*e=~bA`LL2S2k(do1PVV*QH4wDCn9E~!Hee+zgH^EHEwX4f z%RgJCua1nqo&R#CF2^o5-EwZnnsl{y--Yj%&rf*&>ovQ2&M-R*Z%*|$yX_0xw|M4n zujOTazPRkPkNVu|IO^?_yhoaC+y9k6jbbWsROC~8>cMF>{IQjz5rNp$Ec3pya! z%|HhM%g})=capmq=zxvep{qntKvBU;FG8>imceSbNT5SEQP6>kEObCocLN>3-I<$g zQ3uQ4p_@RELy?jMtOYB*D1=o`QFo3G*tnmQ!3;r-^T1&(bWk3%hv6n`bm*@A9l9f_ z2ZN%3<**u7z*?}l?{$M3K2w3GL_Y&xUjeDkhQnL0!9oB+Ha&H4x!ZNo=qeCz4?-0%r=IDWq+oP98nu4YUtGx)pTCgbZW4J{MJ$kEx9!T!Pyk;>2mZOJ; z6;5&=h7Q=c9eOJSB@`)1c@cuuupHKMizGVqk^T;Sq{r-QAW6Y8?2QG>eI5G>SO%7` z99F>!SPd&-E&Ms0fpTW{Gw^k{pWz8M`!VuRg;%KAkNb$e2KN(QNFg9$6|C}N4OTm| z^`jGyjk`mA4Fu7nFY}oF4J1og2CHDXTSO<$awHkBct0-t#+z@>Db~8-D6#9)Zc#vj@V-ge4vyuzPlMwxzgC?LySTF`m~rZI5YP2-G1L(X!YHWKIi8A zdBYUSn-dy5{dkZ5x5ivw^49ui!t2i4-Y&WBh>dUD?z--qZ%@Q7=xqw^&579GZ`JwN zhF)v?{z&=yAwKiciJzYd&pb7;{ZEGj2Hk&Yttn_nw8u1QM=-0&(0)MPyqC5_zJG4% z?DIYIpP7>|FDN+hW(&RJg%#_6{p-#;)8yWq(sMICv32YIE-vid^kK`g<);pseq+rq zn-3j1zq5Pz6>-uug*PYo+{lM*M-Se6z2~sAH@_U+Jt5`6aPOy8?oCSFu<=xv!JSQ0 zBI)}1rSk^gS#t8%OT#Kv>@gwdM8<)f5BJP2(Qih??}hF!GELtZVK|UxfW%gW_= 3) { + (batchPtr, _length) = BatchHeaderV3Codec.loadAndValidate(_batchHeader); + } + + // the code for compute batch hash is the same for V0, V1, V2, V3 + // also the `_batchIndex` and `_totalL1MessagesPoppedOverall`. + _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, _length); + _batchIndex = BatchHeaderV0Codec.getBatchIndex(batchPtr); + _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + + // only check when genesis is imported + if ( + !overrideBatchHashCheck && + committedBatches[_batchIndex] != _batchHash && + finalizedStateRoots[0] != bytes32(0) + ) { + revert ErrorIncorrectBatchHash(); + } + + if (overrideBatchHashCheck) { + _batchHash = committedBatches[_batchIndex]; + } + } +} diff --git a/src/mocks/ScrollChainMockFinalize.sol b/src/mocks/ScrollChainMockFinalize.sol index 3e576b3..e4ff375 100644 --- a/src/mocks/ScrollChainMockFinalize.sol +++ b/src/mocks/ScrollChainMockFinalize.sol @@ -27,94 +27,56 @@ contract ScrollChainMockFinalize is ScrollChain { * Public Mutating Functions * *****************************/ - /// @notice Finalize batch without proof, see the comments of {ScrollChain-finalizeBatchWithProof}. - function finalizeBatch( + /// @notice Finalize 4844 batch without proof, See the comments of {ScrollChain-finalizeBatchWithProof4844}. + function finalizeBatch4844( bytes calldata _batchHeader, - bytes32 _prevStateRoot, + bytes32, /*_prevStateRoot*/ bytes32 _postStateRoot, - bytes32 _withdrawRoot + bytes32 _withdrawRoot, + bytes calldata _blobDataProof ) external OnlyProver whenNotPaused { - if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); - if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); - - // compute batch hash and verify - (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); - - // verify previous state root. - if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); - - // avoid duplicated verification - if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); - - // check and update lastFinalizedBatchIndex - unchecked { - if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); - lastFinalizedBatchIndex = _batchIndex; - } + (uint256 batchPtr, bytes32 _batchHash, uint256 _batchIndex) = _beforeFinalizeBatch( + _batchHeader, + _postStateRoot + ); - // record state root and withdraw root - finalizedStateRoots[_batchIndex] = _postStateRoot; - withdrawRoots[_batchIndex] = _withdrawRoot; + // verify blob versioned hash + bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(batchPtr); + _checkBlobVersionedHash(_blobVersionedHash, _blobDataProof); // Pop finalized and non-skipped message from L1MessageQueue. - _popL1Messages( - BatchHeaderV0Codec.getSkippedBitmapPtr(memPtr), - BatchHeaderV0Codec.getTotalL1MessagePopped(memPtr), - BatchHeaderV0Codec.getL1MessagePopped(memPtr) + uint256 _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + _popL1MessagesMemory( + BatchHeaderV1Codec.getSkippedBitmapPtr(batchPtr), + _totalL1MessagesPoppedOverall, + BatchHeaderV0Codec.getL1MessagePopped(batchPtr) ); - emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + _afterFinalizeBatch(_totalL1MessagesPoppedOverall, _batchIndex, _batchHash, _postStateRoot, _withdrawRoot); } - /// @notice Finalize 4844 batch without proof, See the comments of {ScrollChain-finalizeBatchWithProof4844}. - function finalizeBatch4844( + /// @notice Finalize bundle without proof, See the comments of {ScrollChain-finalizeBundleWithProof}. + function finalizeBundle( bytes calldata _batchHeader, - bytes32 _prevStateRoot, bytes32 _postStateRoot, - bytes32 _withdrawRoot, - bytes calldata _blobDataProof + bytes32 _withdrawRoot ) external OnlyProver whenNotPaused { - if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); - // compute batch hash and verify - (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); - bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(memPtr); - - // Calls the point evaluation precompile and verifies the output - { - (bool success, bytes memory data) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall( - abi.encodePacked(_blobVersionedHash, _blobDataProof) - ); - // We verify that the point evaluation precompile call was successful by testing the latter 32 bytes of the - // response is equal to BLS_MODULUS as defined in https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile - if (!success) revert ErrorCallPointEvaluationPrecompileFailed(); - (, uint256 result) = abi.decode(data, (uint256, uint256)); - if (result != BLS_MODULUS) revert ErrorUnexpectedPointEvaluationPrecompileOutput(); - } - - // verify previous state root. - if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); - - // avoid duplicated verification - if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); - - // check and update lastFinalizedBatchIndex - unchecked { - if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); - lastFinalizedBatchIndex = _batchIndex; - } + // compute pending batch hash and verify + (, bytes32 _batchHash, uint256 _batchIndex, uint256 _totalL1MessagesPoppedOverall) = _loadBatchHeader( + _batchHeader + ); + if (_batchIndex <= lastFinalizedBatchIndex) revert ErrorBatchIsAlreadyVerified(); - // record state root and withdraw root + // store in state + // @note we do not store intermediate finalized roots + lastFinalizedBatchIndex = _batchIndex; finalizedStateRoots[_batchIndex] = _postStateRoot; withdrawRoots[_batchIndex] = _withdrawRoot; // Pop finalized and non-skipped message from L1MessageQueue. - _popL1Messages( - BatchHeaderV1Codec.getSkippedBitmapPtr(memPtr), - BatchHeaderV1Codec.getTotalL1MessagePopped(memPtr), - BatchHeaderV1Codec.getL1MessagePopped(memPtr) - ); + _finalizePoppedL1Messages(_totalL1MessagesPoppedOverall); emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); } diff --git a/src/test/L1CustomERC20Gateway.t.sol b/src/test/L1CustomERC20Gateway.t.sol index a1b667d..ecc0b2c 100644 --- a/src/test/L1CustomERC20Gateway.t.sol +++ b/src/test/L1CustomERC20Gateway.t.sol @@ -195,7 +195,9 @@ contract L1CustomERC20GatewayTest is L1GatewayTestBase { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); assertEq(messageQueue.pendingQueueIndex(), 1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); hevm.stopPrank(); // drop message 0 diff --git a/src/test/L1ERC1155Gateway.t.sol b/src/test/L1ERC1155Gateway.t.sol index c9c7836..96b4497 100644 --- a/src/test/L1ERC1155Gateway.t.sol +++ b/src/test/L1ERC1155Gateway.t.sol @@ -222,6 +222,8 @@ contract L1ERC1155GatewayTest is L1GatewayTestBase, ERC1155TokenReceiver { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); @@ -260,6 +262,8 @@ contract L1ERC1155GatewayTest is L1GatewayTestBase, ERC1155TokenReceiver { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); diff --git a/src/test/L1ERC721Gateway.t.sol b/src/test/L1ERC721Gateway.t.sol index b76163d..5f568f0 100644 --- a/src/test/L1ERC721Gateway.t.sol +++ b/src/test/L1ERC721Gateway.t.sol @@ -210,6 +210,8 @@ contract L1ERC721GatewayTest is L1GatewayTestBase, ERC721TokenReceiver { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); @@ -244,6 +246,8 @@ contract L1ERC721GatewayTest is L1GatewayTestBase, ERC721TokenReceiver { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); diff --git a/src/test/L1ETHGateway.t.sol b/src/test/L1ETHGateway.t.sol index d03dee7..565d5d5 100644 --- a/src/test/L1ETHGateway.t.sol +++ b/src/test/L1ETHGateway.t.sol @@ -163,6 +163,8 @@ contract L1ETHGatewayTest is L1GatewayTestBase { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); diff --git a/src/test/L1GatewayTestBase.t.sol b/src/test/L1GatewayTestBase.t.sol index a47b594..c588935 100644 --- a/src/test/L1GatewayTestBase.t.sol +++ b/src/test/L1GatewayTestBase.t.sol @@ -9,12 +9,12 @@ import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transp import {EnforcedTxGateway} from "../L1/gateways/EnforcedTxGateway.sol"; import {L1MessageQueueWithGasPriceOracle} from "../L1/rollup/L1MessageQueueWithGasPriceOracle.sol"; import {L2GasPriceOracle} from "../L1/rollup/L2GasPriceOracle.sol"; -import {ScrollChain, IScrollChain} from "../L1/rollup/ScrollChain.sol"; import {Whitelist} from "../L2/predeploys/Whitelist.sol"; import {L1ScrollMessenger} from "../L1/L1ScrollMessenger.sol"; import {L2ScrollMessenger} from "../L2/L2ScrollMessenger.sol"; import {EmptyContract} from "../misc/EmptyContract.sol"; +import {ScrollChainMockBlob} from "../mocks/ScrollChainMockBlob.sol"; import {MockRollupVerifier} from "./mocks/MockRollupVerifier.sol"; import {ScrollTestBase} from "./ScrollTestBase.t.sol"; @@ -62,7 +62,7 @@ abstract contract L1GatewayTestBase is ScrollTestBase { L1MessageQueueWithGasPriceOracle internal messageQueue; L2GasPriceOracle internal gasOracle; EnforcedTxGateway internal enforcedTxGateway; - ScrollChain internal rollup; + ScrollChainMockBlob internal rollup; MockRollupVerifier internal verifier; @@ -87,7 +87,7 @@ abstract contract L1GatewayTestBase is ScrollTestBase { // deploy proxy and contracts in L1 l1Messenger = L1ScrollMessenger(payable(_deployProxy(address(0)))); messageQueue = L1MessageQueueWithGasPriceOracle(_deployProxy(address(0))); - rollup = ScrollChain(_deployProxy(address(0))); + rollup = ScrollChainMockBlob(_deployProxy(address(0))); enforcedTxGateway = EnforcedTxGateway(_deployProxy(address(new EnforcedTxGateway()))); gasOracle = L2GasPriceOracle(_deployProxy(address(new L2GasPriceOracle()))); whitelist = new Whitelist(address(this)); @@ -124,7 +124,7 @@ abstract contract L1GatewayTestBase is ScrollTestBase { // Upgrade the ScrollChain implementation and initialize admin.upgrade( ITransparentUpgradeableProxy(address(rollup)), - address(new ScrollChain(1233, address(messageQueue), address(verifier))) + address(new ScrollChainMockBlob(1233, address(messageQueue), address(verifier))) ); rollup.initialize(address(messageQueue), address(0), 44); @@ -149,31 +149,39 @@ abstract contract L1GatewayTestBase is ScrollTestBase { rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); bytes32 batchHash0 = rollup.committedBatches(0); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + rollup.setBlobVersionedHash(blobVersionedHash); + // commit one batch bytes[] memory chunks = new bytes[](1); bytes memory chunk0 = new bytes(1 + 60); chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; hevm.startPrank(address(0)); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); - bytes memory batchHeader1 = new bytes(89); + bytes memory batchHeader1 = new bytes(121); assembly { - mstore(add(batchHeader1, 0x20), 0) // version + mstore8(add(batchHeader1, 0x20), 1) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped mstore(add(batchHeader1, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash - mstore(add(batchHeader1, add(0x20, 57)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash } hevm.startPrank(address(0)); - rollup.finalizeBatchWithProof( + rollup.finalizeBatchWithProof4844( batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), messageHash, + blobDataProof, new bytes(0) ); hevm.stopPrank(); diff --git a/src/test/L1MessageQueue.t.sol b/src/test/L1MessageQueue.t.sol new file mode 100644 index 0000000..b2a3fb8 --- /dev/null +++ b/src/test/L1MessageQueue.t.sol @@ -0,0 +1,628 @@ +// SPDX-License-Identifier: MIT + +pragma solidity =0.8.24; + +import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; + +import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +import {IL1MessageQueue} from "../L1/rollup/IL1MessageQueue.sol"; +import {L1MessageQueue} from "../L1/rollup/L1MessageQueue.sol"; +import {L2GasPriceOracle} from "../L1/rollup/L2GasPriceOracle.sol"; +import {Whitelist} from "../L2/predeploys/Whitelist.sol"; + +import {ScrollTestBase} from "./ScrollTestBase.t.sol"; + +contract L1MessageQueueTest is ScrollTestBase { + // events + event QueueTransaction( + address indexed sender, + address indexed target, + uint256 value, + uint64 queueIndex, + uint256 gasLimit, + bytes data + ); + event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap); + event ResetDequeuedTransaction(uint256 startIndex); + event FinalizedDequeuedTransaction(uint256 finalizedIndex); + event DropTransaction(uint256 index); + event UpdateGasOracle(address indexed _oldGasOracle, address indexed _newGasOracle); + event UpdateMaxGasLimit(uint256 _oldMaxGasLimit, uint256 _newMaxGasLimit); + + address private FakeScrollChain = 0x1000000000000000000000000000000000000001; + address private FakeMessenger = 0x1000000000000000000000000000000000000002; + address private FakeGateway = 0x1000000000000000000000000000000000000003; + address private FakeSigner = 0x1000000000000000000000000000000000000004; + + L1MessageQueue private queue; + L2GasPriceOracle private gasOracle; + + function setUp() public { + __ScrollTestBase_setUp(); + + queue = L1MessageQueue(_deployProxy(address(0))); + gasOracle = L2GasPriceOracle(_deployProxy(address(new L2GasPriceOracle()))); + + // Upgrade the L1MessageQueue implementation and initialize + admin.upgrade( + ITransparentUpgradeableProxy(address(queue)), + address(new L1MessageQueue(FakeMessenger, FakeScrollChain, FakeGateway)) + ); + gasOracle.initialize(21000, 50000, 8, 16); + queue.initialize(address(1), address(1), address(1), address(gasOracle), 10000000); + } + + function testInitialize() external { + assertEq(queue.owner(), address(this)); + assertEq(queue.messenger(), FakeMessenger); + assertEq(queue.scrollChain(), FakeScrollChain); + assertEq(queue.enforcedTxGateway(), FakeGateway); + assertEq(queue.gasOracle(), address(gasOracle)); + assertEq(queue.maxGasLimit(), 10000000); + + hevm.expectRevert("Initializable: contract is already initialized"); + queue.initialize(address(0), address(0), address(0), address(0), 0); + } + + function testUpdateGasOracle(address newGasOracle) external { + // call by non-owner, should revert + hevm.startPrank(address(1)); + hevm.expectRevert("Ownable: caller is not the owner"); + queue.updateGasOracle(newGasOracle); + hevm.stopPrank(); + + // call by owner, should succeed + assertEq(queue.gasOracle(), address(gasOracle)); + hevm.expectEmit(true, true, false, true); + emit UpdateGasOracle(address(gasOracle), newGasOracle); + queue.updateGasOracle(newGasOracle); + assertEq(queue.gasOracle(), newGasOracle); + } + + function testUpdateMaxGasLimit(uint256 newMaxGasLimit) external { + // call by non-owner, should revert + hevm.startPrank(address(1)); + hevm.expectRevert("Ownable: caller is not the owner"); + queue.updateMaxGasLimit(newMaxGasLimit); + hevm.stopPrank(); + + // call by owner, should succeed + assertEq(queue.maxGasLimit(), 10000000); + hevm.expectEmit(true, true, false, true); + emit UpdateMaxGasLimit(10000000, newMaxGasLimit); + queue.updateMaxGasLimit(newMaxGasLimit); + assertEq(queue.maxGasLimit(), newMaxGasLimit); + } + + function testAppendCrossDomainMessage(uint256 gasLimit, bytes memory data) external { + gasLimit = bound(gasLimit, 21000 + data.length * 16, 10000000); + + // should revert, when non-messenger call + hevm.expectRevert("Only callable by the L1ScrollMessenger"); + queue.appendCrossDomainMessage(address(0), 0, "0x"); + + hevm.startPrank(FakeMessenger); + + // should revert, when exceed maxGasLimit + hevm.expectRevert("Gas limit must not exceed maxGasLimit"); + queue.appendCrossDomainMessage(address(0), 10000001, "0x"); + + // should revert, when below intrinsic gas + hevm.expectRevert("Insufficient gas limit, must be above intrinsic gas"); + queue.appendCrossDomainMessage(address(0), 0, "0x"); + + // should succeed + assertEq(queue.nextCrossDomainMessageIndex(), 0); + address sender = address(uint160(FakeMessenger) + uint160(0x1111000000000000000000000000000000001111)); + bytes32 hash0 = queue.computeTransactionHash(sender, 0, 0, FakeSigner, gasLimit, data); + hevm.expectEmit(true, true, false, true); + emit QueueTransaction(sender, FakeSigner, 0, 0, gasLimit, data); + queue.appendCrossDomainMessage(FakeSigner, gasLimit, data); + assertEq(queue.nextCrossDomainMessageIndex(), 1); + assertEq(queue.getCrossDomainMessage(0), hash0); + + bytes32 hash1 = queue.computeTransactionHash(sender, 1, 0, FakeSigner, gasLimit, data); + hevm.expectEmit(true, true, false, true); + emit QueueTransaction(sender, FakeSigner, 0, 1, gasLimit, data); + queue.appendCrossDomainMessage(FakeSigner, gasLimit, data); + assertEq(queue.nextCrossDomainMessageIndex(), 2); + assertEq(queue.getCrossDomainMessage(0), hash0); + assertEq(queue.getCrossDomainMessage(1), hash1); + + hevm.stopPrank(); + } + + function testAppendEnforcedTransaction( + uint256 value, + uint256 gasLimit, + bytes memory data + ) external { + gasLimit = bound(gasLimit, 21000 + data.length * 16, 10000000); + + // should revert, when non-gateway call + hevm.expectRevert("Only callable by the EnforcedTxGateway"); + queue.appendEnforcedTransaction(FakeSigner, address(0), 0, 0, "0x"); + + hevm.startPrank(FakeGateway); + + // should revert, when sender is not EOA + hevm.expectRevert("only EOA"); + queue.appendEnforcedTransaction(address(this), address(0), 0, 0, "0x"); + + // should revert, when exceed maxGasLimit + hevm.expectRevert("Gas limit must not exceed maxGasLimit"); + queue.appendEnforcedTransaction(FakeSigner, address(0), 0, 10000001, "0x"); + + // should revert, when below intrinsic gas + hevm.expectRevert("Insufficient gas limit, must be above intrinsic gas"); + queue.appendEnforcedTransaction(FakeSigner, address(0), 0, 0, "0x"); + + // should succeed + assertEq(queue.nextCrossDomainMessageIndex(), 0); + address sender = address(uint160(FakeMessenger) + uint160(0x1111000000000000000000000000000000001111)); + bytes32 hash0 = queue.computeTransactionHash(sender, 0, value, FakeSigner, gasLimit, data); + hevm.expectEmit(true, true, false, true); + emit QueueTransaction(sender, FakeSigner, value, 0, gasLimit, data); + queue.appendEnforcedTransaction(sender, FakeSigner, value, gasLimit, data); + assertEq(queue.nextCrossDomainMessageIndex(), 1); + assertEq(queue.getCrossDomainMessage(0), hash0); + + bytes32 hash1 = queue.computeTransactionHash(sender, 1, value, FakeSigner, gasLimit, data); + hevm.expectEmit(true, true, false, true); + emit QueueTransaction(sender, FakeSigner, value, 1, gasLimit, data); + queue.appendEnforcedTransaction(sender, FakeSigner, value, gasLimit, data); + assertEq(queue.nextCrossDomainMessageIndex(), 2); + assertEq(queue.getCrossDomainMessage(0), hash0); + assertEq(queue.getCrossDomainMessage(1), hash1); + + hevm.stopPrank(); + } + + function testPopCrossDomainMessage(uint256 bitmap) external { + // should revert, when non-scrollChain call + hevm.expectRevert("Only callable by the ScrollChain"); + queue.popCrossDomainMessage(0, 0, 0); + + // should revert, when pop too many messages + hevm.startPrank(FakeScrollChain); + hevm.expectRevert("pop too many messages"); + queue.popCrossDomainMessage(0, 257, 0); + hevm.stopPrank(); + + // should revert, when start index mismatch + hevm.startPrank(FakeScrollChain); + hevm.expectRevert("start index mismatch"); + queue.popCrossDomainMessage(1, 256, 0); + hevm.stopPrank(); + + // should succeed + // append 512 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 512; ++i) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + // pop 50 messages with no skip + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(0, 50, 0); + queue.popCrossDomainMessage(0, 50, 0); + assertEq(queue.pendingQueueIndex(), 50); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + for (uint256 i = 0; i < 50; i++) { + assertBoolEq(queue.isMessageSkipped(i), false); + assertBoolEq(queue.isMessageDropped(i), false); + } + + // pop 10 messages all skip + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(50, 10, 1023); + queue.popCrossDomainMessage(50, 10, 1023); + assertEq(queue.pendingQueueIndex(), 60); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + for (uint256 i = 50; i < 60; i++) { + assertBoolEq(queue.isMessageSkipped(i), true); + assertBoolEq(queue.isMessageDropped(i), false); + } + assertBoolEq(queue.isMessageSkipped(60), false); + + // pop 20 messages, skip first 5 + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(60, 20, 31); + queue.popCrossDomainMessage(60, 20, 31); + assertEq(queue.pendingQueueIndex(), 80); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + for (uint256 i = 60; i < 65; i++) { + assertBoolEq(queue.isMessageSkipped(i), true); + assertBoolEq(queue.isMessageDropped(i), false); + } + for (uint256 i = 65; i < 80; i++) { + assertBoolEq(queue.isMessageSkipped(i), false); + assertBoolEq(queue.isMessageDropped(i), false); + } + + // pop 256 messages with random skip + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(80, 256, bitmap); + queue.popCrossDomainMessage(80, 256, bitmap); + assertEq(queue.pendingQueueIndex(), 336); + for (uint256 i = 80; i < 80 + 256; i++) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap >> (i - 80)) & 1) == 1); + assertBoolEq(queue.isMessageDropped(i), false); + } + + hevm.stopPrank(); + } + + function testPopCrossDomainMessageRandom( + uint256 count1, + uint256 count2, + uint256 count3, + uint256 bitmap1, + uint256 bitmap2, + uint256 bitmap3 + ) external { + count1 = bound(count1, 1, 256); + count2 = bound(count2, 1, 256); + count3 = bound(count3, 1, 256); + // append count1 + count2 + count3 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < count1 + count2 + count3; i++) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + hevm.startPrank(FakeScrollChain); + // first pop `count1` messages + hevm.expectEmit(false, false, false, true); + if (count1 == 256) { + emit DequeueTransaction(0, count1, bitmap1); + } else { + emit DequeueTransaction(0, count1, bitmap1 & ((1 << count1) - 1)); + } + queue.popCrossDomainMessage(0, count1, bitmap1); + assertEq(queue.pendingQueueIndex(), count1); + for (uint256 i = 0; i < count1; i++) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1 >> i) & 1) == 1); + assertBoolEq(queue.isMessageDropped(i), false); + } + + // then pop `count2` messages + hevm.expectEmit(false, false, false, true); + if (count2 == 256) { + emit DequeueTransaction(count1, count2, bitmap2); + } else { + emit DequeueTransaction(count1, count2, bitmap2 & ((1 << count2) - 1)); + } + queue.popCrossDomainMessage(count1, count2, bitmap2); + assertEq(queue.pendingQueueIndex(), count1 + count2); + for (uint256 i = 0; i < count2; i++) { + assertBoolEq(queue.isMessageSkipped(i + count1), ((bitmap2 >> i) & 1) == 1); + assertBoolEq(queue.isMessageDropped(i + count1), false); + } + + // last pop `count3` messages + hevm.expectEmit(false, false, false, true); + if (count3 == 256) { + emit DequeueTransaction(count1 + count2, count3, bitmap3); + } else { + emit DequeueTransaction(count1 + count2, count3, bitmap3 & ((1 << count3) - 1)); + } + queue.popCrossDomainMessage(count1 + count2, count3, bitmap3); + assertEq(queue.pendingQueueIndex(), count1 + count2 + count3); + for (uint256 i = 0; i < count3; i++) { + assertBoolEq(queue.isMessageSkipped(i + count1 + count2), ((bitmap3 >> i) & 1) == 1); + assertBoolEq(queue.isMessageDropped(i + count1 + count2), false); + } + hevm.stopPrank(); + } + + function testResetPoppedCrossDomainMessage(uint256 startIndex) external { + // should revert, when non-scrollChain call + hevm.expectRevert("Only callable by the ScrollChain"); + queue.resetPoppedCrossDomainMessage(0); + + // should do nothing + hevm.startPrank(FakeScrollChain); + queue.resetPoppedCrossDomainMessage(0); + hevm.stopPrank(); + + // append 512 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 512; i++) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + // pop 256 messages with no skip + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(0, 256, 0); + queue.popCrossDomainMessage(0, 256, 0); + assertEq(queue.pendingQueueIndex(), 256); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + hevm.stopPrank(); + + // finalize 128 messages + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit FinalizedDequeuedTransaction(127); + queue.finalizePoppedCrossDomainMessage(128); + assertEq(queue.nextUnfinalizedQueueIndex(), 128); + hevm.stopPrank(); + + // should revert, when reset finalized messages + hevm.startPrank(FakeScrollChain); + hevm.expectRevert("reset finalized messages"); + queue.resetPoppedCrossDomainMessage(127); + hevm.stopPrank(); + + // should revert, when reset pending messages + hevm.startPrank(FakeScrollChain); + hevm.expectRevert("reset pending messages"); + queue.resetPoppedCrossDomainMessage(257); + hevm.stopPrank(); + + // should succeed + startIndex = bound(startIndex, 128, 256); + hevm.startPrank(FakeScrollChain); + if (startIndex < 256) { + hevm.expectEmit(false, false, false, true); + emit ResetDequeuedTransaction(startIndex); + } + queue.resetPoppedCrossDomainMessage(startIndex); + assertEq(queue.pendingQueueIndex(), startIndex); + assertEq(queue.nextUnfinalizedQueueIndex(), 128); + hevm.stopPrank(); + } + + // pop, reset, pop, reset, pop + function testResetPoppedCrossDomainMessageRandom( + uint256 bitmap1, + uint256 bitmap2, + uint256 startIndex1, + uint256 startIndex2 + ) external { + // append 1024 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 512; i++) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + // first pop 512 messages + hevm.startPrank(FakeScrollChain); + queue.popCrossDomainMessage(0, 256, bitmap1); + assertEq(queue.pendingQueueIndex(), 256); + queue.popCrossDomainMessage(256, 256, bitmap2); + assertEq(queue.pendingQueueIndex(), 512); + hevm.stopPrank(); + + for (uint256 i = 0; i < 512; ++i) { + if (i < 256) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1) >> i) & 1 == 1); + } else { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap2) >> (i - 256)) & 1 == 1); + } + } + + // first reset + startIndex1 = bound(startIndex1, 0, 512); + hevm.startPrank(FakeScrollChain); + queue.resetPoppedCrossDomainMessage(startIndex1); + hevm.stopPrank(); + assertEq(queue.pendingQueueIndex(), startIndex1); + for (uint256 i = 0; i < 512; ++i) { + if (i >= startIndex1) { + assertBoolEq(queue.isMessageSkipped(i), false); + continue; + } + if (i < 256) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1) >> i) & 1 == 1); + } else { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap2) >> (i - 256)) & 1 == 1); + } + } + + // next pop 512 messages + hevm.startPrank(FakeScrollChain); + queue.popCrossDomainMessage(startIndex1, 256, bitmap1); + assertEq(queue.pendingQueueIndex(), startIndex1 + 256); + queue.popCrossDomainMessage(startIndex1 + 256, 256, bitmap2); + assertEq(queue.pendingQueueIndex(), startIndex1 + 512); + hevm.stopPrank(); + + for (uint256 i = 0; i < startIndex1 + 512; ++i) { + if (i < startIndex1) { + if (i < 256) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1) >> i) & 1 == 1); + } else { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap2) >> (i - 256)) & 1 == 1); + } + } else { + uint256 offset = i - startIndex1; + if (offset < 256) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1) >> offset) & 1 == 1); + } else { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap2) >> (offset - 256)) & 1 == 1); + } + } + } + + // second reset + startIndex2 = bound(startIndex2, 0, startIndex1 + 512); + hevm.startPrank(FakeScrollChain); + queue.resetPoppedCrossDomainMessage(startIndex2); + hevm.stopPrank(); + assertEq(queue.pendingQueueIndex(), startIndex2); + for (uint256 i = 0; i < startIndex1 + 512; ++i) { + if (i >= startIndex2) { + assertBoolEq(queue.isMessageSkipped(i), false); + continue; + } + if (i < startIndex1) { + if (i < 256) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1) >> i) & 1 == 1); + } else { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap2) >> (i - 256)) & 1 == 1); + } + } else { + uint256 offset = i - startIndex1; + if (offset < 256) { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap1) >> offset) & 1 == 1); + } else { + assertBoolEq(queue.isMessageSkipped(i), ((bitmap2) >> (offset - 256)) & 1 == 1); + } + } + } + } + + function testFinalizePoppedCrossDomainMessage() external { + // should revert, when non-scrollChain call + hevm.expectRevert("Only callable by the ScrollChain"); + queue.finalizePoppedCrossDomainMessage(0); + + // append 10 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 10; i++) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + // pop 5 messages with no skip + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(0, 5, 0); + queue.popCrossDomainMessage(0, 5, 0); + assertEq(queue.pendingQueueIndex(), 5); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + hevm.stopPrank(); + + // should revert, when finalized index too large + hevm.startPrank(FakeScrollChain); + hevm.expectRevert("finalized index too large"); + queue.finalizePoppedCrossDomainMessage(6); + hevm.stopPrank(); + + // should succeed + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit FinalizedDequeuedTransaction(4); + queue.finalizePoppedCrossDomainMessage(5); + assertEq(queue.nextUnfinalizedQueueIndex(), 5); + hevm.stopPrank(); + + // should revert, finalized index too small + hevm.startPrank(FakeScrollChain); + hevm.expectRevert("finalized index too small"); + queue.finalizePoppedCrossDomainMessage(4); + hevm.stopPrank(); + + // should do nothing + hevm.startPrank(FakeScrollChain); + queue.finalizePoppedCrossDomainMessage(5); + assertEq(queue.nextUnfinalizedQueueIndex(), 5); + hevm.stopPrank(); + } + + function testDropCrossDomainMessageFailed() external { + // should revert, when non-messenger call + hevm.expectRevert("Only callable by the L1ScrollMessenger"); + queue.dropCrossDomainMessage(0); + + // should revert, when drop non-skipped message + // append 10 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 10; i++) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + // pop 5 messages with no skip + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(0, 5, 0); + queue.popCrossDomainMessage(0, 5, 0); + assertEq(queue.pendingQueueIndex(), 5); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + hevm.stopPrank(); + + // drop pending message + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 5; i++) { + hevm.expectRevert("cannot drop pending message"); + queue.dropCrossDomainMessage(i); + } + hevm.stopPrank(); + + hevm.startPrank(FakeScrollChain); + queue.finalizePoppedCrossDomainMessage(5); + hevm.stopPrank(); + assertEq(queue.pendingQueueIndex(), 5); + assertEq(queue.nextUnfinalizedQueueIndex(), 5); + + // drop non-skipped message + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 5; i++) { + hevm.expectRevert("drop non-skipped message"); + queue.dropCrossDomainMessage(i); + } + hevm.stopPrank(); + + // drop pending message + hevm.startPrank(FakeMessenger); + for (uint256 i = 5; i < 10; i++) { + hevm.expectRevert("cannot drop pending message"); + queue.dropCrossDomainMessage(i); + } + hevm.stopPrank(); + } + + function testDropCrossDomainMessageSucceed() external { + // append 10 messages + hevm.startPrank(FakeMessenger); + for (uint256 i = 0; i < 10; i++) { + queue.appendCrossDomainMessage(address(0), 1000000, "0x"); + } + hevm.stopPrank(); + + // pop 10 messages, all skipped + hevm.startPrank(FakeScrollChain); + hevm.expectEmit(false, false, false, true); + emit DequeueTransaction(0, 10, 0x3ff); + queue.popCrossDomainMessage(0, 10, 0x3ff); + assertEq(queue.pendingQueueIndex(), 10); + assertEq(queue.nextUnfinalizedQueueIndex(), 0); + queue.finalizePoppedCrossDomainMessage(5); + assertEq(queue.pendingQueueIndex(), 10); + assertEq(queue.nextUnfinalizedQueueIndex(), 5); + hevm.stopPrank(); + + for (uint256 i = 0; i < 5; i++) { + assertBoolEq(queue.isMessageSkipped(i), true); + assertBoolEq(queue.isMessageDropped(i), false); + hevm.startPrank(FakeMessenger); + hevm.expectEmit(false, false, false, true); + emit DropTransaction(i); + queue.dropCrossDomainMessage(i); + + hevm.expectRevert("message already dropped"); + queue.dropCrossDomainMessage(i); + hevm.stopPrank(); + + assertBoolEq(queue.isMessageSkipped(i), true); + assertBoolEq(queue.isMessageDropped(i), true); + } + for (uint256 i = 5; i < 10; i++) { + assertBoolEq(queue.isMessageSkipped(i), true); + assertBoolEq(queue.isMessageDropped(i), false); + + hevm.startPrank(FakeMessenger); + hevm.expectRevert("cannot drop pending message"); + queue.dropCrossDomainMessage(i); + hevm.stopPrank(); + } + } +} diff --git a/src/test/L1ScrollMessengerTest.t.sol b/src/test/L1ScrollMessengerTest.t.sol index bd804e2..aae33cb 100644 --- a/src/test/L1ScrollMessengerTest.t.sol +++ b/src/test/L1ScrollMessengerTest.t.sol @@ -256,6 +256,8 @@ contract L1ScrollMessengerTest is L1GatewayTestBase { // skip all 2 messages hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 2, 0x3); + messageQueue.finalizePoppedCrossDomainMessage(2); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 2); assertEq(messageQueue.pendingQueueIndex(), 2); hevm.stopPrank(); for (uint256 i = 0; i < 2; ++i) { @@ -281,6 +283,8 @@ contract L1ScrollMessengerTest is L1GatewayTestBase { // only first 3 are skipped hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(2, 4, 0x7); + messageQueue.finalizePoppedCrossDomainMessage(6); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 6); assertEq(messageQueue.pendingQueueIndex(), 6); hevm.stopPrank(); for (uint256 i = 2; i < 6; i++) { @@ -302,6 +306,8 @@ contract L1ScrollMessengerTest is L1GatewayTestBase { // skip all 5 messages hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(6, 5, 0x1f); + messageQueue.finalizePoppedCrossDomainMessage(11); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 11); assertEq(messageQueue.pendingQueueIndex(), 11); hevm.stopPrank(); for (uint256 i = 6; i < 11; ++i) { diff --git a/src/test/L1StandardERC20Gateway.t.sol b/src/test/L1StandardERC20Gateway.t.sol index 576c557..548ef49 100644 --- a/src/test/L1StandardERC20Gateway.t.sol +++ b/src/test/L1StandardERC20Gateway.t.sol @@ -288,6 +288,8 @@ contract L1StandardERC20GatewayTest is L1GatewayTestBase { // skip message 0 and 1 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 2, 0x3); + messageQueue.finalizePoppedCrossDomainMessage(2); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 2); assertEq(messageQueue.pendingQueueIndex(), 2); hevm.stopPrank(); diff --git a/src/test/L1WETHGateway.t.sol b/src/test/L1WETHGateway.t.sol index f2a1442..3cbebc5 100644 --- a/src/test/L1WETHGateway.t.sol +++ b/src/test/L1WETHGateway.t.sol @@ -224,6 +224,8 @@ contract L1WETHGatewayTest is L1GatewayTestBase { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); diff --git a/src/test/ScrollChain.t.sol b/src/test/ScrollChain.t.sol index 35ad4a4..a5eb861 100644 --- a/src/test/ScrollChain.t.sol +++ b/src/test/ScrollChain.t.sol @@ -2,6 +2,8 @@ pragma solidity =0.8.24; +import {console} from "hardhat/console.sol"; + import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; @@ -10,9 +12,13 @@ import {ITransparentUpgradeableProxy, TransparentUpgradeableProxy} from "@openze import {L1MessageQueue} from "../L1/rollup/L1MessageQueue.sol"; import {ScrollChain, IScrollChain} from "../L1/rollup/ScrollChain.sol"; import {BatchHeaderV0Codec} from "../libraries/codec/BatchHeaderV0Codec.sol"; +import {BatchHeaderV1Codec} from "../libraries/codec/BatchHeaderV1Codec.sol"; +import {BatchHeaderV3Codec} from "../libraries/codec/BatchHeaderV3Codec.sol"; import {ChunkCodecV0} from "../libraries/codec/ChunkCodecV0.sol"; +import {ChunkCodecV1} from "../libraries/codec/ChunkCodecV1.sol"; import {EmptyContract} from "../misc/EmptyContract.sol"; +import {ScrollChainMockBlob} from "../mocks/ScrollChainMockBlob.sol"; import {MockRollupVerifier} from "./mocks/MockRollupVerifier.sol"; // solhint-disable no-inline-assembly @@ -63,7 +69,7 @@ contract ScrollChainTest is DSTestPlus { rollup.initialize(address(messageQueue), address(0), 100); } - function testCommitBatchV0() external { + function testCommitBatchV1() external { bytes memory batchHeader0 = new bytes(89); // import 10 L1 messages @@ -76,29 +82,38 @@ contract ScrollChainTest is DSTestPlus { mstore(add(batchHeader0, add(0x20, 25)), 1) } rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); + assertEq(rollup.committedBatches(0), keccak256(batchHeader0)); // caller not sequencer, revert hevm.expectRevert(ScrollChain.ErrorCallerIsNotSequencer.selector); - rollup.commitBatch(0, batchHeader0, new bytes[](0), new bytes(0)); + rollup.commitBatch(1, batchHeader0, new bytes[](0), new bytes(0)); rollup.addSequencer(address(0)); // batch is empty, revert hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorBatchIsEmpty.selector); - rollup.commitBatch(0, batchHeader0, new bytes[](0), new bytes(0)); + rollup.commitBatch(1, batchHeader0, new bytes[](0), new bytes(0)); hevm.stopPrank(); // batch header length too small, revert + bytes memory header = new bytes(120); + assembly { + mstore8(add(header, 0x20), 1) // version + } hevm.startPrank(address(0)); - hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderLengthTooSmall.selector); - rollup.commitBatch(0, new bytes(88), new bytes[](1), new bytes(0)); + hevm.expectRevert(BatchHeaderV1Codec.ErrorBatchHeaderV1LengthTooSmall.selector); + rollup.commitBatch(1, header, new bytes[](1), new bytes(0)); hevm.stopPrank(); // wrong bitmap length, revert + header = new bytes(122); + assembly { + mstore8(add(header, 0x20), 1) // version + } hevm.startPrank(address(0)); - hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLength.selector); - rollup.commitBatch(0, new bytes(90), new bytes[](1), new bytes(0)); + hevm.expectRevert(BatchHeaderV1Codec.ErrorIncorrectBitmapLengthV1.selector); + rollup.commitBatch(1, header, new bytes[](1), new bytes(0)); hevm.stopPrank(); // incorrect parent batch hash, revert @@ -107,7 +122,7 @@ contract ScrollChainTest is DSTestPlus { } hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); - rollup.commitBatch(0, batchHeader0, new bytes[](1), new bytes(0)); + rollup.commitBatch(1, batchHeader0, new bytes[](1), new bytes(0)); hevm.stopPrank(); assembly { mstore(add(batchHeader0, add(0x20, 25)), 1) // change back @@ -120,8 +135,8 @@ contract ScrollChainTest is DSTestPlus { chunk0 = new bytes(1); chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert(ChunkCodecV0.ErrorNoBlockInChunk.selector); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + hevm.expectRevert(ChunkCodecV1.ErrorNoBlockInChunkV1.selector); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); // invalid chunk length, revert @@ -129,8 +144,8 @@ contract ScrollChainTest is DSTestPlus { chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert(ChunkCodecV0.ErrorIncorrectChunkLength.selector); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + hevm.expectRevert(ChunkCodecV1.ErrorIncorrectChunkLengthV1.selector); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); // cannot skip last L1 message, revert @@ -143,7 +158,7 @@ contract ScrollChainTest is DSTestPlus { chunks[0] = chunk0; hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorLastL1MessageSkipped.selector); - rollup.commitBatch(0, batchHeader0, chunks, bitmap); + rollup.commitBatch(1, batchHeader0, chunks, bitmap); hevm.stopPrank(); // num txs less than num L1 msgs, revert @@ -156,38 +171,71 @@ contract ScrollChainTest is DSTestPlus { chunks[0] = chunk0; hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorNumTxsLessThanNumL1Msgs.selector); - rollup.commitBatch(0, batchHeader0, chunks, bitmap); + rollup.commitBatch(1, batchHeader0, chunks, bitmap); hevm.stopPrank(); - // incomplete l2 transaction data, revert - chunk0 = new bytes(1 + 60 + 1); + // revert when ErrorNoBlobFound + chunk0 = new bytes(1 + 60); chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert(ScrollChain.ErrorIncompleteL2TransactionData.selector); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + hevm.expectRevert(ScrollChain.ErrorNoBlobFound.selector); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); + // @note we cannot check `ErrorFoundMultipleBlobs` here + + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // this is keccak(""); + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash( + 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 + ); + + bytes32 batchHash0 = rollup.committedBatches(0); + bytes memory batchHeader1 = new bytes(121); + assembly { + mstore8(add(batchHeader1, 0x20), 1) // version + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex + mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped + mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped + mstore(add(batchHeader1, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + } + // commit batch with one chunk, no tx, correctly chunk0 = new bytes(1 + 60); chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; hevm.startPrank(address(0)); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + assertEq(rollup.committedBatches(1), bytes32(0)); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); - assertGt(uint256(rollup.committedBatches(1)), 0); + assertEq(rollup.committedBatches(1), keccak256(batchHeader1)); // batch is already committed, revert hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorBatchIsAlreadyCommitted.selector); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); + hevm.stopPrank(); + + // revert when ErrorIncorrectBatchVersion + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchVersion.selector); + rollup.commitBatch(3, batchHeader1, chunks, new bytes(0)); hevm.stopPrank(); } - function testFinalizeBatchWithProofV0() external { + function testFinalizeBatchWithProof4844() external { // caller not prover, revert hevm.expectRevert(ScrollChain.ErrorCallerIsNotProver.selector); - rollup.finalizeBatchWithProof(new bytes(0), bytes32(0), bytes32(0), bytes32(0), new bytes(0)); + rollup.finalizeBatchWithProof4844(new bytes(0), bytes32(0), bytes32(0), bytes32(0), new bytes(0), new bytes(0)); rollup.addProver(address(0)); rollup.addSequencer(address(0)); @@ -199,76 +247,103 @@ contract ScrollChainTest is DSTestPlus { mstore(add(batchHeader0, add(0x20, 25)), 1) } rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); - bytes32 batchHash0 = rollup.committedBatches(0); bytes[] memory chunks = new bytes[](1); bytes memory chunk0; - // commit one batch - chunk0 = new bytes(1 + 60); - chunk0[0] = bytes1(uint8(1)); // one block in this chunk - chunks[0] = chunk0; - hevm.startPrank(address(0)); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); - hevm.stopPrank(); - assertGt(uint256(rollup.committedBatches(1)), 0); + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); - bytes memory batchHeader1 = new bytes(89); + bytes32 batchHash0 = rollup.committedBatches(0); + bytes memory batchHeader1 = new bytes(121); assembly { - mstore(add(batchHeader1, 0x20), 0) // version + mstore8(add(batchHeader1, 0x20), 1) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped mstore(add(batchHeader1, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash - mstore(add(batchHeader1, add(0x20, 57)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash } + // batch hash is 0xf7d9af8c2c8e1a84f1fa4b6af9425f85c50a61b24cdd28101a5f6d781906a5b9 + + // commit one batch + chunk0 = new bytes(1 + 60); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunks[0] = chunk0; + hevm.startPrank(address(0)); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); + hevm.stopPrank(); + assertEq(rollup.committedBatches(1), keccak256(batchHeader1)); // incorrect batch hash, revert batchHeader1[1] = bytes1(uint8(1)); // change random byte hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); - rollup.finalizeBatchWithProof(batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(0), new bytes(0)); + rollup.finalizeBatchWithProof4844( + batchHeader1, + bytes32(uint256(1)), + bytes32(uint256(2)), + bytes32(0), + new bytes(0), + new bytes(0) + ); hevm.stopPrank(); batchHeader1[1] = bytes1(uint8(0)); // change back // batch header length too small, revert + bytes memory header = new bytes(120); + assembly { + mstore8(add(header, 0x20), 1) // version + } hevm.startPrank(address(0)); - hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderLengthTooSmall.selector); - rollup.finalizeBatchWithProof( - new bytes(88), + hevm.expectRevert(BatchHeaderV1Codec.ErrorBatchHeaderV1LengthTooSmall.selector); + rollup.finalizeBatchWithProof4844( + header, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(0), + new bytes(0), new bytes(0) ); hevm.stopPrank(); // wrong bitmap length, revert + header = new bytes(122); + assembly { + mstore8(add(header, 0x20), 1) // version + } hevm.startPrank(address(0)); - hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLength.selector); - rollup.finalizeBatchWithProof( - new bytes(90), + hevm.expectRevert(BatchHeaderV1Codec.ErrorIncorrectBitmapLengthV1.selector); + rollup.finalizeBatchWithProof4844( + header, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(0), + new bytes(0), new bytes(0) ); hevm.stopPrank(); - // incorrect previous state root, revert - hevm.startPrank(address(0)); - hevm.expectRevert(ScrollChain.ErrorIncorrectPreviousStateRoot.selector); - rollup.finalizeBatchWithProof(batchHeader1, bytes32(uint256(2)), bytes32(uint256(2)), bytes32(0), new bytes(0)); - hevm.stopPrank(); - // verify success assertBoolEq(rollup.isBatchFinalized(1), false); hevm.startPrank(address(0)); - rollup.finalizeBatchWithProof( + rollup.finalizeBatchWithProof4844( batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(uint256(3)), + blobDataProof, new bytes(0) ); hevm.stopPrank(); @@ -280,17 +355,18 @@ contract ScrollChainTest is DSTestPlus { // batch already verified, revert hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorBatchIsAlreadyVerified.selector); - rollup.finalizeBatchWithProof( + rollup.finalizeBatchWithProof4844( batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(uint256(3)), + blobDataProof, new bytes(0) ); hevm.stopPrank(); } - function testCommitAndFinalizeWithL1MessagesV0() external { + function testCommitAndFinalizeWithL1MessagesV1() external { rollup.addSequencer(address(0)); rollup.addProver(address(0)); @@ -307,6 +383,19 @@ contract ScrollChainTest is DSTestPlus { rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); bytes32 batchHash0 = rollup.committedBatches(0); + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); + bytes memory bitmap; bytes[] memory chunks; bytes memory chunk0; @@ -325,24 +414,26 @@ contract ScrollChainTest is DSTestPlus { // => data hash for all chunks // d9cb6bf9264006fcea490d5c261f7453ab95b1b26033a3805996791b8e3a62f3 // => payload for batch header - // 00 + // 01 // 0000000000000001 // 0000000000000001 // 0000000000000001 // d9cb6bf9264006fcea490d5c261f7453ab95b1b26033a3805996791b8e3a62f3 + // 013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757 // 119b828c2a2798d2c957228ebeaff7e10bb099ae0d4e224f3eeb779ff61cba61 // 0000000000000000000000000000000000000000000000000000000000000000 // => hash for batch header - // 00847173b29b238cf319cde79512b7c213e5a8b4138daa7051914c4592b6dfc7 - bytes memory batchHeader1 = new bytes(89 + 32); + // 66b68a5092940d88a8c6f203d2071303557c024275d8ceaa2e12662bc61c8d8f + bytes memory batchHeader1 = new bytes(121 + 32); assembly { - mstore(add(batchHeader1, 0x20), 0) // version + mstore8(add(batchHeader1, 0x20), 1) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 mstore(add(batchHeader1, add(0x20, 9)), shl(192, 1)) // l1MessagePopped = 1 mstore(add(batchHeader1, add(0x20, 17)), shl(192, 1)) // totalL1MessagePopped = 1 mstore(add(batchHeader1, add(0x20, 25)), 0xd9cb6bf9264006fcea490d5c261f7453ab95b1b26033a3805996791b8e3a62f3) // dataHash - mstore(add(batchHeader1, add(0x20, 57)), batchHash0) // parentBatchHash - mstore(add(batchHeader1, add(0x20, 89)), 0) // bitmap0 + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 121)), 0) // bitmap0 } chunk0 = new bytes(1 + 60); assembly { @@ -355,22 +446,23 @@ contract ScrollChainTest is DSTestPlus { bitmap = new bytes(32); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit CommitBatch(1, bytes32(0x00847173b29b238cf319cde79512b7c213e5a8b4138daa7051914c4592b6dfc7)); - rollup.commitBatch(0, batchHeader0, chunks, bitmap); + emit CommitBatch(1, keccak256(batchHeader1)); + rollup.commitBatch(1, batchHeader0, chunks, bitmap); hevm.stopPrank(); assertBoolEq(rollup.isBatchFinalized(1), false); bytes32 batchHash1 = rollup.committedBatches(1); - assertEq(batchHash1, bytes32(0x00847173b29b238cf319cde79512b7c213e5a8b4138daa7051914c4592b6dfc7)); + assertEq(batchHash1, keccak256(batchHeader1)); // finalize batch1 hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); emit FinalizeBatch(1, batchHash1, bytes32(uint256(2)), bytes32(uint256(3))); - rollup.finalizeBatchWithProof( + rollup.finalizeBatchWithProof4844( batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(uint256(3)), + blobDataProof, new bytes(0) ); hevm.stopPrank(); @@ -391,7 +483,7 @@ contract ScrollChainTest is DSTestPlus { // 0003 // ... (some tx hashes) // => data hash for chunk0 - // 2ac1dad3f3696e5581dfc10f2c7a7a8fc5b344285f7d332c7895a8825fca609a + // c4e0d99a191bfcb1ba2edd2964a0f0a56c929b1ecdf149ba3ae4f045d6e6ef8b // 2. chunk1 has three blocks // 2.1 block0 has 5 tx, 3 L1 messages, no skips // 2.2 block1 has 10 tx, 5 L1 messages, even is skipped, last is not skipped @@ -412,47 +504,43 @@ contract ScrollChainTest is DSTestPlus { // 0000000000000000000000000000000000000000000000000000000000000000 // 0000000000000000 // 012c - // ... (some tx hashes) // => data hash for chunk2 - // e1276f58354ab2372050bde30d8c970ccc3728c76e97f37deebeee83ecbf5705 + // a84759a83bba5f73e3a748d138ae7b6c5a31a8a5273aeb0e578807bf1ef6ed4e // => data hash for all chunks - // 3c71d155351642d15f1542a1543ce423abeca1f8939100a0a34cdc3127b95f69 + // dae89323bf398ca9f6f8e83b1b0d603334be063fa3920015b6aa9df77a0ccbcd // => payload for batch header - // 00 + // 01 // 0000000000000002 // 0000000000000108 // 0000000000000109 - // 3c71d155351642d15f1542a1543ce423abeca1f8939100a0a34cdc3127b95f69 - // cef70bf80683c4d9b8b2813e90c314e8c56648e231300b8cfed9d666b0caf14e - // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa800000000000000000000000000000000000000000000000000000000000000aa + // dae89323bf398ca9f6f8e83b1b0d603334be063fa3920015b6aa9df77a0ccbcd + // 013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757 + // 66b68a5092940d88a8c6f203d2071303557c024275d8ceaa2e12662bc61c8d8f + // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa28000000000000000000000000000000000000000000000000000000000000002a // => hash for batch header - // 03a9cdcb9d582251acf60937db006ec99f3505fd4751b7c1f92c9a8ef413e873 - bytes memory batchHeader2 = new bytes(89 + 32 + 32); + // b9dff5d21381176a73b20a9294eb2703c803113f9559e358708c659fa1cf62eb + bytes memory batchHeader2 = new bytes(121 + 32 + 32); assembly { - mstore(add(batchHeader2, 0x20), 0) // version + mstore8(add(batchHeader2, 0x20), 1) // version mstore(add(batchHeader2, add(0x20, 1)), shl(192, 2)) // batchIndex = 2 mstore(add(batchHeader2, add(0x20, 9)), shl(192, 264)) // l1MessagePopped = 264 mstore(add(batchHeader2, add(0x20, 17)), shl(192, 265)) // totalL1MessagePopped = 265 - mstore(add(batchHeader2, add(0x20, 25)), 0x3c71d155351642d15f1542a1543ce423abeca1f8939100a0a34cdc3127b95f69) // dataHash - mstore(add(batchHeader2, add(0x20, 57)), batchHash1) // parentBatchHash + mstore(add(batchHeader2, add(0x20, 25)), 0xdae89323bf398ca9f6f8e83b1b0d603334be063fa3920015b6aa9df77a0ccbcd) // dataHash + mstore(add(batchHeader2, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader2, add(0x20, 89)), batchHash1) // parentBatchHash mstore( - add(batchHeader2, add(0x20, 89)), + add(batchHeader2, add(0x20, 121)), 77194726158210796949047323339125271902179989777093709359638389338608753093160 ) // bitmap0 - mstore(add(batchHeader2, add(0x20, 121)), 42) // bitmap1 + mstore(add(batchHeader2, add(0x20, 153)), 42) // bitmap1 } - chunk0 = new bytes(1 + 60 + 3 * 5); + chunk0 = new bytes(1 + 60); assembly { mstore(add(chunk0, 0x20), shl(248, 1)) // numBlocks = 1 mstore(add(chunk0, add(0x21, 56)), shl(240, 3)) // numTransactions = 3 mstore(add(chunk0, add(0x21, 58)), shl(240, 0)) // numL1Messages = 0 } - for (uint256 i = 0; i < 3; i++) { - assembly { - mstore(add(chunk0, add(93, mul(i, 5))), shl(224, 1)) // tx = "0x00" - } - } - chunk1 = new bytes(1 + 60 * 3 + 51 * 5); + chunk1 = new bytes(1 + 60 * 3); assembly { mstore(add(chunk1, 0x20), shl(248, 3)) // numBlocks = 3 mstore(add(chunk1, add(33, 56)), shl(240, 5)) // block0.numTransactions = 5 @@ -462,11 +550,6 @@ contract ScrollChainTest is DSTestPlus { mstore(add(chunk1, add(153, 56)), shl(240, 300)) // block1.numTransactions = 300 mstore(add(chunk1, add(153, 58)), shl(240, 256)) // block1.numL1Messages = 256 } - for (uint256 i = 0; i < 51; i++) { - assembly { - mstore(add(chunk1, add(213, mul(i, 5))), shl(224, 1)) // tx = "0x00" - } - } chunks = new bytes[](2); chunks[0] = chunk0; chunks[1] = chunk1; @@ -483,33 +566,34 @@ contract ScrollChainTest is DSTestPlus { rollup.updateMaxNumTxInChunk(2); // 3 - 1 hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorTooManyTxsInOneChunk.selector); - rollup.commitBatch(0, batchHeader1, chunks, bitmap); // first chunk with too many txs + rollup.commitBatch(1, batchHeader1, chunks, bitmap); // first chunk with too many txs hevm.stopPrank(); rollup.updateMaxNumTxInChunk(185); // 5+10+300 - 2 - 127 hevm.startPrank(address(0)); hevm.expectRevert(ScrollChain.ErrorTooManyTxsInOneChunk.selector); - rollup.commitBatch(0, batchHeader1, chunks, bitmap); // second chunk with too many txs + rollup.commitBatch(1, batchHeader1, chunks, bitmap); // second chunk with too many txs hevm.stopPrank(); rollup.updateMaxNumTxInChunk(186); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit CommitBatch(2, bytes32(0x03a9cdcb9d582251acf60937db006ec99f3505fd4751b7c1f92c9a8ef413e873)); - rollup.commitBatch(0, batchHeader1, chunks, bitmap); + emit CommitBatch(2, keccak256(batchHeader2)); + rollup.commitBatch(1, batchHeader1, chunks, bitmap); hevm.stopPrank(); assertBoolEq(rollup.isBatchFinalized(2), false); bytes32 batchHash2 = rollup.committedBatches(2); - assertEq(batchHash2, bytes32(0x03a9cdcb9d582251acf60937db006ec99f3505fd4751b7c1f92c9a8ef413e873)); + assertEq(batchHash2, keccak256(batchHeader2)); // verify committed batch correctly hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); emit FinalizeBatch(2, batchHash2, bytes32(uint256(4)), bytes32(uint256(5))); - rollup.finalizeBatchWithProof( + rollup.finalizeBatchWithProof4844( batchHeader2, bytes32(uint256(2)), bytes32(uint256(4)), bytes32(uint256(5)), + blobDataProof, new bytes(0) ); hevm.stopPrank(); @@ -540,124 +624,943 @@ contract ScrollChainTest is DSTestPlus { } } - function testRevertBatch() external { - // caller not owner, revert - hevm.startPrank(address(1)); - hevm.expectRevert("Ownable: caller is not the owner"); - rollup.revertBatch(new bytes(89), 1); - hevm.stopPrank(); - - rollup.addSequencer(address(0)); - + function testCommitBatchV3() external { bytes memory batchHeader0 = new bytes(89); - // import genesis batch + // import 10 L1 messages + for (uint256 i = 0; i < 10; i++) { + messageQueue.appendCrossDomainMessage(address(this), 1000000, new bytes(0)); + } + // import genesis batch first assembly { mstore(add(batchHeader0, add(0x20, 25)), 1) } rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); - bytes32 batchHash0 = rollup.committedBatches(0); + assertEq(rollup.committedBatches(0), keccak256(batchHeader0)); + + // caller not sequencer, revert + hevm.expectRevert(ScrollChain.ErrorCallerIsNotSequencer.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, new bytes[](0), new bytes(0), new bytes(0)); + rollup.addSequencer(address(0)); + + // revert when ErrorIncorrectBatchVersion + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchVersion.selector); + rollup.commitBatchWithBlobProof(2, batchHeader0, new bytes[](0), new bytes(0), new bytes(0)); + hevm.stopPrank(); + + // revert when ErrorBatchIsEmpty + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorBatchIsEmpty.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, new bytes[](0), new bytes(0), new bytes(0)); + hevm.stopPrank(); + + // revert when ErrorBatchHeaderV3LengthMismatch + bytes memory header = new bytes(192); + assembly { + mstore8(add(header, 0x20), 3) // version + } + hevm.startPrank(address(0)); + hevm.expectRevert(BatchHeaderV3Codec.ErrorBatchHeaderV3LengthMismatch.selector); + rollup.commitBatchWithBlobProof(3, header, new bytes[](1), new bytes(0), new bytes(0)); + hevm.stopPrank(); + + // revert when ErrorIncorrectBatchHash + assembly { + mstore(add(batchHeader0, add(0x20, 25)), 2) // change data hash for batch0 + } + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, new bytes[](1), new bytes(0), new bytes(0)); + hevm.stopPrank(); + assembly { + mstore(add(batchHeader0, add(0x20, 25)), 1) // change back + } bytes[] memory chunks = new bytes[](1); bytes memory chunk0; - // commit one batch + // no block in chunk, revert + chunk0 = new bytes(1); + chunks[0] = chunk0; + hevm.startPrank(address(0)); + hevm.expectRevert(ChunkCodecV1.ErrorNoBlockInChunkV1.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), new bytes(0)); + hevm.stopPrank(); + + // invalid chunk length, revert + chunk0 = new bytes(1); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunks[0] = chunk0; + hevm.startPrank(address(0)); + hevm.expectRevert(ChunkCodecV1.ErrorIncorrectChunkLengthV1.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), new bytes(0)); + hevm.stopPrank(); + + // cannot skip last L1 message, revert + chunk0 = new bytes(1 + 60); + bytes memory bitmap = new bytes(32); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunk0[58] = bytes1(uint8(1)); // numTransactions = 1 + chunk0[60] = bytes1(uint8(1)); // numL1Messages = 1 + bitmap[31] = bytes1(uint8(1)); + chunks[0] = chunk0; + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorLastL1MessageSkipped.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, bitmap, new bytes(0)); + hevm.stopPrank(); + + // num txs less than num L1 msgs, revert + chunk0 = new bytes(1 + 60); + bitmap = new bytes(32); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunk0[58] = bytes1(uint8(1)); // numTransactions = 1 + chunk0[60] = bytes1(uint8(3)); // numL1Messages = 3 + bitmap[31] = bytes1(uint8(3)); + chunks[0] = chunk0; + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorNumTxsLessThanNumL1Msgs.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, bitmap, new bytes(0)); + hevm.stopPrank(); + + // revert when ErrorNoBlobFound + // revert when ErrorNoBlobFound + chunk0 = new bytes(1 + 60); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunks[0] = chunk0; + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorNoBlobFound.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), new bytes(0)); + hevm.stopPrank(); + + // @note we cannot check `ErrorFoundMultipleBlobs` here + + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); + chunk0 = new bytes(1 + 60); chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; + // revert when ErrorCallPointEvaluationPrecompileFailed hevm.startPrank(address(0)); - rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); + hevm.expectRevert(ScrollChain.ErrorCallPointEvaluationPrecompileFailed.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), new bytes(0)); hevm.stopPrank(); - bytes memory batchHeader1 = new bytes(89); + bytes32 batchHash0 = rollup.committedBatches(0); + bytes memory batchHeader1 = new bytes(193); assembly { - mstore(add(batchHeader1, 0x20), 0) // version + mstore8(add(batchHeader1, 0x20), 3) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped mstore(add(batchHeader1, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash - mstore(add(batchHeader1, add(0x20, 57)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 121)), 0) // lastBlockTimestamp + mcopy(add(batchHeader1, add(0x20, 129)), add(blobDataProof, 0x20), 64) // blobDataProof } + // hash is ed32768c5f910a11edaf1c1ec0c0da847def9d24e0a24567c3c3d284061cf935 - // commit another batch + // succeed hevm.startPrank(address(0)); - rollup.commitBatch(0, batchHeader1, chunks, new bytes(0)); + assertEq(rollup.committedBatches(1), bytes32(0)); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), blobDataProof); hevm.stopPrank(); + assertEq(rollup.committedBatches(1), keccak256(batchHeader1)); - // count must be nonzero, revert - hevm.expectRevert(ScrollChain.ErrorRevertZeroBatches.selector); - rollup.revertBatch(batchHeader0, 0); + // revert when ErrorBatchIsAlreadyCommitted + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorBatchIsAlreadyCommitted.selector); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), blobDataProof); + hevm.stopPrank(); + } - // incorrect batch hash, revert - hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); - batchHeader1[1] = bytes1(uint8(1)); // change random byte - rollup.revertBatch(batchHeader1, 1); - batchHeader1[1] = bytes1(uint8(0)); // change back + function testFinalizeBundleWithProof() external { + // caller not prover, revert + hevm.expectRevert(ScrollChain.ErrorCallerIsNotProver.selector); + rollup.finalizeBundleWithProof(new bytes(0), bytes32(0), bytes32(0), new bytes(0)); - // revert middle batch, revert - hevm.expectRevert(ScrollChain.ErrorRevertNotStartFromEnd.selector); - rollup.revertBatch(batchHeader1, 1); + rollup.addProver(address(0)); + rollup.addSequencer(address(0)); - // can only revert unfinalized batch, revert - hevm.expectRevert(ScrollChain.ErrorRevertFinalizedBatch.selector); - rollup.revertBatch(batchHeader0, 3); + // import genesis batch + bytes memory batchHeader0 = new bytes(89); + assembly { + mstore(add(batchHeader0, add(0x20, 25)), 1) + } + rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); - // succeed to revert next two pending batches. + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); - hevm.expectEmit(true, true, false, true); - emit RevertBatch(1, rollup.committedBatches(1)); - hevm.expectEmit(true, true, false, true); - emit RevertBatch(2, rollup.committedBatches(2)); + bytes[] memory chunks = new bytes[](1); + bytes memory chunk0; - assertGt(uint256(rollup.committedBatches(1)), 0); - assertGt(uint256(rollup.committedBatches(2)), 0); - rollup.revertBatch(batchHeader1, 2); - assertEq(uint256(rollup.committedBatches(1)), 0); - assertEq(uint256(rollup.committedBatches(2)), 0); - } + bytes32 batchHash0 = rollup.committedBatches(0); + bytes memory batchHeader1 = new bytes(193); + assembly { + mstore8(add(batchHeader1, 0x20), 3) // version + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex + mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped + mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped + mstore(add(batchHeader1, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 121)), 0) // lastBlockTimestamp + mcopy(add(batchHeader1, add(0x20, 129)), add(blobDataProof, 0x20), 64) // blobDataProof + } + // hash is ed32768c5f910a11edaf1c1ec0c0da847def9d24e0a24567c3c3d284061cf935 - function testAddAndRemoveSequencer(address _sequencer) external { - // set by non-owner, should revert - hevm.startPrank(address(1)); - hevm.expectRevert("Ownable: caller is not the owner"); - rollup.addSequencer(_sequencer); - hevm.expectRevert("Ownable: caller is not the owner"); - rollup.removeSequencer(_sequencer); + // commit one batch + chunk0 = new bytes(1 + 60); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunks[0] = chunk0; + hevm.startPrank(address(0)); + assertEq(rollup.committedBatches(1), bytes32(0)); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, new bytes(0), blobDataProof); hevm.stopPrank(); + assertEq(rollup.committedBatches(1), keccak256(batchHeader1)); - hevm.expectRevert(ScrollChain.ErrorAccountIsNotEOA.selector); - rollup.addSequencer(address(this)); - hevm.assume(_sequencer.code.length == 0); - - // change to random EOA operator - hevm.expectEmit(true, false, false, true); - emit UpdateSequencer(_sequencer, true); + // revert when ErrorStateRootIsZero + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorStateRootIsZero.selector); + rollup.finalizeBundleWithProof(batchHeader1, bytes32(0), bytes32(0), new bytes(0)); + hevm.stopPrank(); - assertBoolEq(rollup.isSequencer(_sequencer), false); - rollup.addSequencer(_sequencer); - assertBoolEq(rollup.isSequencer(_sequencer), true); + // revert when ErrorBatchHeaderV3LengthMismatch + bytes memory header = new bytes(192); + assembly { + mstore8(add(header, 0x20), 3) // version + } + hevm.startPrank(address(0)); + hevm.expectRevert(BatchHeaderV3Codec.ErrorBatchHeaderV3LengthMismatch.selector); + rollup.finalizeBundleWithProof(header, bytes32(uint256(1)), bytes32(uint256(2)), new bytes(0)); + hevm.stopPrank(); - hevm.expectEmit(true, false, false, true); - emit UpdateSequencer(_sequencer, false); - rollup.removeSequencer(_sequencer); - assertBoolEq(rollup.isSequencer(_sequencer), false); - } + // revert when ErrorIncorrectBatchHash + batchHeader1[1] = bytes1(uint8(1)); // change random byte + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); + rollup.finalizeBundleWithProof(batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), new bytes(0)); + hevm.stopPrank(); + batchHeader1[1] = bytes1(uint8(0)); // change back - function testAddAndRemoveProver(address _prover) external { - // set by non-owner, should revert - hevm.startPrank(address(1)); - hevm.expectRevert("Ownable: caller is not the owner"); - rollup.addProver(_prover); - hevm.expectRevert("Ownable: caller is not the owner"); - rollup.removeProver(_prover); + // verify success + assertBoolEq(rollup.isBatchFinalized(1), false); + hevm.startPrank(address(0)); + rollup.finalizeBundleWithProof(batchHeader1, bytes32(uint256(2)), bytes32(uint256(3)), new bytes(0)); hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(1), true); + assertEq(rollup.finalizedStateRoots(1), bytes32(uint256(2))); + assertEq(rollup.withdrawRoots(1), bytes32(uint256(3))); + assertEq(rollup.lastFinalizedBatchIndex(), 1); - hevm.expectRevert(ScrollChain.ErrorAccountIsNotEOA.selector); - rollup.addProver(address(this)); - hevm.assume(_prover.code.length == 0); + // revert when ErrorBatchIsAlreadyVerified + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorBatchIsAlreadyVerified.selector); + rollup.finalizeBundleWithProof(batchHeader1, bytes32(uint256(2)), bytes32(uint256(3)), new bytes(0)); + hevm.stopPrank(); + } - // change to random EOA operator - hevm.expectEmit(true, false, false, true); + function _commitBatchV3() + internal + returns ( + bytes memory batchHeader0, + bytes memory batchHeader1, + bytes memory batchHeader2 + ) + { + // import genesis batch first + batchHeader0 = new bytes(89); + assembly { + mstore(add(batchHeader0, add(0x20, 25)), 1) + } + rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); + bytes32 batchHash0 = rollup.committedBatches(0); + + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); + + bytes memory bitmap; + bytes[] memory chunks; + bytes memory chunk0; + bytes memory chunk1; + + // commit batch1, one chunk with one block, 1 tx, 1 L1 message, no skip + // => payload for data hash of chunk0 + // 0000000000000000 + // 0000000000000123 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 0001 + // a2277fd30bbbe74323309023b56035b376d7768ad237ae4fc46ead7dc9591ae1 + // => data hash for chunk0 + // 5972b8fa626c873a97abb6db14fb0cb2085e050a6f80ec90b92bb0bbaa12eb5a + // => data hash for all chunks + // f6166fe668c1e6a04e3c75e864452bb02a31358f285efcb7a4e6603eb5750359 + // => payload for batch header + // 03 + // 0000000000000001 + // 0000000000000001 + // 0000000000000001 + // f6166fe668c1e6a04e3c75e864452bb02a31358f285efcb7a4e6603eb5750359 + // 013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757 + // 119b828c2a2798d2c957228ebeaff7e10bb099ae0d4e224f3eeb779ff61cba61 + // 0000000000000123 + // 2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e687 + // 53ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0 + // => hash for batch header + // 07e1bede8c5047cf8ca7ac84f5390837fb6224953af83d7e967488fa63a2065e + batchHeader1 = new bytes(193); + assembly { + mstore8(add(batchHeader1, 0x20), 3) // version + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 + mstore(add(batchHeader1, add(0x20, 9)), shl(192, 1)) // l1MessagePopped = 1 + mstore(add(batchHeader1, add(0x20, 17)), shl(192, 1)) // totalL1MessagePopped = 1 + mstore(add(batchHeader1, add(0x20, 25)), 0xf6166fe668c1e6a04e3c75e864452bb02a31358f285efcb7a4e6603eb5750359) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 121)), shl(192, 0x123)) // lastBlockTimestamp + mcopy(add(batchHeader1, add(0x20, 129)), add(blobDataProof, 0x20), 64) // blobDataProof + } + chunk0 = new bytes(1 + 60); + assembly { + mstore(add(chunk0, 0x20), shl(248, 1)) // numBlocks = 1 + mstore(add(chunk0, add(0x21, 8)), shl(192, 0x123)) // timestamp = 0x123 + mstore(add(chunk0, add(0x21, 56)), shl(240, 1)) // numTransactions = 1 + mstore(add(chunk0, add(0x21, 58)), shl(240, 1)) // numL1Messages = 1 + } + chunks = new bytes[](1); + chunks[0] = chunk0; + bitmap = new bytes(32); + hevm.startPrank(address(0)); + hevm.expectEmit(true, true, false, true); + emit CommitBatch(1, keccak256(batchHeader1)); + rollup.commitBatchWithBlobProof(3, batchHeader0, chunks, bitmap, blobDataProof); + hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(1), false); + bytes32 batchHash1 = rollup.committedBatches(1); + assertEq(batchHash1, keccak256(batchHeader1)); + assertEq(1, messageQueue.pendingQueueIndex()); + assertEq(0, messageQueue.nextUnfinalizedQueueIndex()); + assertBoolEq(messageQueue.isMessageSkipped(0), false); + + // commit batch2 with two chunks, correctly + // 1. chunk0 has one block, 3 tx, no L1 messages + // => payload for chunk0 + // 0000000000000000 + // 0000000000000456 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 0003 + // ... (some tx hashes) + // => data hash for chunk0 + // 1c7649f248aed8448fa7997e44db7b7028581deb119c6d6aa1a2d126d62564cf + // 2. chunk1 has three blocks + // 2.1 block0 has 5 tx, 3 L1 messages, no skips + // 2.2 block1 has 10 tx, 5 L1 messages, even is skipped, last is not skipped + // 2.2 block1 has 300 tx, 256 L1 messages, odd position is skipped, last is not skipped + // => payload for chunk1 + // 0000000000000000 + // 0000000000000789 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 0005 + // 0000000000000000 + // 0000000000001234 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 000a + // 0000000000000000 + // 0000000000005678 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 012c + // => data hash for chunk1 + // 4e82cb576135a69a0ecc2b2070c432abfdeb20076594faaa1aeed77f48d7c856 + // => data hash for all chunks + // 166e9d20206ae8cddcdf0f30093e3acc3866937172df5d7f69fb5567d9595239 + // => payload for batch header + // 03 + // 0000000000000002 + // 0000000000000108 + // 0000000000000109 + // 166e9d20206ae8cddcdf0f30093e3acc3866937172df5d7f69fb5567d9595239 + // 013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757 + // 07e1bede8c5047cf8ca7ac84f5390837fb6224953af83d7e967488fa63a2065e + // 0000000000005678 + // 2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e687 + // 53ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0 + // => hash for batch header + // 8a59f0de6f1071c0f48d6a49d9b794008d28b63cc586da0f44f8b2b4e13cb231 + batchHeader2 = new bytes(193); + assembly { + mstore8(add(batchHeader2, 0x20), 3) // version + mstore(add(batchHeader2, add(0x20, 1)), shl(192, 2)) // batchIndex = 2 + mstore(add(batchHeader2, add(0x20, 9)), shl(192, 264)) // l1MessagePopped = 264 + mstore(add(batchHeader2, add(0x20, 17)), shl(192, 265)) // totalL1MessagePopped = 265 + mstore(add(batchHeader2, add(0x20, 25)), 0x166e9d20206ae8cddcdf0f30093e3acc3866937172df5d7f69fb5567d9595239) // dataHash + mstore(add(batchHeader2, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader2, add(0x20, 89)), batchHash1) // parentBatchHash + mstore(add(batchHeader2, add(0x20, 121)), shl(192, 0x5678)) // lastBlockTimestamp + mcopy(add(batchHeader2, add(0x20, 129)), add(blobDataProof, 0x20), 64) // blobDataProof + } + chunk0 = new bytes(1 + 60); + assembly { + mstore(add(chunk0, 0x20), shl(248, 1)) // numBlocks = 1 + mstore(add(chunk0, add(0x21, 8)), shl(192, 0x456)) // timestamp = 0x456 + mstore(add(chunk0, add(0x21, 56)), shl(240, 3)) // numTransactions = 3 + mstore(add(chunk0, add(0x21, 58)), shl(240, 0)) // numL1Messages = 0 + } + chunk1 = new bytes(1 + 60 * 3); + assembly { + mstore(add(chunk1, 0x20), shl(248, 3)) // numBlocks = 3 + mstore(add(chunk1, add(33, 8)), shl(192, 0x789)) // block0.timestamp = 0x789 + mstore(add(chunk1, add(33, 56)), shl(240, 5)) // block0.numTransactions = 5 + mstore(add(chunk1, add(33, 58)), shl(240, 3)) // block0.numL1Messages = 3 + mstore(add(chunk1, add(93, 8)), shl(192, 0x1234)) // block1.timestamp = 0x1234 + mstore(add(chunk1, add(93, 56)), shl(240, 10)) // block1.numTransactions = 10 + mstore(add(chunk1, add(93, 58)), shl(240, 5)) // block1.numL1Messages = 5 + mstore(add(chunk1, add(153, 8)), shl(192, 0x5678)) // block1.timestamp = 0x5678 + mstore(add(chunk1, add(153, 56)), shl(240, 300)) // block1.numTransactions = 300 + mstore(add(chunk1, add(153, 58)), shl(240, 256)) // block1.numL1Messages = 256 + } + chunks = new bytes[](2); + chunks[0] = chunk0; + chunks[1] = chunk1; + bitmap = new bytes(64); + assembly { + mstore( + add(bitmap, add(0x20, 0)), + 77194726158210796949047323339125271902179989777093709359638389338608753093160 + ) // bitmap0 + mstore(add(bitmap, add(0x20, 32)), 42) // bitmap1 + } + + // too many txs in one chunk, revert + rollup.updateMaxNumTxInChunk(2); // 3 - 1 + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorTooManyTxsInOneChunk.selector); + rollup.commitBatchWithBlobProof(3, batchHeader1, chunks, bitmap, blobDataProof); // first chunk with too many txs + hevm.stopPrank(); + rollup.updateMaxNumTxInChunk(185); // 5+10+300 - 2 - 127 + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorTooManyTxsInOneChunk.selector); + rollup.commitBatchWithBlobProof(3, batchHeader1, chunks, bitmap, blobDataProof); // second chunk with too many txs + hevm.stopPrank(); + + rollup.updateMaxNumTxInChunk(186); + hevm.startPrank(address(0)); + hevm.expectEmit(true, true, false, true); + emit CommitBatch(2, keccak256(batchHeader2)); + rollup.commitBatchWithBlobProof(3, batchHeader1, chunks, bitmap, blobDataProof); + hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(2), false); + bytes32 batchHash2 = rollup.committedBatches(2); + assertEq(batchHash2, keccak256(batchHeader2)); + assertEq(265, messageQueue.pendingQueueIndex()); + assertEq(0, messageQueue.nextUnfinalizedQueueIndex()); + } + + function testCommitAndFinalizeWithL1MessagesV3() external { + rollup.addSequencer(address(0)); + rollup.addProver(address(0)); + + // import 300 L1 messages + for (uint256 i = 0; i < 300; i++) { + messageQueue.appendCrossDomainMessage(address(this), 1000000, new bytes(0)); + } + + (bytes memory batchHeader0, bytes memory batchHeader1, bytes memory batchHeader2) = _commitBatchV3(); + + // 1 ~ 4, zero + for (uint256 i = 1; i < 4; i++) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } + // 4 ~ 9, even is nonzero, odd is zero + for (uint256 i = 4; i < 9; i++) { + if (i % 2 == 1 || i == 8) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } else { + assertBoolEq(messageQueue.isMessageSkipped(i), true); + } + } + // 9 ~ 265, even is nonzero, odd is zero + for (uint256 i = 9; i < 265; i++) { + if (i % 2 == 1 || i == 264) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } else { + assertBoolEq(messageQueue.isMessageSkipped(i), true); + } + } + + // finalize batch1 and batch2 together + assertBoolEq(rollup.isBatchFinalized(1), false); + assertBoolEq(rollup.isBatchFinalized(2), false); + hevm.startPrank(address(0)); + rollup.finalizeBundleWithProof(batchHeader2, bytes32(uint256(2)), bytes32(uint256(3)), new bytes(0)); + hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(1), true); + assertBoolEq(rollup.isBatchFinalized(2), true); + assertEq(rollup.finalizedStateRoots(1), bytes32(0)); + assertEq(rollup.withdrawRoots(1), bytes32(0)); + assertEq(rollup.finalizedStateRoots(2), bytes32(uint256(2))); + assertEq(rollup.withdrawRoots(2), bytes32(uint256(3))); + assertEq(rollup.lastFinalizedBatchIndex(), 2); + assertEq(265, messageQueue.nextUnfinalizedQueueIndex()); + } + + function testRevertBatchWithL1Messages() external { + rollup.addSequencer(address(0)); + rollup.addProver(address(0)); + + // import 300 L1 messages + for (uint256 i = 0; i < 300; i++) { + messageQueue.appendCrossDomainMessage(address(this), 1000000, new bytes(0)); + } + + (bytes memory batchHeader0, bytes memory batchHeader1, bytes memory batchHeader2) = _commitBatchV3(); + + // 1 ~ 4, zero + for (uint256 i = 1; i < 4; i++) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } + // 4 ~ 9, even is nonzero, odd is zero + for (uint256 i = 4; i < 9; i++) { + if (i % 2 == 1 || i == 8) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } else { + assertBoolEq(messageQueue.isMessageSkipped(i), true); + } + } + // 9 ~ 265, even is nonzero, odd is zero + for (uint256 i = 9; i < 265; i++) { + if (i % 2 == 1 || i == 264) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } else { + assertBoolEq(messageQueue.isMessageSkipped(i), true); + } + } + + // revert batch 1 and batch 2 + rollup.revertBatch(batchHeader1, batchHeader2); + assertEq(0, messageQueue.pendingQueueIndex()); + assertEq(0, messageQueue.nextUnfinalizedQueueIndex()); + for (uint256 i = 0; i < 265; i++) { + assertBoolEq(messageQueue.isMessageSkipped(i), false); + } + } + + function testSwitchBatchFromV1ToV3() external { + rollup.addSequencer(address(0)); + rollup.addProver(address(0)); + + // import 300 L1 messages + for (uint256 i = 0; i < 300; i++) { + messageQueue.appendCrossDomainMessage(address(this), 1000000, new bytes(0)); + } + + // import genesis batch first + bytes memory batchHeader0 = new bytes(89); + assembly { + mstore(add(batchHeader0, add(0x20, 25)), 1) + } + rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); + bytes32 batchHash0 = rollup.committedBatches(0); + + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); + + bytes memory bitmap; + bytes[] memory chunks; + bytes memory chunk0; + bytes memory chunk1; + + // commit batch1 with version v1, one chunk with one block, 1 tx, 1 L1 message, no skip + // => payload for data hash of chunk0 + // 0000000000000000 + // 0000000000000000 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 0001 + // a2277fd30bbbe74323309023b56035b376d7768ad237ae4fc46ead7dc9591ae1 + // => data hash for chunk0 + // 9ef1e5694bdb014a1eea42be756a8f63bfd8781d6332e9ef3b5126d90c62f110 + // => data hash for all chunks + // d9cb6bf9264006fcea490d5c261f7453ab95b1b26033a3805996791b8e3a62f3 + // => payload for batch header + // 01 + // 0000000000000001 + // 0000000000000001 + // 0000000000000001 + // d9cb6bf9264006fcea490d5c261f7453ab95b1b26033a3805996791b8e3a62f3 + // 013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757 + // 119b828c2a2798d2c957228ebeaff7e10bb099ae0d4e224f3eeb779ff61cba61 + // 0000000000000000000000000000000000000000000000000000000000000000 + // => hash for batch header + // 66b68a5092940d88a8c6f203d2071303557c024275d8ceaa2e12662bc61c8d8f + bytes memory batchHeader1 = new bytes(121 + 32); + assembly { + mstore8(add(batchHeader1, 0x20), 1) // version + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 + mstore(add(batchHeader1, add(0x20, 9)), shl(192, 1)) // l1MessagePopped = 1 + mstore(add(batchHeader1, add(0x20, 17)), shl(192, 1)) // totalL1MessagePopped = 1 + mstore(add(batchHeader1, add(0x20, 25)), 0xd9cb6bf9264006fcea490d5c261f7453ab95b1b26033a3805996791b8e3a62f3) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + mstore(add(batchHeader1, add(0x20, 121)), 0) // bitmap0 + } + chunk0 = new bytes(1 + 60); + assembly { + mstore(add(chunk0, 0x20), shl(248, 1)) // numBlocks = 1 + mstore(add(chunk0, add(0x21, 56)), shl(240, 1)) // numTransactions = 1 + mstore(add(chunk0, add(0x21, 58)), shl(240, 1)) // numL1Messages = 1 + } + chunks = new bytes[](1); + chunks[0] = chunk0; + bitmap = new bytes(32); + hevm.startPrank(address(0)); + hevm.expectEmit(true, true, false, true); + emit CommitBatch(1, keccak256(batchHeader1)); + rollup.commitBatch(1, batchHeader0, chunks, bitmap); + hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(1), false); + bytes32 batchHash1 = rollup.committedBatches(1); + assertEq(batchHash1, keccak256(batchHeader1)); + + // commit batch2 with version v2, with two chunks, correctly + // 1. chunk0 has one block, 3 tx, no L1 messages + // => payload for chunk0 + // 0000000000000000 + // 0000000000000456 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 0003 + // ... (some tx hashes) + // => data hash for chunk0 + // 1c7649f248aed8448fa7997e44db7b7028581deb119c6d6aa1a2d126d62564cf + // 2. chunk1 has three blocks + // 2.1 block0 has 5 tx, 3 L1 messages, no skips + // 2.2 block1 has 10 tx, 5 L1 messages, even is skipped, last is not skipped + // 2.2 block1 has 300 tx, 256 L1 messages, odd position is skipped, last is not skipped + // => payload for chunk1 + // 0000000000000000 + // 0000000000000789 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 0005 + // 0000000000000000 + // 0000000000001234 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 000a + // 0000000000000000 + // 0000000000005678 + // 0000000000000000000000000000000000000000000000000000000000000000 + // 0000000000000000 + // 012c + // => data hash for chunk1 + // 4e82cb576135a69a0ecc2b2070c432abfdeb20076594faaa1aeed77f48d7c856 + // => data hash for all chunks + // 166e9d20206ae8cddcdf0f30093e3acc3866937172df5d7f69fb5567d9595239 + // => payload for batch header + // 03 + // 0000000000000002 + // 0000000000000108 + // 0000000000000109 + // 166e9d20206ae8cddcdf0f30093e3acc3866937172df5d7f69fb5567d9595239 + // 013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757 + // 66b68a5092940d88a8c6f203d2071303557c024275d8ceaa2e12662bc61c8d8f + // 0000000000005678 + // 2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e687 + // 53ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0 + // => hash for batch header + // f212a256744ca658dfc4eb32665aa0fe845eb757a030bd625cb2880055e3cc92 + bytes memory batchHeader2 = new bytes(193); + assembly { + mstore8(add(batchHeader2, 0x20), 3) // version + mstore(add(batchHeader2, add(0x20, 1)), shl(192, 2)) // batchIndex = 2 + mstore(add(batchHeader2, add(0x20, 9)), shl(192, 264)) // l1MessagePopped = 264 + mstore(add(batchHeader2, add(0x20, 17)), shl(192, 265)) // totalL1MessagePopped = 265 + mstore(add(batchHeader2, add(0x20, 25)), 0x166e9d20206ae8cddcdf0f30093e3acc3866937172df5d7f69fb5567d9595239) // dataHash + mstore(add(batchHeader2, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader2, add(0x20, 89)), batchHash1) // parentBatchHash + mstore(add(batchHeader2, add(0x20, 121)), shl(192, 0x5678)) // lastBlockTimestamp + mcopy(add(batchHeader2, add(0x20, 129)), add(blobDataProof, 0x20), 64) // blobDataProof + } + chunk0 = new bytes(1 + 60); + assembly { + mstore(add(chunk0, 0x20), shl(248, 1)) // numBlocks = 1 + mstore(add(chunk0, add(0x21, 8)), shl(192, 0x456)) // timestamp = 0x456 + mstore(add(chunk0, add(0x21, 56)), shl(240, 3)) // numTransactions = 3 + mstore(add(chunk0, add(0x21, 58)), shl(240, 0)) // numL1Messages = 0 + } + chunk1 = new bytes(1 + 60 * 3); + assembly { + mstore(add(chunk1, 0x20), shl(248, 3)) // numBlocks = 3 + mstore(add(chunk1, add(33, 8)), shl(192, 0x789)) // block0.timestamp = 0x789 + mstore(add(chunk1, add(33, 56)), shl(240, 5)) // block0.numTransactions = 5 + mstore(add(chunk1, add(33, 58)), shl(240, 3)) // block0.numL1Messages = 3 + mstore(add(chunk1, add(93, 8)), shl(192, 0x1234)) // block1.timestamp = 0x1234 + mstore(add(chunk1, add(93, 56)), shl(240, 10)) // block1.numTransactions = 10 + mstore(add(chunk1, add(93, 58)), shl(240, 5)) // block1.numL1Messages = 5 + mstore(add(chunk1, add(153, 8)), shl(192, 0x5678)) // block1.timestamp = 0x5678 + mstore(add(chunk1, add(153, 56)), shl(240, 300)) // block1.numTransactions = 300 + mstore(add(chunk1, add(153, 58)), shl(240, 256)) // block1.numL1Messages = 256 + } + chunks = new bytes[](2); + chunks[0] = chunk0; + chunks[1] = chunk1; + bitmap = new bytes(64); + assembly { + mstore( + add(bitmap, add(0x20, 0)), + 77194726158210796949047323339125271902179989777093709359638389338608753093160 + ) // bitmap0 + mstore(add(bitmap, add(0x20, 32)), 42) // bitmap1 + } + + rollup.updateMaxNumTxInChunk(186); + // should revert, when all v1 batch not finalized + hevm.startPrank(address(0)); + hevm.expectRevert("start index mismatch"); + rollup.commitBatchWithBlobProof(3, batchHeader1, chunks, bitmap, blobDataProof); + hevm.stopPrank(); + + // finalize batch1 + hevm.startPrank(address(0)); + hevm.expectEmit(true, true, false, true); + emit FinalizeBatch(1, batchHash1, bytes32(uint256(2)), bytes32(uint256(3))); + rollup.finalizeBatchWithProof4844( + batchHeader1, + bytes32(uint256(1)), + bytes32(uint256(2)), + bytes32(uint256(3)), + blobDataProof, + new bytes(0) + ); + hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(1), true); + assertEq(rollup.finalizedStateRoots(1), bytes32(uint256(2))); + assertEq(rollup.withdrawRoots(1), bytes32(uint256(3))); + assertEq(rollup.lastFinalizedBatchIndex(), 1); + assertBoolEq(messageQueue.isMessageSkipped(0), false); + assertEq(messageQueue.pendingQueueIndex(), 1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); + + hevm.startPrank(address(0)); + hevm.expectEmit(true, true, false, true); + emit CommitBatch(2, keccak256(batchHeader2)); + rollup.commitBatchWithBlobProof(3, batchHeader1, chunks, bitmap, blobDataProof); + hevm.stopPrank(); + bytes32 batchHash2 = rollup.committedBatches(2); + assertEq(batchHash2, keccak256(batchHeader2)); + assertEq(messageQueue.pendingQueueIndex(), 265); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); + + // finalize batch2 + assertBoolEq(rollup.isBatchFinalized(2), false); + hevm.startPrank(address(0)); + rollup.finalizeBundleWithProof(batchHeader2, bytes32(uint256(2)), bytes32(uint256(3)), new bytes(0)); + hevm.stopPrank(); + assertBoolEq(rollup.isBatchFinalized(2), true); + assertEq(rollup.finalizedStateRoots(2), bytes32(uint256(2))); + assertEq(rollup.withdrawRoots(2), bytes32(uint256(3))); + assertEq(rollup.lastFinalizedBatchIndex(), 2); + } + + function testRevertBatch() external { + // upgrade to ScrollChainMockBlob + ScrollChainMockBlob impl = new ScrollChainMockBlob( + rollup.layer2ChainId(), + rollup.messageQueue(), + rollup.verifier() + ); + admin.upgrade(ITransparentUpgradeableProxy(address(rollup)), address(impl)); + + // from https://etherscan.io/blob/0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757?bid=740652 + bytes32 blobVersionedHash = 0x013590dc3544d56629ba81bb14d4d31248f825001653aa575eb8e3a719046757; + bytes + memory blobDataProof = hex"2c9d777660f14ad49803a6442935c0d24a0d83551de5995890bf70a17d24e68753ab0fe6807c7081f0885fe7da741554d658a03730b1fa006f8319f8b993bcb0a5a0c9e8a145c5ef6e415c245690effa2914ec9393f58a7251d30c0657da1453d9ad906eae8b97dd60c9a216f81b4df7af34d01e214e1ec5865f0133ecc16d7459e49dab66087340677751e82097fbdd20551d66076f425775d1758a9dfd186b"; + ScrollChainMockBlob(address(rollup)).setBlobVersionedHash(blobVersionedHash); + + // caller not owner, revert + hevm.startPrank(address(1)); + hevm.expectRevert("Ownable: caller is not the owner"); + rollup.revertBatch(new bytes(89), new bytes(89)); + hevm.stopPrank(); + + rollup.addSequencer(address(0)); + + bytes memory batchHeader0 = new bytes(89); + + // import genesis batch + assembly { + mstore(add(batchHeader0, add(0x20, 25)), 1) + } + rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); + bytes32 batchHash0 = rollup.committedBatches(0); + + bytes[] memory chunks = new bytes[](1); + bytes memory chunk0; + + // commit one batch + chunk0 = new bytes(1 + 60); + chunk0[0] = bytes1(uint8(1)); // one block in this chunk + chunks[0] = chunk0; + hevm.startPrank(address(0)); + rollup.commitBatch(1, batchHeader0, chunks, new bytes(0)); + bytes32 batchHash1 = rollup.committedBatches(1); + hevm.stopPrank(); + + bytes memory batchHeader1 = new bytes(121); + assembly { + mstore8(add(batchHeader1, 0x20), 1) // version + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex + mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped + mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped + mstore(add(batchHeader1, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader1, add(0x20, 89)), batchHash0) // parentBatchHash + } + + // commit another batch + hevm.startPrank(address(0)); + rollup.commitBatch(1, batchHeader1, chunks, new bytes(0)); + hevm.stopPrank(); + + bytes memory batchHeader2 = new bytes(121); + assembly { + mstore8(add(batchHeader2, 0x20), 1) // version + mstore(add(batchHeader2, add(0x20, 1)), shl(192, 2)) // batchIndex + mstore(add(batchHeader2, add(0x20, 9)), 0) // l1MessagePopped + mstore(add(batchHeader2, add(0x20, 17)), 0) // totalL1MessagePopped + mstore(add(batchHeader2, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash + mstore(add(batchHeader2, add(0x20, 57)), blobVersionedHash) // blobVersionedHash + mstore(add(batchHeader2, add(0x20, 89)), batchHash1) // parentBatchHash + } + + // incorrect batch hash of first header, revert + batchHeader1[1] = bytes1(uint8(1)); // change random byte + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); + rollup.revertBatch(batchHeader1, batchHeader0); + batchHeader1[1] = bytes1(uint8(0)); // change back + + // incorrect batch hash of second header, revert + batchHeader1[1] = bytes1(uint8(1)); // change random byte + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); + rollup.revertBatch(batchHeader0, batchHeader1); + batchHeader1[1] = bytes1(uint8(0)); // change back + + // count must be nonzero, revert + hevm.expectRevert(ScrollChain.ErrorRevertZeroBatches.selector); + rollup.revertBatch(batchHeader1, batchHeader0); + + // revert middle batch, revert + hevm.expectRevert(ScrollChain.ErrorRevertNotStartFromEnd.selector); + rollup.revertBatch(batchHeader1, batchHeader1); + + // can only revert unfinalized batch, revert + hevm.expectRevert(ScrollChain.ErrorRevertFinalizedBatch.selector); + rollup.revertBatch(batchHeader0, batchHeader2); + + // succeed to revert next two pending batches. + + hevm.expectEmit(true, true, false, true); + emit RevertBatch(2, rollup.committedBatches(2)); + hevm.expectEmit(true, true, false, true); + emit RevertBatch(1, rollup.committedBatches(1)); + + assertGt(uint256(rollup.committedBatches(1)), 0); + assertGt(uint256(rollup.committedBatches(2)), 0); + rollup.revertBatch(batchHeader1, batchHeader2); + assertEq(uint256(rollup.committedBatches(1)), 0); + assertEq(uint256(rollup.committedBatches(2)), 0); + } + + function testAddAndRemoveSequencer(address _sequencer) external { + // set by non-owner, should revert + hevm.startPrank(address(1)); + hevm.expectRevert("Ownable: caller is not the owner"); + rollup.addSequencer(_sequencer); + hevm.expectRevert("Ownable: caller is not the owner"); + rollup.removeSequencer(_sequencer); + hevm.stopPrank(); + + hevm.expectRevert(ScrollChain.ErrorAccountIsNotEOA.selector); + rollup.addSequencer(address(this)); + hevm.assume(_sequencer.code.length == 0); + + // change to random EOA operator + hevm.expectEmit(true, false, false, true); + emit UpdateSequencer(_sequencer, true); + + assertBoolEq(rollup.isSequencer(_sequencer), false); + rollup.addSequencer(_sequencer); + assertBoolEq(rollup.isSequencer(_sequencer), true); + + hevm.expectEmit(true, false, false, true); + emit UpdateSequencer(_sequencer, false); + rollup.removeSequencer(_sequencer); + assertBoolEq(rollup.isSequencer(_sequencer), false); + } + + function testAddAndRemoveProver(address _prover) external { + // set by non-owner, should revert + hevm.startPrank(address(1)); + hevm.expectRevert("Ownable: caller is not the owner"); + rollup.addProver(_prover); + hevm.expectRevert("Ownable: caller is not the owner"); + rollup.removeProver(_prover); + hevm.stopPrank(); + + hevm.expectRevert(ScrollChain.ErrorAccountIsNotEOA.selector); + rollup.addProver(address(this)); + hevm.assume(_prover.code.length == 0); + + // change to random EOA operator + hevm.expectEmit(true, false, false, true); emit UpdateProver(_prover, true); assertBoolEq(rollup.isProver(_prover), false); @@ -686,9 +1589,13 @@ contract ScrollChainTest is DSTestPlus { hevm.startPrank(address(0)); hevm.expectRevert("Pausable: paused"); - rollup.commitBatch(0, new bytes(0), new bytes[](0), new bytes(0)); + rollup.commitBatch(1, new bytes(0), new bytes[](0), new bytes(0)); + hevm.expectRevert("Pausable: paused"); + rollup.commitBatchWithBlobProof(3, new bytes(0), new bytes[](0), new bytes(0), new bytes(0)); + hevm.expectRevert("Pausable: paused"); + rollup.finalizeBatchWithProof4844(new bytes(0), bytes32(0), bytes32(0), bytes32(0), new bytes(0), new bytes(0)); hevm.expectRevert("Pausable: paused"); - rollup.finalizeBatchWithProof(new bytes(0), bytes32(0), bytes32(0), bytes32(0), new bytes(0)); + rollup.finalizeBundleWithProof(new bytes(0), bytes32(0), bytes32(0), new bytes(0)); hevm.stopPrank(); // unpause @@ -722,12 +1629,12 @@ contract ScrollChainTest is DSTestPlus { // batch header length too small, revert batchHeader = new bytes(88); - hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderLengthTooSmall.selector); + hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderV0LengthTooSmall.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // wrong bitmap length, revert batchHeader = new bytes(90); - hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLength.selector); + hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLengthV0.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // not all fields are zero, revert diff --git a/src/test/lido/L1LidoGateway.t.sol b/src/test/lido/L1LidoGateway.t.sol index 533ba0f..6e2ff27 100644 --- a/src/test/lido/L1LidoGateway.t.sol +++ b/src/test/lido/L1LidoGateway.t.sol @@ -394,6 +394,8 @@ contract L1LidoGatewayTest is L1GatewayTestBase { // skip message 0 hevm.startPrank(address(rollup)); messageQueue.popCrossDomainMessage(0, 1, 0x1); + messageQueue.finalizePoppedCrossDomainMessage(1); + assertEq(messageQueue.nextUnfinalizedQueueIndex(), 1); assertEq(messageQueue.pendingQueueIndex(), 1); hevm.stopPrank(); diff --git a/src/test/mocks/MockRollupVerifier.sol b/src/test/mocks/MockRollupVerifier.sol index 783b7ce..3946b89 100644 --- a/src/test/mocks/MockRollupVerifier.sol +++ b/src/test/mocks/MockRollupVerifier.sol @@ -19,4 +19,12 @@ contract MockRollupVerifier is IRollupVerifier { bytes calldata, bytes32 ) external view {} + + /// @inheritdoc IRollupVerifier + function verifyBundleProof( + uint256, + uint256, + bytes calldata, + bytes calldata + ) external view {} } diff --git a/src/test/mocks/MockZkEvmVerifier.sol b/src/test/mocks/MockZkEvmVerifier.sol index 33cbd2a..65e6fc8 100644 --- a/src/test/mocks/MockZkEvmVerifier.sol +++ b/src/test/mocks/MockZkEvmVerifier.sol @@ -2,13 +2,18 @@ pragma solidity =0.8.24; -import {IZkEvmVerifier} from "../../libraries/verifier/IZkEvmVerifier.sol"; +import {IZkEvmVerifierV1, IZkEvmVerifierV2} from "../../libraries/verifier/IZkEvmVerifier.sol"; -contract MockZkEvmVerifier is IZkEvmVerifier { +contract MockZkEvmVerifier is IZkEvmVerifierV1, IZkEvmVerifierV2 { event Called(address); - /// @inheritdoc IZkEvmVerifier + /// @inheritdoc IZkEvmVerifierV1 function verify(bytes calldata, bytes32) external view { revert(string(abi.encode(address(this)))); } + + /// @inheritdoc IZkEvmVerifierV2 + function verify(bytes calldata, bytes calldata) external view { + revert(string(abi.encode(address(this)))); + } } diff --git a/yarn.lock b/yarn.lock index bed2aa4..8709fc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -787,65 +787,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/edr-darwin-arm64@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.1.tgz#386cbb7dd8ba70659d76d6ce5e8b06242fac6c8c" - integrity sha512-qsdGS1Kfp6bVH4fk4hUzbsEm0fH7hGurraKk+IWby7Ecv+u7BuNaLVqeoYauYRFLYnGg8XZmcKOJ9BW35Y96Jg== - -"@nomicfoundation/edr-darwin-x64@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.1.tgz#809ebd68127fb7b4219c5ddc8ef65b38bc88312b" - integrity sha512-vtS2yuXIgjte42KEg/Aw/xmLRneVrIaDFhFMk578zg3m1UjNP+a29Lirw5fRXaqaL8aPyhRFmUy+1/V4MGaH+g== - -"@nomicfoundation/edr-linux-arm64-gnu@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.1.tgz#897bf524e88d6a07a2b39c5a9c5d94eaeee6ec20" - integrity sha512-GrbQcrVjTFLm/x8HdUzmJ1F8Juau9UEZM/YNr4sAxxTGvBHJlq73VaDZfArxj9Anq/u6aImPbs1ksu28D6XC3A== +"@nomicfoundation/edr-darwin-arm64@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.1.tgz#210e6b5eaff9278814e8f19800182d1071554855" + integrity sha512-XuiUUnWAVNw7JYv7nRqDWfpBm21HOxCRBQ8lQnRnmiets9Ss2X5Ul9mvBheIPh/D0wBzwJ8TRtsSrorpwE79cA== -"@nomicfoundation/edr-linux-arm64-musl@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.1.tgz#726d57edee1adcd4844aaf31ec80063f1c44616b" - integrity sha512-wOqugcbugmbZkh58PcIC5naT0ilwkZ0/qH86AniENxsviOaPSrL4aMYhtfypQ3MNxlfrlgLZFCC+D5eJTsNsgQ== +"@nomicfoundation/edr-darwin-x64@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.1.tgz#81e660de77d1d73317c9a5140349d1197cddef9a" + integrity sha512-N1MfJqEX5ixaXlyyrHnaYxzwIT27Nc/jUgLI7ts4/9kRvPTvyZRYmXS1ciKhmUFr/WvFckTCix2RJbZoGGtX7g== -"@nomicfoundation/edr-linux-x64-gnu@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.1.tgz#d45ca451a30d429ed4ea97982879bf65842385f8" - integrity sha512-V+kyUVqbt52dQRgaZK+EWuPWJ5h/PsCYZmiK18A+DQynZvird7jrTsDppcTvlv1Dvny8UAAP0q/ue7G67OoLJQ== +"@nomicfoundation/edr-linux-arm64-gnu@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.1.tgz#6e1ce12080a35505c7f3eaf772f4e171db8b7f9a" + integrity sha512-bSPOfmcFjJwDgWOV5kgZHeqg2OWu1cINrHSGjig0aVHehjcoX4Sgayrj6fyAxcOV5NQKA6WcyTFll6NrCxzWRA== -"@nomicfoundation/edr-linux-x64-musl@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.1.tgz#ee1d01135654124c0f22ae0c3e7d62388a41e595" - integrity sha512-vwrzLW40jQBDZVYmoJUBMwl36i7muB9AfT4F2fMRsb1JoOMgoeOBp8R+IAxbA6mjIJGwAClkRz5W5hCb3zMtMQ== +"@nomicfoundation/edr-linux-arm64-musl@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.1.tgz#a467a6c8631053d10a8641f67618b9bdf057c636" + integrity sha512-F/+DgOdeBFQDrk+SX4aFffJFBgJfd75ZtE2mjcWNAh/qWiS7NfUxdQX/5OvNo/H6EY4a+3bZH6Bgzqg4mEWvMw== -"@nomicfoundation/edr-win32-arm64-msvc@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.1.tgz#e89c6e2c7a4458a6fd1de3ef3f57f915b771579e" - integrity sha512-7G29vUGrkwfbJqxo1V+QTxD976gVHx3Z0P5kwb1bErLmlP89cRNX3UN3/dzXpbKH9mp8ZcAjIcIbRUd4C+vH/A== +"@nomicfoundation/edr-linux-x64-gnu@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.1.tgz#63753d05767b4bc0d4f9f9be8399928c790c931e" + integrity sha512-POHhTWczIXCPhzKtY0Vt/l+VCqqCx5gNR5ErwSrNnLz/arfQobZFAU+nc61BX3Jch82TW8b3AbfGI73Kh7gO0w== -"@nomicfoundation/edr-win32-ia32-msvc@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.1.tgz#8f05be496c18eff37e3a95628ed8265a03824df0" - integrity sha512-Q39eAkk/j1ZlvHcxQRTAzdY9qlckDNfiuJDgLYTlxdubpmX6KZucuUin/1A5NVhhCToTxw7aFwSglUROY3ejJw== +"@nomicfoundation/edr-linux-x64-musl@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.1.tgz#44d128b9a09e3f61b08617213a58cd84dd15c418" + integrity sha512-uu8oNp4Ozg3H1x1We0FF+rwXfFiAvsOm5GQ+OBx9YYOXnfDPWqguQfGIkhrti9GD0iYhfQ/WOG5wvp0IzzgGSg== -"@nomicfoundation/edr-win32-x64-msvc@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.1.tgz#942c2b1490194d70d67c38b702a56e5603db19c7" - integrity sha512-8WzEzWUshw28xowVBhEyu4EQpx0TqNmDa70C3L1MWl5waym4U/VwbijFrI0Sb6Y1kdoNCdBTMvfr8OJNF2qJ/A== +"@nomicfoundation/edr-win32-x64-msvc@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.1.tgz#1667b725337ca6f27ec58c63337b6a62a0d7ed09" + integrity sha512-PaZHFw455z89ZiKYNTnKu+/TiVZVRI+mRJsbRTe2N0VlYfUBS1o2gdXBM12oP1t198HR7xQwEPPAslTFxGBqHA== -"@nomicfoundation/edr@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.1.tgz#2a7d4de8d70f63f872f9e86a8487f946cc3d2dcc" - integrity sha512-uPg1/CvIJpsCe7Ipe80bYnC/Q2Bt/O55KB2ssLx7Z0os4jwDvWBZas8tLMopT+hpOQnv8cZkHJap1iNDTwAfQg== - optionalDependencies: - "@nomicfoundation/edr-darwin-arm64" "0.3.1" - "@nomicfoundation/edr-darwin-x64" "0.3.1" - "@nomicfoundation/edr-linux-arm64-gnu" "0.3.1" - "@nomicfoundation/edr-linux-arm64-musl" "0.3.1" - "@nomicfoundation/edr-linux-x64-gnu" "0.3.1" - "@nomicfoundation/edr-linux-x64-musl" "0.3.1" - "@nomicfoundation/edr-win32-arm64-msvc" "0.3.1" - "@nomicfoundation/edr-win32-ia32-msvc" "0.3.1" - "@nomicfoundation/edr-win32-x64-msvc" "0.3.1" +"@nomicfoundation/edr@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.4.1.tgz#7d698454d228ffc5399f1c58799104b53e1b60ae" + integrity sha512-NgrMo2rI9r28uidumvd+K2/AJLdxtXsUlJr3hj/pM6S1FCd/HiWaLeLa/cjCVPcE2u1rYAa3W6UFxLCB7S5Dhw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.4.1" + "@nomicfoundation/edr-darwin-x64" "0.4.1" + "@nomicfoundation/edr-linux-arm64-gnu" "0.4.1" + "@nomicfoundation/edr-linux-arm64-musl" "0.4.1" + "@nomicfoundation/edr-linux-x64-gnu" "0.4.1" + "@nomicfoundation/edr-linux-x64-musl" "0.4.1" + "@nomicfoundation/edr-win32-x64-msvc" "0.4.1" "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" @@ -3336,6 +3324,11 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + commander@^9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" @@ -5825,14 +5818,14 @@ hardhat-gas-reporter@^1.0.4: eth-gas-reporter "^0.2.24" sha1 "^1.1.1" -hardhat@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.0.tgz#ccb03fbacc2a3c5902a70e0e4df4acd92ee533f0" - integrity sha512-t1J+ThxNYANL6ub6yM5XC84RY38vhfG7ODBtVRNQFQozdALo3qZUjxDzyGQU0U0eswe6orK49hq9UpdB7nPXNQ== +hardhat@^2.22.6: + version "2.22.6" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.6.tgz#d73caece246cd8219a1815554dabc31d400fa035" + integrity sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.3.0" + "@nomicfoundation/edr" "^0.4.1" "@nomicfoundation/ethereumjs-common" "4.0.4" "@nomicfoundation/ethereumjs-tx" "5.0.4" "@nomicfoundation/ethereumjs-util" "9.0.4" @@ -5866,7 +5859,7 @@ hardhat@^2.22.0: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" @@ -9535,18 +9528,16 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33"