Skip to content

Commit 59affc1

Browse files
authored
Feature: add arbitrum network (#44)
1 parent e215b72 commit 59affc1

7 files changed

Lines changed: 334 additions & 32 deletions

File tree

README.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@ That project requires [docker](https://docker.com) to be installed so the backen
88

99
### Configuration (Environment Variables)
1010

11-
> Supported Chains: 1, 11155111, 10, 11155420, 8453, 84532, 31337
12-
13-
| Variables | Default | Description |
14-
| :-------------------------: | :--------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
15-
| `CHAIN_IDS` | `11155111` | Comma separated supported chain ids to be indexed |
16-
| `RPC_URL_1` | `https://rpc.ankr.com/eth` | Endpoint for Mainnet RPC node |
17-
| `RPC_URL_11155111` | `https://rpc.ankr.com/eth_sepolia` | Endpoint for Sepolia RPC node |
18-
| `RPC_URL_31337` | `http://127.0.0.1:8545` | Endpoint for local node |
19-
| `RPC_URL_10` | `https://mainnet.optimism.io` | Endpoint for Optimism Mainnet RPC node |
20-
| `RPC_URL_11155420` | `https://sepolia.optimism.io` | Endpoint for Optimism Sepolia RPC node |
21-
| `RPC_URL_8453` | `https://mainnet.base.org` | Endpoint for Base Mainnet RPC node |
22-
| `RPC_URL_84532` | `https://sepolia.base.org` | Endpoint for Base Sepolia RPC node |
23-
| `RPC_RATE_LIMIT_{CHAIN_ID}` | `undefined` | Option to fine tune concurrent requests by rate limiting the requests to RPC node providers. Replace {CHAIN_ID} with a supported chain id and set a Number e.g. 15. That is good to avoid [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) status code when using free tiers. The default is Full speed |
11+
> Supported Chains: 1, 11155111, 10, 11155420, 8453, 84532, 42161, 421614, 31337
12+
13+
| Variables | Default | Description |
14+
| :-------------------------: | :--------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
15+
| `CHAIN_IDS` | `31337` | Comma separated supported chain ids to be indexed |
16+
| `RPC_URL_1` | `https://rpc.ankr.com/eth` | Endpoint for Mainnet RPC node |
17+
| `RPC_URL_11155111` | `https://rpc.ankr.com/eth_sepolia` | Endpoint for Sepolia RPC node |
18+
| `RPC_URL_31337` | `http://127.0.0.1:8545` | Endpoint for local node |
19+
| `RPC_URL_10` | `https://mainnet.optimism.io` | Endpoint for Optimism Mainnet RPC node |
20+
| `RPC_URL_11155420` | `https://sepolia.optimism.io` | Endpoint for Optimism Sepolia RPC node |
21+
| `RPC_URL_8453` | `https://mainnet.base.org` | Endpoint for Base Mainnet RPC node |
22+
| `RPC_URL_84532` | `https://sepolia.base.org` | Endpoint for Base Sepolia RPC node |
23+
| `RPC_URL_42161` | `https://arb1.arbitrum.io/rpc` | Endpoint for Arbitrum RPC node |
24+
| `RPC_URL_421614` | `https://sepolia-rollup.arbitrum.io/rpc` | Endpoint for Arbitrum Sepolia RPC node |
25+
| `RPC_RATE_LIMIT_{CHAIN_ID}` | `undefined` | Option to fine tune concurrent requests by rate limiting the requests to RPC node providers. Replace {CHAIN_ID} with a supported chain id and set a Number e.g. 15. That is good to avoid [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) status code when using free tiers. The default is Full speed |
2426

2527
For use with local devnet for fine tunning and deal with any unexpected changes e.g. Foundry nightly versions.
2628

src/config.ts

Lines changed: 70 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import CartesiDAppFactoryArbitrum from '@cartesi/rollups/deployments/arbitrum/CartesiDAppFactory.json';
2+
import InputBoxArbitrum from '@cartesi/rollups/deployments/arbitrum/InputBox.json';
3+
import CartesiDAppFactoryArbitrumSepolia from '@cartesi/rollups/deployments/arbitrum_sepolia/CartesiDAppFactory.json';
4+
import InputBoxArbitrumSepolia from '@cartesi/rollups/deployments/arbitrum_sepolia/InputBox.json';
15
import CartesiDAppFactoryBase from '@cartesi/rollups/deployments/base/CartesiDAppFactory.json';
26
import inputBoxBase from '@cartesi/rollups/deployments/base/InputBox.json';
37
import CartesiDAppFactoryBaseSepolia from '@cartesi/rollups/deployments/base_sepolia/CartesiDAppFactory.json';
@@ -10,24 +14,35 @@ import CartesiDAppFactoryOptimismSepolia from '@cartesi/rollups/deployments/opti
1014
import InputBoxOptimismSepolia from '@cartesi/rollups/deployments/optimism_sepolia/InputBox.json';
1115
import CartesiDAppFactorySepolia from '@cartesi/rollups/deployments/sepolia/CartesiDAppFactory.json';
1216
import InputBoxSepolia from '@cartesi/rollups/deployments/sepolia/InputBox.json';
13-
import mainnet from '@cartesi/rollups/export/abi/mainnet.json';
17+
import rollupsMainnet from '@cartesi/rollups/export/abi/mainnet.json';
1418
import { GatewaySettings, RpcEndpointSettings } from '@subsquid/evm-processor';
15-
import { base, baseSepolia, optimism, optimismSepolia } from 'viem/chains';
19+
import {
20+
arbitrum,
21+
arbitrumSepolia,
22+
base,
23+
baseSepolia,
24+
foundry,
25+
mainnet,
26+
optimism,
27+
optimismSepolia,
28+
sepolia,
29+
} from 'viem/chains';
1630
import { archiveNodes } from './gateways';
1731
import { parseIntOr } from './utils';
1832

1933
// addresses are the same on all chains
2034
export const CartesiDAppFactoryAddress =
21-
mainnet.contracts.CartesiDAppFactory.address.toLowerCase();
35+
rollupsMainnet.contracts.CartesiDAppFactory.address.toLowerCase();
2236
export const ERC20PortalAddress =
23-
mainnet.contracts.ERC20Portal.address.toLowerCase();
24-
export const InputBoxAddress = mainnet.contracts.InputBox.address.toLowerCase();
37+
rollupsMainnet.contracts.ERC20Portal.address.toLowerCase();
38+
export const InputBoxAddress =
39+
rollupsMainnet.contracts.InputBox.address.toLowerCase();
2540
export const ERC721PortalAddress =
26-
mainnet.contracts.ERC721Portal.address.toLowerCase();
41+
rollupsMainnet.contracts.ERC721Portal.address.toLowerCase();
2742
export const ERC1155SinglePortalAddress =
28-
mainnet.contracts.ERC1155SinglePortal.address.toLowerCase();
43+
rollupsMainnet.contracts.ERC1155SinglePortal.address.toLowerCase();
2944
export const ERC1155BatchPortalAddress =
30-
mainnet.contracts.ERC1155BatchPortal.address.toLowerCase();
45+
rollupsMainnet.contracts.ERC1155BatchPortal.address.toLowerCase();
3146
interface ArchiveDataSource {
3247
archive: string | GatewaySettings;
3348
rpcEndpoint?: string | RpcEndpointSettings;
@@ -59,7 +74,7 @@ export const getConfig = (chainId: number): ProcessorConfig => {
5974
const rateLimit = parsedRateLimit <= 0 ? undefined : parsedRateLimit;
6075

6176
switch (chainId) {
62-
case 1: // mainnet
77+
case mainnet.id:
6378
return {
6479
dataSource: {
6580
archive: archiveNodes.mainnet,
@@ -77,7 +92,7 @@ export const getConfig = (chainId: number): ProcessorConfig => {
7792
value: process.env[BLOCK_CONFIRMATIONS],
7893
}),
7994
};
80-
case 11155111: // sepolia
95+
case sepolia.id:
8196
return {
8297
dataSource: {
8398
archive: archiveNodes.sepolia,
@@ -97,7 +112,7 @@ export const getConfig = (chainId: number): ProcessorConfig => {
97112
value: process.env[BLOCK_CONFIRMATIONS],
98113
}),
99114
};
100-
case 10: //Optimism-Mainnet
115+
case optimism.id:
101116
return {
102117
dataSource: {
103118
archive: archiveNodes.optimism,
@@ -117,7 +132,7 @@ export const getConfig = (chainId: number): ProcessorConfig => {
117132
value: process.env[BLOCK_CONFIRMATIONS],
118133
}),
119134
};
120-
case 11155420: //Optimism-Sepolia
135+
case optimismSepolia.id: //Optimism-Sepolia
121136
return {
122137
dataSource: {
123138
archive: archiveNodes.optimismSepolia,
@@ -137,7 +152,7 @@ export const getConfig = (chainId: number): ProcessorConfig => {
137152
value: process.env[BLOCK_CONFIRMATIONS],
138153
}),
139154
};
140-
case 8453: //Base-Mainnet
155+
case base.id:
141156
return {
142157
dataSource: {
143158
archive: archiveNodes.base,
@@ -157,7 +172,7 @@ export const getConfig = (chainId: number): ProcessorConfig => {
157172
value: process.env[BLOCK_CONFIRMATIONS],
158173
}),
159174
};
160-
case 84532: //Base-Sepolia
175+
case baseSepolia.id:
161176
return {
162177
dataSource: {
163178
archive: archiveNodes.baseSepolia,
@@ -177,7 +192,47 @@ export const getConfig = (chainId: number): ProcessorConfig => {
177192
value: process.env[BLOCK_CONFIRMATIONS],
178193
}),
179194
};
180-
case 31337: // anvil
195+
case arbitrum.id:
196+
return {
197+
dataSource: {
198+
archive: archiveNodes.arbitrum,
199+
rpcEndpoint: {
200+
url:
201+
process.env[RPC_URL] ??
202+
arbitrum.rpcUrls.default.http[0],
203+
rateLimit: rateLimit,
204+
},
205+
},
206+
from: Math.min(
207+
CartesiDAppFactoryArbitrum.receipt.blockNumber,
208+
InputBoxArbitrum.receipt.blockNumber,
209+
),
210+
finalityConfirmation: parseIntOr({
211+
defaultVal: FINALITY_CONFIRMATION,
212+
value: process.env[BLOCK_CONFIRMATIONS],
213+
}),
214+
};
215+
case arbitrumSepolia.id:
216+
return {
217+
dataSource: {
218+
archive: archiveNodes.arbitrumSepolia,
219+
rpcEndpoint: {
220+
url:
221+
process.env[RPC_URL] ??
222+
arbitrumSepolia.rpcUrls.default.http[0],
223+
rateLimit: rateLimit,
224+
},
225+
},
226+
from: Math.min(
227+
CartesiDAppFactoryArbitrumSepolia.receipt.blockNumber,
228+
InputBoxArbitrumSepolia.receipt.blockNumber,
229+
),
230+
finalityConfirmation: parseIntOr({
231+
defaultVal: FINALITY_CONFIRMATION,
232+
value: process.env[BLOCK_CONFIRMATIONS],
233+
}),
234+
};
235+
case foundry.id:
181236
return {
182237
dataSource: {
183238
rpcEndpoint:

src/gateways.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ export const archiveNodes = {
1212
optimismSepolia: 'https://v2.archive.subsquid.io/network/optimism-sepolia',
1313
mainnet: 'https://v2.archive.subsquid.io/network/ethereum-mainnet',
1414
sepolia: 'https://v2.archive.subsquid.io/network/ethereum-sepolia',
15+
arbitrum: 'https://v2.archive.subsquid.io/network/arbitrum-one',
16+
arbitrumSepolia: 'https://v2.archive.subsquid.io/network/arbitrum-sepolia',
1517
} as const;

src/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { existsSync, readFileSync } from 'node:fs';
22
import {
3+
arbitrum,
4+
arbitrumSepolia,
35
base,
46
baseSepolia,
57
foundry,
@@ -37,6 +39,8 @@ export const supportedChains = new Set<number>([
3739
baseSepolia.id,
3840
optimism.id,
3941
optimismSepolia.id,
42+
arbitrum.id,
43+
arbitrumSepolia.id,
4044
]);
4145

4246
/**

tests/gateways.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ describe('Gateways (Squid Archive Nodes)', () => {
1010
'optimismSepolia',
1111
'mainnet',
1212
'sepolia',
13+
'arbitrum',
14+
'arbitrumSepolia',
1315
]);
1416
});
1517

@@ -33,5 +35,13 @@ describe('Gateways (Squid Archive Nodes)', () => {
3335
expect(archiveNodes.sepolia).toStrictEqual(
3436
'https://v2.archive.subsquid.io/network/ethereum-sepolia',
3537
);
38+
39+
expect(archiveNodes.arbitrum).toStrictEqual(
40+
'https://v2.archive.subsquid.io/network/arbitrum-one',
41+
);
42+
43+
expect(archiveNodes.arbitrumSepolia).toStrictEqual(
44+
'https://v2.archive.subsquid.io/network/arbitrum-sepolia',
45+
);
3646
});
3747
});

0 commit comments

Comments
 (0)