From 5292032a92e351326aabf74a42a2afbc7db4a46a Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Wed, 4 Jun 2025 18:39:01 +1200 Subject: [PATCH 1/2] chore: bump cartesi-rollup to v2.0.0 * Enable mainnet ids in the codegen file. * Update cannon package reference. --- codegen.mjs | 20 +++++--------------- package-lock.json | 8 ++++---- package.json | 8 ++++---- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/codegen.mjs b/codegen.mjs index cd00b27..4ee7fe7 100644 --- a/codegen.mjs +++ b/codegen.mjs @@ -13,7 +13,6 @@ import { sepolia, } from 'viem/chains'; -//TODO: Not available yet on cannon. const supportedMainnets = [arbitrum.id, base.id, mainnet.id, optimism.id]; const supportedTestnets = [ arbitrumSepolia.id, @@ -22,8 +21,8 @@ const supportedTestnets = [ optimismSepolia.id, sepolia.id, ]; -//TODO: evaluate to be a env-var. But it needs to sync with npm-deps. -const packageRef = 'cartesi-rollups:2.0.0-rc.17'; + +const packageRef = 'cartesi-rollups:2.0.0'; const abiFolder = join(process.cwd(), 'abi'); const outFolder = join(process.cwd(), 'src', 'deployments'); const codegenMetaFileName = '__meta.json'; @@ -154,11 +153,6 @@ const readABIFor = async (list) => { return contracts; }; -/** - * - * @param {string} chainId - * @returns {void} - */ async function codegen(chainId) { const { ok } = await execCannonInspect({ packageRef, @@ -198,7 +192,7 @@ async function generateABIFiles(chainId) { } async function run() { - const networks = [...supportedTestnets]; + const networks = [...supportedMainnets, ...supportedTestnets]; const codegenPromises = networks.map((chainId) => { console.log(`Codegen for chain-id: ${chainId.toString()}`); return codegen(chainId.toString()); @@ -214,15 +208,11 @@ async function run() { codegenResult.forEach((data, i) => { if (data.status === 'fulfilled') console.info( - `Rollups contracts for chain-id ${supportedTestnets[ - i - ].toString()} generated at ${outFolder}`, + `Rollups contracts for chain-id ${networks[i].toString()} generated at ${outFolder}`, ); else console.error( - `Rollups contracts for chain-id ${supportedTestnets[ - i - ].toString()} failed to be created. Reason: ${data.reason}`, + `Rollups contracts for chain-id ${networks[i].toString()} failed to be created. Reason: ${data.reason}`, ); }); } diff --git a/package-lock.json b/package-lock.json index 231e2f2..4fe7dd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@cartesi/rollups": "1.4.0", - "@cartesi/rollups-v2": "npm:@cartesi/rollups@2.0.0-rc.17", + "@cartesi/rollups-v2": "npm:@cartesi/rollups@2.0.0", "@subsquid/evm-abi": "^0.3.1", "@subsquid/evm-codec": "^0.3.0", "@subsquid/evm-processor": "^1.4.0", @@ -301,9 +301,9 @@ }, "node_modules/@cartesi/rollups-v2": { "name": "@cartesi/rollups", - "version": "2.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@cartesi/rollups/-/rollups-2.0.0-rc.17.tgz", - "integrity": "sha512-W3yCVyRsbgv8t4qwSogKNT8Zy4bcdDxTIuK4rDNPKFvuDuppSQbZfKaaG2fx0NJGfbmm2c7M/t+on8aB+IN9mg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@cartesi/rollups/-/rollups-2.0.0.tgz", + "integrity": "sha512-41Dtq73wD5JTepuryUiXumjMNx/e5AlOROKlao4/A0rG34R8emblnTGwvMaMpzKd+USDk2M/aLtIPZ6tnDXD/g==", "license": "Apache-2.0" }, "node_modules/@cartesi/util": { diff --git a/package.json b/package.json index b118ea2..875b32e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "run-s clean sqd:typegen sqd:codegen tsc", "clean": "rm -rf lib", "test": "vitest", - "ci:test": "vitest run --coverage", + "ci:test": "vitest run --coverage", "sqd": "sqd", "sqd:build": "sqd build", "sqd:codegen": "sqd codegen", @@ -29,11 +29,11 @@ "process:prod": "node deploy/run --npmScriptName=sqd:process:prod", "serve:prod": "node deploy/run --npmScriptName=sqd:graphql:prod", "tsc": "tsc", - "cannon": "cannon" + "cannon": "cannon" }, "dependencies": { "@cartesi/rollups": "1.4.0", - "@cartesi/rollups-v2": "npm:@cartesi/rollups@2.0.0-rc.17", + "@cartesi/rollups-v2": "npm:@cartesi/rollups@2.0.0", "@subsquid/evm-abi": "^0.3.1", "@subsquid/evm-codec": "^0.3.0", "@subsquid/evm-processor": "^1.4.0", @@ -65,4 +65,4 @@ "typescript": "^5", "vitest": "^2" } -} +} \ No newline at end of file From fa7dffe103a1954d78c810300043fcffd498e603 Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Wed, 4 Jun 2025 18:42:41 +1200 Subject: [PATCH 2/2] feat: Add mainnet configs for v2. * Include v2 from information for all mainnets. * Upgrade test cases. * Update stubs information. All contract's address handled changed. --- .gitignore | 1 + src/config.ts | 89 ++++++++++++++++++++--------------- src/utils.ts | 21 +++++++++ tests/processor.test.ts | 102 ++++++++++++++++++++++++++++++++++------ tests/stubs/params.ts | 4 +- 5 files changed, 163 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index 449c3c2..2aa70af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # squid /lib +/preloaders/lib /builds /**Versions.json diff --git a/src/config.ts b/src/config.ts index e78d741..a84c448 100644 --- a/src/config.ts +++ b/src/config.ts @@ -34,8 +34,12 @@ import { contracts as OptSepoliaContracts } from './deployments/11155420/contrac import { contracts as CannonContracts } from './deployments/13370/contracts.json'; import { contracts as ArbSepoliaContracts } from './deployments/421614/contracts.json'; import { contracts as BaseSepoliaContracts } from './deployments/84532/contracts.json'; +import { contracts as MainnetContracts } from './deployments/1/contracts.json'; +import { contracts as OptimismContracts } from './deployments/10/contracts.json'; +import { contracts as BaseContracts } from './deployments/8453/contracts.json'; +import { contracts as ArbitrumContracts } from './deployments/42161/contracts.json'; import { archiveNodes } from './gateways'; -import { parseIntOr } from './utils'; +import { parseIntOr, smallerOf } from './utils'; // addresses from deployment/13370. (Probably) the addresses will be the same on all chains type RollupContractName = keyof typeof CannonContracts; @@ -120,6 +124,13 @@ export const getConfig = (chainId: number): ProcessorConfig => { defaultVal: FINALITY_CONFIRMATION, value: process.env[BLOCK_CONFIRMATIONS], }), + v2: { + from: smallerOf([ + MainnetContracts.ApplicationFactory + .deployTxnBlockNumber, + MainnetContracts.InputBox.deployTxnBlockNumber, + ]), + }, }; case sepolia.id: return { @@ -141,15 +152,11 @@ export const getConfig = (chainId: number): ProcessorConfig => { value: process.env[BLOCK_CONFIRMATIONS], }), v2: { - from: Math.min( - parseInt( - SepoliaContracts.ApplicationFactory - .deployTxnBlockNumber, - ), - parseInt( - SepoliaContracts.InputBox.deployTxnBlockNumber, - ), - ), + from: smallerOf([ + SepoliaContracts.ApplicationFactory + .deployTxnBlockNumber, + SepoliaContracts.InputBox.deployTxnBlockNumber, + ]), }, }; case optimism.id: @@ -171,6 +178,13 @@ export const getConfig = (chainId: number): ProcessorConfig => { defaultVal: FINALITY_CONFIRMATION, value: process.env[BLOCK_CONFIRMATIONS], }), + v2: { + from: smallerOf([ + OptimismContracts.ApplicationFactory + .deployTxnBlockNumber, + OptimismContracts.InputBox.deployTxnBlockNumber, + ]), + }, }; case optimismSepolia.id: //Optimism-Sepolia return { @@ -192,15 +206,11 @@ export const getConfig = (chainId: number): ProcessorConfig => { value: process.env[BLOCK_CONFIRMATIONS], }), v2: { - from: Math.min( - parseInt( - OptSepoliaContracts.ApplicationFactory - .deployTxnBlockNumber, - ), - parseInt( - OptSepoliaContracts.InputBox.deployTxnBlockNumber, - ), - ), + from: smallerOf([ + OptSepoliaContracts.ApplicationFactory + .deployTxnBlockNumber, + OptSepoliaContracts.InputBox.deployTxnBlockNumber, + ]), }, }; case base.id: @@ -222,6 +232,12 @@ export const getConfig = (chainId: number): ProcessorConfig => { defaultVal: FINALITY_CONFIRMATION, value: process.env[BLOCK_CONFIRMATIONS], }), + v2: { + from: smallerOf([ + BaseContracts.ApplicationFactory.deployTxnBlockNumber, + BaseContracts.InputBox.deployTxnBlockNumber, + ]), + }, }; case baseSepolia.id: return { @@ -243,15 +259,11 @@ export const getConfig = (chainId: number): ProcessorConfig => { value: process.env[BLOCK_CONFIRMATIONS], }), v2: { - from: Math.min( - parseInt( - BaseSepoliaContracts.ApplicationFactory - .deployTxnBlockNumber, - ), - parseInt( - BaseSepoliaContracts.InputBox.deployTxnBlockNumber, - ), - ), + from: smallerOf([ + BaseSepoliaContracts.ApplicationFactory + .deployTxnBlockNumber, + BaseSepoliaContracts.InputBox.deployTxnBlockNumber, + ]), }, }; case arbitrum.id: @@ -273,6 +285,13 @@ export const getConfig = (chainId: number): ProcessorConfig => { defaultVal: FINALITY_CONFIRMATION, value: process.env[BLOCK_CONFIRMATIONS], }), + v2: { + from: smallerOf([ + ArbitrumContracts.ApplicationFactory + .deployTxnBlockNumber, + ArbitrumContracts.InputBox.deployTxnBlockNumber, + ]), + }, }; case arbitrumSepolia.id: return { @@ -294,15 +313,11 @@ export const getConfig = (chainId: number): ProcessorConfig => { value: process.env[BLOCK_CONFIRMATIONS], }), v2: { - from: Math.min( - parseInt( - ArbSepoliaContracts.ApplicationFactory - .deployTxnBlockNumber, - ), - parseInt( - ArbSepoliaContracts.InputBox.deployTxnBlockNumber, - ), - ), + from: smallerOf([ + ArbSepoliaContracts.ApplicationFactory + .deployTxnBlockNumber, + ArbSepoliaContracts.InputBox.deployTxnBlockNumber, + ]), }, }; case cannon.id: diff --git a/src/utils.ts b/src/utils.ts index 5444706..af64278 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -82,6 +82,27 @@ export function parseIntOr({ value, defaultVal }: ParseIntOr) { return Number.isNaN(number) ? defaultVal : number; } +/** + * @description Receive a list of parseable strings and return the smallest one as a number. + * + * If list is null/undefined/empty 0 is returned. + * @param {string[]} list + * @returns {number} + */ +export function smallerOf(list: string[]): number { + if (!list || list.length === 0) return 0; + const copied = [...list]; + + const initialValue = parseIntOr({ + value: copied.shift(), + defaultVal: Number.MAX_SAFE_INTEGER, + }); + + return copied.reduce((curr, next) => { + return Math.min(curr, parseIntOr({ value: next, defaultVal: curr })); + }, initialValue); +} + /** * Utility to generate standard format IDs based on array of values. * That makes the id creation between entities less error prone. diff --git a/tests/processor.test.ts b/tests/processor.test.ts index c963792..3a930ea 100644 --- a/tests/processor.test.ts +++ b/tests/processor.test.ts @@ -81,7 +81,7 @@ describe('Processor creation', () => { const addLog = processor.addLog as unknown as MockInstance; - expect(addLog).toHaveBeenCalledTimes(3); + expect(addLog).toHaveBeenCalledTimes(5); expect(addLog.mock.calls[0][0]).toEqual({ address: ['0x7122cd1221c20892234186facfe8615e6743ab02'], topic0: [ @@ -97,6 +97,25 @@ describe('Processor creation', () => { }); expect(addLog.mock.calls[2][0]).toEqual({ + address: ['0xc7006f70875bade89032001262a846d3ee160051'], + range: { + from: 30910822, + }, + topic0: [ + '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', + ], + }); + + expect(addLog.mock.calls[3][0]).toEqual({ + address: ['0xc70074bdd26d8cf983ca6a5b89b8db52d5850051'], + range: { from: 30910822 }, + topic0: [ + '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', + ], + transaction: true, + }); + + expect(addLog.mock.calls[4][0]).toEqual({ topic0: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', ], @@ -147,16 +166,16 @@ describe('Processor creation', () => { }); expect(addLog.mock.calls[2][0]).toEqual({ - address: ['0x2210ad1d9b0bd2d470c2bfa4814ab6253bc421a0'], - range: { from: 24309671 }, + address: ['0xc7006f70875bade89032001262a846d3ee160051'], + range: { from: 26421182 }, topic0: [ '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', ], }); expect(addLog.mock.calls[3][0]).toEqual({ - address: ['0xb6b39fb3dd926a9e3fbc7a129540eebea3016a6c'], - range: { from: 24309671 }, + address: ['0xc70074bdd26d8cf983ca6a5b89b8db52d5850051'], + range: { from: 26421182 }, topic0: [ '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', ], @@ -218,7 +237,7 @@ describe('Processor creation', () => { topic0: [ '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', ], - range: { from: 8098286 }, + range: { from: 8439338 }, }); expect(addLog.mock.calls[3][0]).toEqual({ @@ -226,7 +245,7 @@ describe('Processor creation', () => { topic0: [ '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', ], - range: { from: 8098286 }, + range: { from: 8439338 }, transaction: true, }); @@ -405,7 +424,7 @@ describe('Processor creation', () => { const addLog = processor.addLog as unknown as MockInstance; - expect(addLog).toHaveBeenCalledTimes(3); + expect(addLog).toHaveBeenCalledTimes(5); expect(addLog.mock.calls[0][0]).toEqual({ address: ['0x7122cd1221c20892234186facfe8615e6743ab02'], topic0: [ @@ -421,6 +440,25 @@ describe('Processor creation', () => { }); expect(addLog.mock.calls[2][0]).toEqual({ + address: [RollupsAddressBook.v2.ApplicationFactory], + range: { + from: 136506143, + }, + topic0: [ + '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', + ], + }); + + expect(addLog.mock.calls[3][0]).toEqual({ + address: [RollupsAddressBook.v2.InputBox], + range: { from: 136506143 }, + topic0: [ + '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', + ], + transaction: true, + }); + + expect(addLog.mock.calls[4][0]).toEqual({ topic0: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', ], @@ -471,7 +509,7 @@ describe('Processor creation', () => { expect(addLog.mock.calls[2][0]).toEqual({ address: [RollupsAddressBook.v2.ApplicationFactory], - range: { from: 26292719 }, + range: { from: 28404083 }, topic0: [ '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', ], @@ -479,7 +517,7 @@ describe('Processor creation', () => { expect(addLog.mock.calls[3][0]).toEqual({ address: [RollupsAddressBook.v2.InputBox], - range: { from: 26292719 }, + range: { from: 28404083 }, topic0: [ '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', ], @@ -520,7 +558,7 @@ describe('Processor creation', () => { const addLog = processor.addLog as unknown as MockInstance; - expect(addLog).toHaveBeenCalledTimes(3); + expect(addLog).toHaveBeenCalledTimes(5); expect(addLog.mock.calls[0][0]).toEqual({ address: ['0x7122cd1221c20892234186facfe8615e6743ab02'], topic0: [ @@ -536,6 +574,23 @@ describe('Processor creation', () => { }); expect(addLog.mock.calls[2][0]).toEqual({ + address: [RollupsAddressBook.v2.ApplicationFactory], + range: { from: 342110860 }, + topic0: [ + '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', + ], + }); + + expect(addLog.mock.calls[3][0]).toEqual({ + address: [RollupsAddressBook.v2.InputBox], + range: { from: 342110860 }, + topic0: [ + '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', + ], + transaction: true, + }); + + expect(addLog.mock.calls[4][0]).toEqual({ topic0: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', ], @@ -586,7 +641,7 @@ describe('Processor creation', () => { expect(addLog.mock.calls[2][0]).toEqual({ address: [RollupsAddressBook.v2.ApplicationFactory], - range: { from: 141579041 }, + range: { from: 158367139 }, topic0: [ '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', ], @@ -594,7 +649,7 @@ describe('Processor creation', () => { expect(addLog.mock.calls[3][0]).toEqual({ address: [RollupsAddressBook.v2.InputBox], - range: { from: 141579041 }, + range: { from: 158367139 }, topic0: [ '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', ], @@ -636,7 +691,7 @@ describe('Processor creation', () => { const addLog = processor.addLog as unknown as MockInstance; - expect(addLog).toHaveBeenCalledTimes(4); + expect(addLog).toHaveBeenCalledTimes(6); expect(addLog.mock.calls[0][0]).toEqual({ address: ['0x7122cd1221c20892234186facfe8615e6743ab02'], topic0: [ @@ -652,6 +707,23 @@ describe('Processor creation', () => { }); expect(addLog.mock.calls[2][0]).toEqual({ + address: [RollupsAddressBook.v2.ApplicationFactory], + range: { from: 22595774 }, + topic0: [ + '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', + ], + }); + + expect(addLog.mock.calls[3][0]).toEqual({ + address: [RollupsAddressBook.v2.InputBox], + range: { from: 22595774 }, + topic0: [ + '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98', + ], + transaction: true, + }); + + expect(addLog.mock.calls[4][0]).toEqual({ address: applicationMetadata?.addresses[CartesiDAppFactoryAddress], topic0: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', @@ -663,7 +735,7 @@ describe('Processor creation', () => { transaction: true, }); - expect(addLog.mock.calls[3][0]).toEqual({ + expect(addLog.mock.calls[5][0]).toEqual({ topic0: [ '0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0', ], diff --git a/tests/stubs/params.ts b/tests/stubs/params.ts index 6d4e752..0aecb8b 100644 --- a/tests/stubs/params.ts +++ b/tests/stubs/params.ts @@ -83,7 +83,7 @@ export const logApplicationCreatedV2: Log = { id: '0006859373-c8732-000014', logIndex: 14, transactionIndex: 10, - address: '0x2210ad1d9b0bd2d470c2bfa4814ab6253bc421a0', + address: RollupsAddressBook.v2.ApplicationFactory, topics: [ '0xd291ffe9436f2c57d5ce3e87ed33576f801053946651a2fb4fec5a406cf68cc5', encodeAbiParameters([{ type: 'address' }], [dappAddress]), @@ -119,7 +119,7 @@ export const logInputAddedV2: Log = { id: '0006859416-fd6ca-000028', logIndex: 28, transactionIndex: 15, - address: '0xb6b39fb3dd926a9e3fbc7a129540eebea3016a6c', + address: RollupsAddressBook.v2.InputBox, data: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000144415bf3630000000000000000000000000000000000000000000000000000000000aa36a7000000000000000000000000fb92024ec789bb2fbbc5cd1390386843c5fb7694000000000000000000000000590f92fea8df163fff2d7df266364de7ce8f9e16000000000000000000000000000000000000000000000000000000000068aa98000000000000000000000000000000000000000000000000000000006709c980094a6affe3aa787280fbdf0a19cdb161b26afdd58fd2672c4615c07ced7f351d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002bb1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', topics: [ '0xc05d337121a6e8605c6ec0b72aa29c4210ffe6e5b9cefdd6a7058188a8f66f98',