From cbffd494e0f6ec4a583d884477bbe3d23fb60de8 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Wed, 20 Aug 2025 13:45:56 +0700 Subject: [PATCH 1/2] update config network chain --- .env.example | 8 ++- packages/indexer-monitor/scripts/index.ts | 60 ----------------------- packages/shared/src/blockchain/alchemy.ts | 44 ++++++----------- packages/shared/src/blockchain/client.ts | 26 ++++++++++ packages/shared/src/blockchain/network.ts | 39 ++++----------- packages/shared/src/blockchain/wallet.ts | 21 +++++--- packages/shared/src/config/index.ts | 20 +++----- packages/shared/src/config/validator.ts | 43 ++++++++++++++++ packages/shared/src/types/blockchain.ts | 2 + 9 files changed, 124 insertions(+), 139 deletions(-) delete mode 100644 packages/indexer-monitor/scripts/index.ts create mode 100644 packages/shared/src/blockchain/client.ts create mode 100644 packages/shared/src/config/validator.ts diff --git a/.env.example b/.env.example index 8e98462..80c7efe 100644 --- a/.env.example +++ b/.env.example @@ -37,7 +37,13 @@ NETWORK_TYPE=ethereum NETWORK_ENVIRONMENT=sepolia # blockchain -ALCHEMY_API_KEY=dummy +L1_CHAIN=sepolia +L2_CHAIN=scrollSepolia +L1_RPC_URLS= +L2_RPC_URLS= +ALCHEMY_API_KEY= +ALCHEMY_L1_NETWORK=eth-sepolia +ALCHEMY_L2_NETWORK=scroll-sepolia TRANSACTION_WAIT_TRANSACTION_TIMEOUT=30000 TRANSACTION_INCREMENT_RATE=0.3 diff --git a/packages/indexer-monitor/scripts/index.ts b/packages/indexer-monitor/scripts/index.ts deleted file mode 100644 index 24e05ab..0000000 --- a/packages/indexer-monitor/scripts/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - BlockBuilderRegistryAbi, - BUILDER_REGISTRY_CONTRACT_ADDRESS, - config, - createNetworkClient, - getEthersMaxGasMultiplier, - getNonce, - networkConfig, -} from "@intmax2-function/shared"; -import { createWalletClient as createWalletViemClient, http } from "viem"; -import { privateKeyToAccount } from "viem/accounts"; - -const PRIVATE_KEY = `0x`; -const BLOCK_BUILDER_URL = "https://xxx.com"; - -const createWalletClient = (network: "mainnet" | "scroll") => { - const account = privateKeyToAccount(PRIVATE_KEY); - const { chain, rpcUrl } = networkConfig[network][config.NETWORK_ENVIRONMENT]; - - const client = createWalletViemClient({ - account, - chain, - transport: http(rpcUrl), - }); - - return { - account, - walletClient: client, - }; -}; - -const emitHeartbeat = async () => { - const ethereumClient = createNetworkClient("scroll"); - const walletClient = createWalletClient("scroll"); - - const [{ currentNonce }, _] = await Promise.all([ - getNonce(ethereumClient, walletClient.account.address), - getEthersMaxGasMultiplier(ethereumClient, 3), - ]); - - console.log( - `Balance: ${await ethereumClient.getBalance({ address: walletClient.account.address })}`, - ); - - const { request } = await ethereumClient.simulateContract({ - address: BUILDER_REGISTRY_CONTRACT_ADDRESS, - abi: BlockBuilderRegistryAbi, - functionName: "emitHeartbeat", - account: walletClient.account, - args: [BLOCK_BUILDER_URL], - nonce: currentNonce, - }); - const transactionHash = await walletClient.walletClient.writeContract(request); - console.log(`Transaction hash: ${transactionHash}`); -}; - -const main = async () => { - await emitHeartbeat(); -}; -main(); diff --git a/packages/shared/src/blockchain/alchemy.ts b/packages/shared/src/blockchain/alchemy.ts index cc4a004..009e464 100644 --- a/packages/shared/src/blockchain/alchemy.ts +++ b/packages/shared/src/blockchain/alchemy.ts @@ -1,46 +1,34 @@ import { Alchemy as AlchemyInstance, Network } from "alchemy-sdk"; import { config } from "../config"; import { logger } from "../lib"; +import type { NetworkLayer } from "../types"; export class Alchemy { - private static instance: Alchemy | null = null; + private static instance: Alchemy | undefined; private alchemy: AlchemyInstance; - private networkKey = `${config.NETWORK_TYPE}-${config.NETWORK_ENVIRONMENT}`; - private constructor(apiKey = config.ALCHEMY_API_KEY) { - logger.debug(`Attempting to get alchemy network for: "${this.networkKey}"`); + public static getInstance(networkLayer: NetworkLayer) { + if (!this.instance) { + this.instance = new Alchemy(networkLayer); + } + return this.instance; + } + + constructor(networkLayer: NetworkLayer) { + logger.debug(`Attempting to get alchemy network for: "${networkLayer}"`); + const network = + networkLayer === "l1" + ? Network[config.ALCHEMY_L1_NETWORK as keyof typeof Network] + : Network[config.ALCHEMY_L2_NETWORK as keyof typeof Network]; - const network = this.getNetwork(); const settings = { - apiKey: apiKey, + apiKey: config.ALCHEMY_API_KEY, network, maxRetries: 5, }; this.alchemy = new AlchemyInstance({ ...settings }); } - static getInstance(apiKey?: string): Alchemy { - if (!Alchemy.instance) { - Alchemy.instance = new Alchemy(apiKey); - } - return Alchemy.instance; - } - - private getNetwork = () => { - switch (this.networkKey) { - case "ethereum-mainnet": - return Network.ETH_MAINNET; - case "ethereum-sepolia": - return Network.ETH_SEPOLIA; - case "scroll-mainnet": - return Network.SCROLL_MAINNET; - case "scroll-sepolia": - return Network.SCROLL_SEPOLIA; - default: - throw new Error(`Unsupported network: ${this.networkKey}. Please check the configuration.`); - } - }; - async getBlock(blockNumber: bigint) { const blockHashOrBlockTag = `0x${Number(blockNumber).toString(16)}`; return this.alchemy.core.getBlock(blockHashOrBlockTag); diff --git a/packages/shared/src/blockchain/client.ts b/packages/shared/src/blockchain/client.ts new file mode 100644 index 0000000..22a0373 --- /dev/null +++ b/packages/shared/src/blockchain/client.ts @@ -0,0 +1,26 @@ +import { type Chain, http } from "viem"; +import * as chains from "viem/chains"; +import { config } from "../config"; +import type { NetworkLayer } from "../types"; + +const l1Rpcs = config.L1_RPC_URLS.map((rpc) => http(rpc)); +const l2Rpcs = config.L2_RPC_URLS.map((rpc) => http(rpc)); + +type ClientConfig = { + chain: Chain; + rpcUrls: typeof l1Rpcs | typeof l2Rpcs; +}; + +export const getClientConfig = (networkLayer: NetworkLayer): ClientConfig => { + if (networkLayer === "l1") { + return { + chain: chains[config.L1_CHAIN as keyof typeof chains], + rpcUrls: l1Rpcs, + }; + } + + return { + chain: chains[config.L2_CHAIN as keyof typeof chains], + rpcUrls: l2Rpcs, + }; +}; diff --git a/packages/shared/src/blockchain/network.ts b/packages/shared/src/blockchain/network.ts index 4a88ff3..e661b9b 100644 --- a/packages/shared/src/blockchain/network.ts +++ b/packages/shared/src/blockchain/network.ts @@ -1,38 +1,17 @@ -import { type Chain, createPublicClient, http, type PublicClient } from "viem"; -import { mainnet, scroll, scrollSepolia, sepolia } from "viem/chains"; -import { config } from "../config"; +import { createPublicClient, fallback, type PublicClient } from "viem"; +import type { NetworkLayer } from "../types"; +import { getClientConfig } from "./client"; -export const networkConfig = { - ethereum: { - mainnet: { - chain: mainnet, - rpcUrl: `https://eth-mainnet.alchemyapi.io/v2/${config.ALCHEMY_API_KEY}`, - }, - sepolia: { - chain: sepolia, - rpcUrl: `https://eth-sepolia.g.alchemy.com/v2/${config.ALCHEMY_API_KEY}`, - }, - }, - scroll: { - mainnet: { - chain: scroll, - rpcUrl: `https://scroll-mainnet.g.alchemy.com/v2/${config.ALCHEMY_API_KEY}`, - }, - sepolia: { - chain: scrollSepolia, - rpcUrl: `https://scroll-sepolia.g.alchemy.com/v2/${config.ALCHEMY_API_KEY}`, - }, - }, -}; - -export const createNetworkClient = (network: "ethereum" | "scroll") => { - const { chain, rpcUrl } = networkConfig[network][config.NETWORK_ENVIRONMENT]; +export const createNetworkClient = (networkLayer: NetworkLayer) => { + const { chain, rpcUrls } = getClientConfig(networkLayer); return createPublicClient({ batch: { multicall: true, }, - chain: chain as Chain, - transport: http(rpcUrl), + chain, + transport: fallback(rpcUrls, { + retryCount: 3, + }), }) as PublicClient; }; diff --git a/packages/shared/src/blockchain/wallet.ts b/packages/shared/src/blockchain/wallet.ts index c210e4b..149c2d5 100644 --- a/packages/shared/src/blockchain/wallet.ts +++ b/packages/shared/src/blockchain/wallet.ts @@ -1,7 +1,8 @@ -import { createWalletClient, http } from "viem"; +import { createWalletClient, fallback } from "viem"; import { mnemonicToAccount, privateKeyToAccount } from "viem/accounts"; import { config } from "../config"; -import { networkConfig } from "./network"; +import type { NetworkLayer } from "./../types/blockchain"; +import { getClientConfig } from "./client"; type MockWalletType = "mockMessenger"; @@ -26,7 +27,7 @@ const walletConfigs: Record = { export const getMockWalletClient = ( type: MockWalletType, - network: "ethereum" | "scroll", + networkLayer: NetworkLayer, ): { account: ReturnType; walletClient: ReturnType; @@ -34,12 +35,14 @@ export const getMockWalletClient = ( const privateKey = mockWalletConfigs[type]; const account = privateKeyToAccount(privateKey); - const { chain, rpcUrl } = networkConfig[network][config.NETWORK_ENVIRONMENT]; + const { chain, rpcUrls } = getClientConfig(networkLayer); const client = createWalletClient({ account, chain, - transport: http(rpcUrl), + transport: fallback(rpcUrls, { + retryCount: 3, + }), }); return { @@ -50,7 +53,7 @@ export const getMockWalletClient = ( export const getWalletClient = ( type: WalletType, - network: "ethereum" | "scroll", + networkLayer: NetworkLayer, ): { account: ReturnType; walletClient: ReturnType; @@ -64,12 +67,14 @@ export const getWalletClient = ( addressIndex, }); - const { chain, rpcUrl } = networkConfig[network][config.NETWORK_ENVIRONMENT]; + const { chain, rpcUrls } = getClientConfig(networkLayer); const client = createWalletClient({ account, chain, - transport: http(rpcUrl), + transport: fallback(rpcUrls, { + retryCount: 3, + }), }); return { diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 8433535..577caa7 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -1,5 +1,6 @@ import { bool, cleanEnv, json, num, str, url } from "envalid"; import { version } from "../../../../package.json"; +import { rpcUrls } from "./validator"; export const config = cleanEnv(process.env, { // app @@ -45,19 +46,14 @@ export const config = cleanEnv(process.env, { BLOCK_BUILDER_VERSION: str({ default: "0.0.0" }), PROXY_DOMAIN: str({ default: "localhost", desc: "" }), PROXY_FRP_TOKEN: str({ default: "dummy", desc: "" }), - // network - NETWORK_TYPE: str({ - choices: ["ethereum", "scroll"], - default: "ethereum", - desc: "The type of blockchain network to connect to", - }), - NETWORK_ENVIRONMENT: str({ - choices: ["mainnet", "sepolia"], - default: "sepolia", - desc: "The environment of the blockchain network to connect to", - }), // blockchain - ALCHEMY_API_KEY: str({ devDefault: "dummy" }), + L1_CHAIN: str({ default: "sepolia" }), + L2_CHAIN: str({ default: "scrollSepolia" }), + L1_RPC_URLS: rpcUrls(), + L2_RPC_URLS: rpcUrls(), + ALCHEMY_API_KEY: str(), + ALCHEMY_L1_NETWORK: str({ default: "eth-sepolia" }), + ALCHEMY_L2_NETWORK: str({ default: "scroll-sepolia" }), TRANSACTION_WAIT_TRANSACTION_TIMEOUT: num({ default: 30_000 }), TRANSACTION_INCREMENT_RATE: num({ default: 0.3, diff --git a/packages/shared/src/config/validator.ts b/packages/shared/src/config/validator.ts new file mode 100644 index 0000000..5b79fda --- /dev/null +++ b/packages/shared/src/config/validator.ts @@ -0,0 +1,43 @@ +import { makeValidator } from "envalid"; + +export const ethPrivateKey = makeValidator<`0x${string}`>((input) => { + if (typeof input !== "string" || !/^0x[a-fA-F0-9]{64}$/.test(input)) { + throw new Error("E2E_ETH_PRIVATE_KEY must be 0x followed by 64 hex characters"); + } + return input as `0x${string}`; +}); + +export const contractAddress = makeValidator<`0x${string}`>((input) => { + if (typeof input !== "string" || !/^0x[a-fA-F0-9]{40}$/.test(input)) { + throw new Error("Contract Address must be 0x followed by 40 hex characters"); + } + return input as `0x${string}`; +}); + +export const rpcUrls = makeValidator((value: string) => { + if (!value) { + throw new Error("L1_RPC_URLS is required"); + } + + const urls = value.split(",").map((url) => url.trim()); + + if (urls.length === 0) { + throw new Error("At least one RPC URL is required"); + } + + urls.forEach((urlStr, index) => { + try { + const urlObj = new URL(urlStr); + + if (urlObj.protocol !== "https:") { + throw new Error(`Non-HTTPS URL detected at index ${index}`); + } + } catch (error) { + throw new Error( + `Invalid URL at index ${index} - ${error instanceof Error ? error.message : error}`, + ); + } + }); + + return urls; +}); diff --git a/packages/shared/src/types/blockchain.ts b/packages/shared/src/types/blockchain.ts index 1e87732..31a98f3 100644 --- a/packages/shared/src/types/blockchain.ts +++ b/packages/shared/src/types/blockchain.ts @@ -86,3 +86,5 @@ export interface TransferredToLiquidityEvent extends BaseEvent { export interface TransferredToLiquidityEventLog { amount: bigint; } + +export type NetworkLayer = "l1" | "l2"; From e926b2b330eb2f89d951a00dcf580621c2231394 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Fri, 22 Aug 2025 23:36:32 +0700 Subject: [PATCH 2/2] l1 and l2 chain --- .../src/service/observer.service.ts | 2 +- .../scripts/replay-messenger.ts | 27 ++++++++--------- .../src/service/event.service.ts | 10 +++---- .../src/service/job.service.ts | 14 ++++----- .../src/service/submit.service.ts | 16 +++++----- .../src/service/event.service.ts | 4 +-- .../src/service/indexer.service.ts | 4 +-- .../src/service/job.service.ts | 12 ++++---- .../src/service/job.service.ts | 4 +-- .../src/service/messenger.service.ts | 2 +- .../src/service/submit.service.ts | 16 +++++----- .../src/service/event.service.ts | 8 ++--- .../mint-executor/src/service/job.service.ts | 12 ++++---- .../mint-executor/src/service/mint.service.ts | 20 +++++-------- .../src/service/process.service.ts | 28 +++++++++--------- .../src/service/transfer.service.ts | 16 +++++----- .../src/service/decode.service.ts | 8 ++--- .../src/service/event.service.ts | 4 +-- .../src/service/job.service.ts | 12 ++++---- .../src/service/submit.service.ts | 16 +++++----- .../src/service/event.service.ts | 8 ++--- .../src/service/job.service.ts | 11 +++---- .../src/service/recover.service.ts | 10 +++---- .../src/service/submit.service.ts | 16 +++++----- .../shared/src/blockchain/ethersCalculate.ts | 11 +++---- .../src/blockchain/ethersTransaction.ts | 4 +-- packages/shared/src/blockchain/utils.ts | 10 +++---- packages/shared/src/config/index.ts | 12 ++++---- packages/shared/src/config/validator.ts | 14 +++++++++ packages/shared/src/monitor/balance-check.ts | 4 +-- packages/shared/src/monitor/monitor.ts | 8 ++--- .../src/service/event.service.ts | 29 +++++++++---------- .../src/service/job.service.ts | 13 ++++----- .../src/service/map.service.ts | 10 +++---- .../src/service/token.service.ts | 4 +-- .../src/service/job.service.ts | 4 +-- .../src/service/observer.service.ts | 6 ++-- packages/wallet-observer/src/type.ts | 16 +++++----- 38 files changed, 215 insertions(+), 210 deletions(-) diff --git a/packages/block-sync-monitor/src/service/observer.service.ts b/packages/block-sync-monitor/src/service/observer.service.ts index 92bac8d..bbb015b 100644 --- a/packages/block-sync-monitor/src/service/observer.service.ts +++ b/packages/block-sync-monitor/src/service/observer.service.ts @@ -46,7 +46,7 @@ export const fetchLatestRollupBlockNumber = async () => { const rollupContract = getContract({ address: config.ROLLUP_CONTRACT_ADDRESS as `0x${string}`, abi: RollupAbi, - client: createNetworkClient("scroll"), + client: createNetworkClient("l2"), }); const blockNumber = await rollupContract.read.getLatestBlockNumber(); return Number(blockNumber); diff --git a/packages/deposit-analyzer/scripts/replay-messenger.ts b/packages/deposit-analyzer/scripts/replay-messenger.ts index 43f2a2b..975db56 100644 --- a/packages/deposit-analyzer/scripts/replay-messenger.ts +++ b/packages/deposit-analyzer/scripts/replay-messenger.ts @@ -37,8 +37,8 @@ const GAS_CONFIG = { const FIXED_DEPOSIT_VALUE = "0.1"; -const fetchSentMessages = async (ethereumClient: PublicClient) => { - const l1SentMessageEvents = await fetchEvents(ethereumClient, { +const fetchSentMessages = async (l1Client: PublicClient) => { + const l1SentMessageEvents = await fetchEvents(l1Client, { startBlockNumber: RELAY_CONFIG.startBlockNumber, endBlockNumber: RELAY_CONFIG.endBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -53,18 +53,18 @@ const fetchSentMessages = async (ethereumClient: PublicClient) => { }; const submitTx = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, sentMessageEvent: SentMessageEvent, newGasLimit: number, ) => { - const walletClientData = getWalletClient("depositAnalyzer", "ethereum"); - const refundAddress = walletClientData.account.address; + const walletL1ClientData = getWalletClient("depositAnalyzer", "l1"); + const refundAddress = walletL1ClientData.account.address; const contractCallParams: ContractCallParameters = { contractAddress: RELAY_CONFIG.l1ScrollMessengerContractAddress, abi: L1ScrollMessengerAbi as Abi, functionName: "replayMessage", - account: walletClientData.account, + account: walletL1ClientData.account, args: [ sentMessageEvent.args.sender, sentMessageEvent.args.target, @@ -76,11 +76,11 @@ const submitTx = async ( ], }; - const { currentNonce } = await getNonce(ethereumClient, walletClientData.account.address); + const { currentNonce } = await getNonce(l1Client, walletL1ClientData.account.address); - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l1Client.transport.url); const signer = new ethers.Wallet( - toHex(walletClientData.account.getHdKey().privateKey!), + toHex(walletL1ClientData.account.getHdKey().privateKey!), provider, ); @@ -111,7 +111,7 @@ const submitTx = async ( }); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l1Client, transactionHash, "replayMessage", { @@ -131,7 +131,7 @@ const calculateAnalyzeAndRelayGasLimit = (numDepositsToRelay: number) => { const main = async () => { console.log("debug: RELAY_CONFIG", RELAY_CONFIG); - const ethereumClient = createNetworkClient("ethereum"); + const l1Client = createNetworkClient("l1"); const isValid = validateBlockRange( "fetchSentMessages", RELAY_CONFIG.startBlockNumber, @@ -142,7 +142,7 @@ const main = async () => { return; } - const events = await fetchSentMessages(ethereumClient); + const events = await fetchSentMessages(l1Client); console.log("Fetched Sent Messages:", events); const targetEvent = events.find( @@ -156,8 +156,9 @@ const main = async () => { const newGasLimit = calculateAnalyzeAndRelayGasLimit(RELAY_CONFIG.numDepositsToRelay); console.log("New Gas Limit:", newGasLimit.toString()); - await submitTx(ethereumClient, targetEvent, Number(newGasLimit)); + await submitTx(l1Client, targetEvent, Number(newGasLimit)); }; + main().catch((error) => { console.error("Error fetching sent messages:", error); }); diff --git a/packages/deposit-analyzer/src/service/event.service.ts b/packages/deposit-analyzer/src/service/event.service.ts index 0884be2..2009353 100644 --- a/packages/deposit-analyzer/src/service/event.service.ts +++ b/packages/deposit-analyzer/src/service/event.service.ts @@ -13,13 +13,13 @@ import { import type { Abi, PublicClient } from "viem"; export const getDepositedEvent = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, lastProcessedEvent: EventData | null, ) => { try { - const depositEvents = await fetchEvents(ethereumClient, { + const depositEvents = await fetchEvents(l1Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -28,7 +28,7 @@ export const getDepositedEvent = async ( }); if (depositEvents.length !== 0 && lastProcessedEvent === null) { - const lastRelayedDepositId = (await ethereumClient.readContract({ + const lastRelayedDepositId = (await l1Client.readContract({ address: LIQUIDITY_CONTRACT_ADDRESS, abi: LiquidityAbi as Abi, functionName: "getLastRelayedDepositId", @@ -51,12 +51,12 @@ export const getDepositedEvent = async ( }; export const getDepositsRelayedEvent = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { try { - const depositsRelayedEvents = await fetchEvents(ethereumClient, { + const depositsRelayedEvents = await fetchEvents(l1Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, diff --git a/packages/deposit-analyzer/src/service/job.service.ts b/packages/deposit-analyzer/src/service/job.service.ts index a0878ae..ab2814f 100644 --- a/packages/deposit-analyzer/src/service/job.service.ts +++ b/packages/deposit-analyzer/src/service/job.service.ts @@ -13,19 +13,19 @@ import { submitRelayDeposits } from "./submit.service"; import { splitDepositSummary } from "./summarize.service"; export const performJob = async () => { - const ethereumClient = createNetworkClient("ethereum"); + const l1Client = createNetworkClient("l1"); const event = new Event(FIRESTORE_DOCUMENT_EVENTS.DEPOSITED); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - await ethereumClient.getBlockNumber(), + await l1Client.getBlockNumber(), await event.getEvent(), ]); - await processAnalyzer(ethereumClient, currentBlockNumber, event, lastProcessedEvent); + await processAnalyzer(l1Client, currentBlockNumber, event, lastProcessedEvent); }; const processAnalyzer = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, currentBlockNumber: bigint, event: Event, lastProcessedEvent: EventData | null, @@ -41,7 +41,7 @@ const processAnalyzer = async ( } const processedDepositEvents = await getDepositedEvent( - ethereumClient, + l1Client, startBlockNumber, currentBlockNumber, lastProcessedEvent, @@ -56,7 +56,7 @@ const processAnalyzer = async ( logger.info(`New deposit events: ${processedDepositEvents.length}`); const processedState = await getDepositsRelayedEvent( - ethereumClient, + l1Client, startBlockNumber, currentBlockNumber, ); @@ -68,7 +68,7 @@ const processAnalyzer = async ( if (depositSummary.shouldSubmit) { for (const batch of depositSummary.batches) { - await submitRelayDeposits(ethereumClient, batch); + await submitRelayDeposits(l1Client, batch); await updateEventState(event, batch.blockNumber); } } diff --git a/packages/deposit-analyzer/src/service/submit.service.ts b/packages/deposit-analyzer/src/service/submit.service.ts index 82304b2..c4c2aa4 100644 --- a/packages/deposit-analyzer/src/service/submit.service.ts +++ b/packages/deposit-analyzer/src/service/submit.service.ts @@ -30,7 +30,7 @@ import { FIXED_DEPOSIT_VALUE } from "../constants"; import type { DepositAnalysisSummary } from "../types"; export const submitRelayDeposits = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, depositSummary: DepositAnalysisSummary, ) => { const retryOptions: RetryOptions = { @@ -43,14 +43,14 @@ export const submitRelayDeposits = async ( const multiplier = calculateGasMultiplier(attempt, TRANSACTION_INCREMENT_RATE); const { transactionHash } = await submitRelayDepositsWithRetry( - ethereumClient, + l1Client, depositSummary, multiplier, retryOptions, ); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l1Client, transactionHash, "relayDeposits", { @@ -86,12 +86,12 @@ export const submitRelayDeposits = async ( }; export const submitRelayDepositsWithRetry = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, depositSummary: DepositAnalysisSummary, multiplier: number, retryOptions: RetryOptions, ) => { - const walletClientData = getWalletClient("depositAnalyzer", "ethereum"); + const walletClientData = getWalletClient("depositAnalyzer", "l1"); const contractCallParams: ContractCallParameters = { contractAddress: LIQUIDITY_CONTRACT_ADDRESS, @@ -102,8 +102,8 @@ export const submitRelayDepositsWithRetry = async ( }; const [{ pendingNonce, currentNonce }, gasPriceData] = await Promise.all([ - getNonce(ethereumClient, walletClientData.account.address), - getEthersMaxGasMultiplier(ethereumClient, multiplier), + getNonce(l1Client, walletClientData.account.address), + getEthersMaxGasMultiplier(l1Client, multiplier), ]); let { maxFeePerGas, maxPriorityFeePerGas } = gasPriceData; @@ -133,7 +133,7 @@ export const submitRelayDepositsWithRetry = async ( maxPriorityFeePerGas, }; - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l1Client.transport.url); const signer = new ethers.Wallet( toHex(walletClientData.account.getHdKey().privateKey!), provider, diff --git a/packages/indexer-event-watcher/src/service/event.service.ts b/packages/indexer-event-watcher/src/service/event.service.ts index 4d7e263..5931b1a 100644 --- a/packages/indexer-event-watcher/src/service/event.service.ts +++ b/packages/indexer-event-watcher/src/service/event.service.ts @@ -8,11 +8,11 @@ import { import type { PublicClient } from "viem"; export const getHeartBeatEvents = async ( - ethereumClient: PublicClient, + l2Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { - const heartBeatEvents = await fetchEvents(ethereumClient, { + const heartBeatEvents = await fetchEvents(l2Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, diff --git a/packages/indexer-event-watcher/src/service/indexer.service.ts b/packages/indexer-event-watcher/src/service/indexer.service.ts index 215906f..848d986 100644 --- a/packages/indexer-event-watcher/src/service/indexer.service.ts +++ b/packages/indexer-event-watcher/src/service/indexer.service.ts @@ -7,7 +7,7 @@ import { import { BATCH_SIZE } from "../constants"; export const processIndexer = async ( - ethereumClient: ReturnType, + l2Client: ReturnType, events: BlockBuilderHeartbeatEvent[], ) => { const lastIndexerEvents = events.reduce((acc, event) => { @@ -24,7 +24,7 @@ export const processIndexer = async ( for (let i = 0; i < indexerEvents.length; i += BATCH_SIZE) { const batch = indexerEvents.slice(i, i + BATCH_SIZE); const indexerPromises = batch.map(async (event) => { - const block = await ethereumClient.getBlock({ + const block = await l2Client.getBlock({ blockHash: event.blockHash as `0x${string}`, })!; if (!block) { diff --git a/packages/indexer-event-watcher/src/service/job.service.ts b/packages/indexer-event-watcher/src/service/job.service.ts index 968274c..6c07285 100644 --- a/packages/indexer-event-watcher/src/service/job.service.ts +++ b/packages/indexer-event-watcher/src/service/job.service.ts @@ -12,11 +12,11 @@ import { getHeartBeatEvents } from "./event.service"; import { processIndexer } from "./indexer.service"; export const performJob = async (): Promise => { - const ethereumClient = createNetworkClient("scroll"); + const l2Client = createNetworkClient("l2"); const event = new Event(FIRESTORE_DOCUMENT_EVENTS.BLOCK_BUILDER_HEART_BEAT); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - ethereumClient.getBlockNumber(), + l2Client.getBlockNumber(), event.getEvent(), ]); @@ -34,22 +34,22 @@ export const performJob = async (): Promise => { return; } - await processHeartBeatEvents(ethereumClient, startBlockNumber, currentBlockNumber); + await processHeartBeatEvents(l2Client, startBlockNumber, currentBlockNumber); await updateEventState(event, currentBlockNumber); }; const processHeartBeatEvents = async ( - ethereumClient: ReturnType, + l2Client: ReturnType, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { - const events = await getHeartBeatEvents(ethereumClient, startBlockNumber, currentBlockNumber); + const events = await getHeartBeatEvents(l2Client, startBlockNumber, currentBlockNumber); if (events.length === 0) { logger.info("No new heart beat events found."); return; } - const indexerInfos = await processIndexer(ethereumClient, events); + const indexerInfos = await processIndexer(l2Client, events); logger.info(`Processed ${indexerInfos.length} events.`); }; diff --git a/packages/messenger-relayer/src/service/job.service.ts b/packages/messenger-relayer/src/service/job.service.ts index 7aebaa3..45909fe 100644 --- a/packages/messenger-relayer/src/service/job.service.ts +++ b/packages/messenger-relayer/src/service/job.service.ts @@ -15,12 +15,12 @@ export const performJob = async (): Promise => { logger.info(`Found ${claimableRequests.length} claimable requests`); - const ethereumClient = createNetworkClient("ethereum"); + const l1Client = createNetworkClient("l1"); for (const claimableRequest of claimableRequests) { const calldataBatch = await generateCalldata(claimableRequest); for (const calldata of calldataBatch) { - await relayMessageWithProof(ethereumClient, { + await relayMessageWithProof(l1Client, { ...claimableRequest, claim_info: { ...claimableRequest.claim_info, diff --git a/packages/messenger-relayer/src/service/messenger.service.ts b/packages/messenger-relayer/src/service/messenger.service.ts index 147880e..cd7592b 100644 --- a/packages/messenger-relayer/src/service/messenger.service.ts +++ b/packages/messenger-relayer/src/service/messenger.service.ts @@ -22,7 +22,7 @@ export const fetchAllClaimableScrollMessengerResults = async (messengerType: Mes while (hasMore) { const res = await axios.get( - `${SCROLL_API_BRIDGE_URL_MAPS[config.NETWORK_ENVIRONMENT]}?page_size=${DEFAULT_PAGE_SIZE}&page=${currentPage}&address=${contractAddress}`, + `${SCROLL_API_BRIDGE_URL_MAPS[config.L1_CHAIN]}?page_size=${DEFAULT_PAGE_SIZE}&page=${currentPage}&address=${contractAddress}`, ); if (res.data.errcode !== SUCCESS_CODE) { const message = res.data.errmsg; diff --git a/packages/messenger-relayer/src/service/submit.service.ts b/packages/messenger-relayer/src/service/submit.service.ts index f427f98..8fc891d 100644 --- a/packages/messenger-relayer/src/service/submit.service.ts +++ b/packages/messenger-relayer/src/service/submit.service.ts @@ -31,10 +31,10 @@ import { RELAYER_FIXED_GAS_LIMIT } from "../constants"; import type { ScrollMessengerResult } from "../types"; export const relayMessageWithProof = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, claimableRequest: ScrollMessengerResult, ) => { - const walletClientData = getWalletClient("withdrawal", "ethereum"); + const walletClientData = getWalletClient("withdrawal", "l1"); const retryOptions: RetryOptions = { nonce: null, @@ -47,7 +47,7 @@ export const relayMessageWithProof = async ( for (let attempt = 0; attempt < TRANSACTION_MAX_RETRIES; attempt++) { try { const { transactionHash } = await submitMessageToScroll( - ethereumClient, + l1Client, walletClientData, L1ScrollMessengerAbi as Abi, input, @@ -56,7 +56,7 @@ export const relayMessageWithProof = async ( ); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l1Client, transactionHash, "relayMessageWithProof", { @@ -97,7 +97,7 @@ export const relayMessageWithProof = async ( }; export const submitMessageToScroll = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, walletClientData: ReturnType, abi: Abi, input: ReturnType, @@ -115,8 +115,8 @@ export const submitMessageToScroll = async ( const multiplier = calculateGasMultiplier(attempt, TRANSACTION_INCREMENT_RATE); const [{ pendingNonce, currentNonce }, gasPriceData] = await Promise.all([ - getNonce(ethereumClient, walletClientData.account.address), - getMaxGasMultiplier(ethereumClient, multiplier), + getNonce(l1Client, walletClientData.account.address), + getMaxGasMultiplier(l1Client, multiplier), ]); let { maxFeePerGas, maxPriorityFeePerGas } = gasPriceData; @@ -147,7 +147,7 @@ export const submitMessageToScroll = async ( gasLimit: RELAYER_FIXED_GAS_LIMIT, }; - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l1Client.transport.url); const signer = new ethers.Wallet( toHex(walletClientData.account.getHdKey().privateKey!), provider, diff --git a/packages/mint-executor/src/service/event.service.ts b/packages/mint-executor/src/service/event.service.ts index 18a2e3b..abf8bdd 100644 --- a/packages/mint-executor/src/service/event.service.ts +++ b/packages/mint-executor/src/service/event.service.ts @@ -11,12 +11,12 @@ import { import type { PublicClient } from "viem"; export const getMintedEvent = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { try { - const depositEvents = await fetchEvents(ethereumClient, { + const depositEvents = await fetchEvents(l1Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -33,12 +33,12 @@ export const getMintedEvent = async ( }; export const getTransferredToLiquidityEvent = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { try { - const depositEvents = await fetchEvents(ethereumClient, { + const depositEvents = await fetchEvents(l1Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, diff --git a/packages/mint-executor/src/service/job.service.ts b/packages/mint-executor/src/service/job.service.ts index e2979c3..5293853 100644 --- a/packages/mint-executor/src/service/job.service.ts +++ b/packages/mint-executor/src/service/job.service.ts @@ -12,19 +12,19 @@ import { import { executeAutomaticOperations, processEvents } from "./process.service"; export const performJob = async (): Promise => { - const ethereumClient = createNetworkClient("ethereum"); + const l1Client = createNetworkClient("l1"); const event = new Event(FIRESTORE_DOCUMENT_EVENTS.MINTER); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - await ethereumClient.getBlockNumber(), + await l1Client.getBlockNumber(), await event.getEvent(), ]); - await processMinter(ethereumClient, currentBlockNumber, event, lastProcessedEvent); + await processMinter(l1Client, currentBlockNumber, event, lastProcessedEvent); }; const processMinter = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, currentBlockNumber: bigint, event: Event, lastProcessedEvent: EventData | null, @@ -36,9 +36,9 @@ const processMinter = async ( } const mintEvent = MintEvent.getInstance(); - await processEvents(ethereumClient, mintEvent, startBlockNumber, currentBlockNumber); + await processEvents(l1Client, mintEvent, startBlockNumber, currentBlockNumber); - await executeAutomaticOperations(ethereumClient, mintEvent); + await executeAutomaticOperations(l1Client, mintEvent); await updateEventState(event, currentBlockNumber); }; diff --git a/packages/mint-executor/src/service/mint.service.ts b/packages/mint-executor/src/service/mint.service.ts index ead7025..cf668ae 100644 --- a/packages/mint-executor/src/service/mint.service.ts +++ b/packages/mint-executor/src/service/mint.service.ts @@ -27,7 +27,7 @@ import { import { ethers } from "ethers"; import { type Abi, type PublicClient, toHex } from "viem"; -export const mint = async (ethereumClient: PublicClient) => { +export const mint = async (l1Client: PublicClient) => { const retryOptions: RetryOptions = { maxFeePerGas: null, maxPriorityFeePerGas: null, @@ -37,14 +37,10 @@ export const mint = async (ethereumClient: PublicClient) => { try { const multiplier = calculateGasMultiplier(attempt, TRANSACTION_INCREMENT_RATE); - const { transactionHash } = await submitMintWithRetry( - ethereumClient, - multiplier, - retryOptions, - ); + const { transactionHash } = await submitMintWithRetry(l1Client, multiplier, retryOptions); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l1Client, transactionHash, "mint", { @@ -80,11 +76,11 @@ export const mint = async (ethereumClient: PublicClient) => { }; export const submitMintWithRetry = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, multiplier: number, retryOptions: RetryOptions, ) => { - const walletClientData = getWalletClient("tokenManager", "ethereum"); + const walletClientData = getWalletClient("tokenManager", "l1"); const contractCallParams: ContractCallParameters = { contractAddress: MINTER_CONTRACT_ADDRESS, @@ -95,8 +91,8 @@ export const submitMintWithRetry = async ( }; const [{ pendingNonce, currentNonce }, gasPriceData] = await Promise.all([ - getNonce(ethereumClient, walletClientData.account.address), - getEthersMaxGasMultiplier(ethereumClient, multiplier), + getNonce(l1Client, walletClientData.account.address), + getEthersMaxGasMultiplier(l1Client, multiplier), ]); let { maxFeePerGas, maxPriorityFeePerGas } = gasPriceData; @@ -125,7 +121,7 @@ export const submitMintWithRetry = async ( maxPriorityFeePerGas, }; - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l1Client.transport.url); const signer = new ethers.Wallet( toHex(walletClientData.account.getHdKey().privateKey!), provider, diff --git a/packages/mint-executor/src/service/process.service.ts b/packages/mint-executor/src/service/process.service.ts index b4024a5..0fc4872 100644 --- a/packages/mint-executor/src/service/process.service.ts +++ b/packages/mint-executor/src/service/process.service.ts @@ -21,14 +21,14 @@ interface ProcessedEvents { } export const processEvents = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, mintEvent: MintEvent, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { const [lastEvents, newEvents] = await Promise.all([ getLastProcessedEvents(mintEvent), - getNewEvents(ethereumClient, startBlockNumber, currentBlockNumber), + getNewEvents(l1Client, startBlockNumber, currentBlockNumber), ]); await saveNewEvents(mintEvent, lastEvents, newEvents); @@ -47,13 +47,13 @@ const getLastProcessedEvents = async (mintEvent: MintEvent) => { }; const getNewEvents = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { const [mintedEvents, transferredEvents] = await Promise.all([ - getMintedEvent(ethereumClient, startBlockNumber, currentBlockNumber), - getTransferredToLiquidityEvent(ethereumClient, startBlockNumber, currentBlockNumber), + getMintedEvent(l1Client, startBlockNumber, currentBlockNumber), + getTransferredToLiquidityEvent(l1Client, startBlockNumber, currentBlockNumber), ]); return { @@ -104,7 +104,7 @@ const isNewEvent = (newEvent: any, lastEvent: any): boolean => { }; export const executeAutomaticOperations = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, mintEvent: MintEvent, ) => { const [lastMintedEvent, lastTransferredEvent] = await Promise.all([ @@ -124,7 +124,7 @@ export const executeAutomaticOperations = async ( `Should mint: ${shouldMint} - Last Minted Event: ${lastMintedEvent?.createdAt?.toDate()}`, ); if (shouldMint) { - await executeMintOperation(ethereumClient, mintEvent); + await executeMintOperation(l1Client, mintEvent); } const shouldTransfer = shouldExecuteAction({ @@ -137,18 +137,18 @@ export const executeAutomaticOperations = async ( `Should transfer: ${shouldTransfer} - Last Transferred Event: ${lastTransferredEvent?.createdAt?.toDate()}`, ); if (shouldTransfer) { - await executeTransferOperation(ethereumClient, mintEvent); + await executeTransferOperation(l1Client, mintEvent); } }; const executeMintOperation = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, mintEvent: MintEvent, ) => { logger.info("Executing mint operation"); - const receipt = await mint(ethereumClient); - const block = await Alchemy.getInstance().getBlock(BigInt(receipt.blockNumber)); + const receipt = await mint(l1Client); + const block = await Alchemy.getInstance("l1").getBlock(BigInt(receipt.blockNumber)); await mintEvent.addEvent({ type: "mint", blockNumber: Number(receipt.blockNumber), @@ -158,13 +158,13 @@ const executeMintOperation = async ( }; const executeTransferOperation = async ( - ethereumClient: ReturnType, + l1Client: ReturnType, mintEvent: MintEvent, ) => { logger.info("Executing transfer to liquidity operation"); - const receipt = await transferToLiquidity(ethereumClient, BigInt(ITX_AMOUNT_TO_LIQUIDITY)); - const block = await Alchemy.getInstance().getBlock(BigInt(receipt.blockNumber)); + const receipt = await transferToLiquidity(l1Client, BigInt(ITX_AMOUNT_TO_LIQUIDITY)); + const block = await Alchemy.getInstance("l1").getBlock(BigInt(receipt.blockNumber)); await mintEvent.addEvent({ type: "transferToLiquidity", blockNumber: Number(receipt.blockNumber), diff --git a/packages/mint-executor/src/service/transfer.service.ts b/packages/mint-executor/src/service/transfer.service.ts index 5f0652e..8c4fa5c 100644 --- a/packages/mint-executor/src/service/transfer.service.ts +++ b/packages/mint-executor/src/service/transfer.service.ts @@ -28,7 +28,7 @@ import { type Abi, type PublicClient, toHex } from "viem"; const TRANSACTION_MAX_RETRIES = 1; -export const transferToLiquidity = async (ethereumClient: PublicClient, amount: bigint) => { +export const transferToLiquidity = async (l1Client: PublicClient, amount: bigint) => { const retryOptions: RetryOptions = { maxFeePerGas: null, maxPriorityFeePerGas: null, @@ -39,14 +39,14 @@ export const transferToLiquidity = async (ethereumClient: PublicClient, amount: const multiplier = calculateGasMultiplier(attempt, TRANSACTION_INCREMENT_RATE); const { transactionHash } = await submitMintWithRetry( - ethereumClient, + l1Client, amount, multiplier, retryOptions, ); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l1Client, transactionHash, "transferToLiquidity", { @@ -82,12 +82,12 @@ export const transferToLiquidity = async (ethereumClient: PublicClient, amount: }; export const submitMintWithRetry = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, amount: bigint, multiplier: number, retryOptions: RetryOptions, ) => { - const walletClientData = getWalletClient("tokenManager", "ethereum"); + const walletClientData = getWalletClient("tokenManager", "l1"); const contractCallParams: ContractCallParameters = { contractAddress: MINTER_CONTRACT_ADDRESS, @@ -98,8 +98,8 @@ export const submitMintWithRetry = async ( }; const [{ pendingNonce, currentNonce }, gasPriceData] = await Promise.all([ - getNonce(ethereumClient, walletClientData.account.address), - getEthersMaxGasMultiplier(ethereumClient, multiplier), + getNonce(l1Client, walletClientData.account.address), + getEthersMaxGasMultiplier(l1Client, multiplier), ]); let { maxFeePerGas, maxPriorityFeePerGas } = gasPriceData; @@ -128,7 +128,7 @@ export const submitMintWithRetry = async ( maxPriorityFeePerGas, }; - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l1Client.transport.url); const signer = new ethers.Wallet( toHex(walletClientData.account.getHdKey().privateKey!), provider, diff --git a/packages/mock-l1-to-l2-relayer/src/service/decode.service.ts b/packages/mock-l1-to-l2-relayer/src/service/decode.service.ts index b535a73..a3ec743 100644 --- a/packages/mock-l1-to-l2-relayer/src/service/decode.service.ts +++ b/packages/mock-l1-to-l2-relayer/src/service/decode.service.ts @@ -18,7 +18,7 @@ import { MAX_RELAYER_BATCH_SIZE } from "../constants"; import type { ValidDeposits } from "../types"; export const generateDepositsCalldata = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, l1SentMessageEvent: SentMessageEvent, ) => { if (!config.MOCK_L1_SENDER_EVENT_DECODE_ENABLED) { @@ -30,7 +30,7 @@ export const generateDepositsCalldata = async ( const { lastProcessedDepositId, depositHashes } = decodeL1SentMessage(l1SentMessageEvent); const rejectedIds = await fetchLatestRejectedIds( - ethereumClient, + l1Client, l1SentMessageEvent.blockNumber, lastProcessedDepositId, ); @@ -70,11 +70,11 @@ export const generateBatchedCalldata = (validDeposits: ValidDeposits, maxBatchSi }; const fetchLatestRejectedIds = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, eventBlockNumber: bigint, lastProcessedDepositId: bigint, ) => { - const depositsRelayedEvents = await fetchEvents(ethereumClient, { + const depositsRelayedEvents = await fetchEvents(l1Client, { startBlockNumber: eventBlockNumber, endBlockNumber: eventBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, diff --git a/packages/mock-l1-to-l2-relayer/src/service/event.service.ts b/packages/mock-l1-to-l2-relayer/src/service/event.service.ts index d226a40..6935268 100644 --- a/packages/mock-l1-to-l2-relayer/src/service/event.service.ts +++ b/packages/mock-l1-to-l2-relayer/src/service/event.service.ts @@ -9,11 +9,11 @@ import { import type { PublicClient } from "viem"; export const fetchSentMessages = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { - const l1SentMessageEvents = await fetchEvents(ethereumClient, { + const l1SentMessageEvents = await fetchEvents(l1Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, diff --git a/packages/mock-l1-to-l2-relayer/src/service/job.service.ts b/packages/mock-l1-to-l2-relayer/src/service/job.service.ts index 6bd02f4..c31f574 100644 --- a/packages/mock-l1-to-l2-relayer/src/service/job.service.ts +++ b/packages/mock-l1-to-l2-relayer/src/service/job.service.ts @@ -13,12 +13,12 @@ import { fetchSentMessages } from "./event.service"; import { submitRelayMessagesToL2MockMessenger } from "./submit.service"; export const performJob = async (): Promise => { - const ethereumClient = createNetworkClient("ethereum"); - const scrollClient = createNetworkClient("scroll"); + const l1Client = createNetworkClient("l1"); + const l2Client = createNetworkClient("l2"); const event = new Event(relayerDBName); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - ethereumClient.getBlockNumber(), + l1Client.getBlockNumber(), event.getEvent(), ]); @@ -33,7 +33,7 @@ export const performJob = async (): Promise => { } const l1SentMessageEvents = await fetchSentMessages( - ethereumClient, + l1Client, startBlockNumber, currentBlockNumber, ); @@ -41,10 +41,10 @@ export const performJob = async (): Promise => { logger.info(`Fetched ${l1SentMessageEvents.length} sent messages from L1 to L2`); for (const l1SentMessageEvent of l1SentMessageEvents) { - const calldataBatch = await generateDepositsCalldata(ethereumClient, l1SentMessageEvent); + const calldataBatch = await generateDepositsCalldata(l1Client, l1SentMessageEvent); for (const calldata of calldataBatch) { - await submitRelayMessagesToL2MockMessenger(scrollClient, { + await submitRelayMessagesToL2MockMessenger(l2Client, { ...l1SentMessageEvent.args, message: calldata.encodedCalldata, }); diff --git a/packages/mock-l1-to-l2-relayer/src/service/submit.service.ts b/packages/mock-l1-to-l2-relayer/src/service/submit.service.ts index 0144577..e901ba8 100644 --- a/packages/mock-l1-to-l2-relayer/src/service/submit.service.ts +++ b/packages/mock-l1-to-l2-relayer/src/service/submit.service.ts @@ -30,7 +30,7 @@ import { ethers } from "ethers"; import type { Abi, PublicClient } from "viem"; export const submitRelayMessagesToL2MockMessenger = async ( - ethereumClient: PublicClient, + l2Client: PublicClient, l1SentMessageEventLog: SentMessageEventLog, ) => { if (!validateL1SentMessageEvent(l1SentMessageEventLog)) { @@ -46,14 +46,14 @@ export const submitRelayMessagesToL2MockMessenger = async ( const multiplier = calculateGasMultiplier(attempt); const { transactionHash } = await submitRelayMessagesToL2MockMessengerWithRetry( - ethereumClient, + l2Client, l1SentMessageEventLog, multiplier, retryOptions, ); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l2Client, transactionHash, "withdraw", { @@ -99,12 +99,12 @@ export const submitRelayMessagesToL2MockMessenger = async ( }; export const submitRelayMessagesToL2MockMessengerWithRetry = async ( - ethereumClient: PublicClient, + l2Client: PublicClient, l1SentMessageEventLog: SentMessageEventLog, multiplier: number, retryOptions: RetryOptionsEthers, ) => { - const walletClientData = getMockWalletClient("mockMessenger", "scroll"); + const walletClientData = getMockWalletClient("mockMessenger", "l2"); const contractCallParams: ContractCallParameters = { contractAddress: MOCK_L2_SCROLL_MESSENGER_CONTRACT_ADDRESS, @@ -121,8 +121,8 @@ export const submitRelayMessagesToL2MockMessengerWithRetry = async ( }; const [{ pendingNonce, currentNonce }, gasPriceData] = await Promise.all([ - getNonce(ethereumClient, walletClientData.account.address), - getEthersScrollMaxGasMultiplier(ethereumClient, multiplier), + getNonce(l2Client, walletClientData.account.address), + getEthersScrollMaxGasMultiplier(l2Client, multiplier), ]); let { gasPrice } = gasPriceData; @@ -141,7 +141,7 @@ export const submitRelayMessagesToL2MockMessengerWithRetry = async ( gasPrice, }; - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l2Client.transport.url); const signer = new ethers.Wallet(config.MOCK_MESSENGER_PRIVATE_KEY, provider); const contract = MockL2ScrollMessenger__factory.connect( contractCallParams.contractAddress, diff --git a/packages/mock-l2-to-l1-relayer/src/service/event.service.ts b/packages/mock-l2-to-l1-relayer/src/service/event.service.ts index a5385ef..09e6a49 100644 --- a/packages/mock-l2-to-l1-relayer/src/service/event.service.ts +++ b/packages/mock-l2-to-l1-relayer/src/service/event.service.ts @@ -11,11 +11,11 @@ import { import type { PublicClient } from "viem"; export const getL2SentMessage = async ( - ethereumClient: PublicClient, + l2Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, ) => { - const sentMessageEvents = await fetchEvents(ethereumClient, { + const sentMessageEvents = await fetchEvents(l2Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -28,12 +28,12 @@ export const getL2SentMessage = async ( }; export const fetchPendingWithdrawalHashes = async ( - ethereumClient: PublicClient, + l2Client: PublicClient, startBlockNumber: bigint, currentBlockNumber: bigint, withdrawalHashes: string[], ) => { - const events = await fetchEvents(ethereumClient, { + const events = await fetchEvents(l2Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, diff --git a/packages/mock-l2-to-l1-relayer/src/service/job.service.ts b/packages/mock-l2-to-l1-relayer/src/service/job.service.ts index 4bc51ad..b40c8d7 100644 --- a/packages/mock-l2-to-l1-relayer/src/service/job.service.ts +++ b/packages/mock-l2-to-l1-relayer/src/service/job.service.ts @@ -13,11 +13,11 @@ import { getL2SentMessage } from "./event.service"; import { relayMessageWithProof } from "./submit.service"; export const performJob = async (): Promise => { - const scrollClient = createNetworkClient("scroll"); + const l2Client = createNetworkClient("l2"); const event = new Event(FIRESTORE_DOCUMENT_EVENTS.MOCK_L2_SENT_MESSAGE); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - await scrollClient.getBlockNumber(), + await l2Client.getBlockNumber(), await event.getEvent(), ]); @@ -31,15 +31,16 @@ export const performJob = async (): Promise => { return; } - const sentMessages = await getL2SentMessage(scrollClient, startBlockNumber, currentBlockNumber); + const sentMessages = await getL2SentMessage(l2Client, startBlockNumber, currentBlockNumber); logger.info(`New sentMessages events: ${sentMessages.length}`); - const ethereumClient = createNetworkClient("ethereum"); + + const l1Client = createNetworkClient("l1"); for (const sendMessage of sentMessages) { const calldataBatch = await generateCalldata(sendMessage); for (const calldata of calldataBatch) { - await relayMessageWithProof(ethereumClient, { + await relayMessageWithProof(l1Client, { ...sendMessage, message: calldata.encodedCalldata, }); diff --git a/packages/mock-l2-to-l1-relayer/src/service/recover.service.ts b/packages/mock-l2-to-l1-relayer/src/service/recover.service.ts index 0be491f..32b1334 100644 --- a/packages/mock-l2-to-l1-relayer/src/service/recover.service.ts +++ b/packages/mock-l2-to-l1-relayer/src/service/recover.service.ts @@ -16,13 +16,13 @@ import { relayMessageWithProof } from "./submit.service"; /* // NOTE: invoke this function in the main function -// await filterWithdrawalClaimableEvents(ethereumClient, sentMessages); +// await filterWithdrawalClaimableEvents(l1Client, sentMessages); */ export const filterWithdrawalClaimableEvents = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, sentMessages: SentMessageEventLog[], ) => { - const currentBlockNumber = await ethereumClient.getBlockNumber(); + const currentBlockNumber = await l1Client.getBlockNumber(); const sentMessagesWithClaimables = []; const withdrawalHashes = []; for (const sentMessage of sentMessages) { @@ -41,7 +41,7 @@ export const filterWithdrawalClaimableEvents = async ( } const pendingWithdrawalHashes = await fetchPendingWithdrawalHashes( - ethereumClient, + l1Client, startBlockNumber, currentBlockNumber, withdrawalHashes, @@ -52,7 +52,7 @@ export const filterWithdrawalClaimableEvents = async ( if (pendingWithdrawals.length > 0) { const calldataBatch = processBatchedCalldata(pendingWithdrawals); for (const calldata of calldataBatch) { - await relayMessageWithProof(ethereumClient, { + await relayMessageWithProof(l1Client, { ...sentMessage, message: calldata.encodedCalldata, }); diff --git a/packages/mock-l2-to-l1-relayer/src/service/submit.service.ts b/packages/mock-l2-to-l1-relayer/src/service/submit.service.ts index 184da91..c949e04 100644 --- a/packages/mock-l2-to-l1-relayer/src/service/submit.service.ts +++ b/packages/mock-l2-to-l1-relayer/src/service/submit.service.ts @@ -30,10 +30,10 @@ import { ethers } from "ethers"; import { type Abi, type PublicClient, toHex } from "viem"; export const relayMessageWithProof = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, sendMessage: SentMessageEventLog, ) => { - const walletClientData = getMockWalletClient("mockMessenger", "ethereum"); + const walletClientData = getMockWalletClient("mockMessenger", "l1"); const retryOptions: RetryOptions = { maxFeePerGas: null, @@ -47,7 +47,7 @@ export const relayMessageWithProof = async ( const multiplier = calculateGasMultiplier(attempt); const { transactionHash } = await submitMessageToScroll( - ethereumClient, + l1Client, walletClientData, MockL1ScrollMessengerAbi as Abi, input, @@ -56,7 +56,7 @@ export const relayMessageWithProof = async ( ); const receipt = await ethersWaitForTransactionConfirmation( - ethereumClient, + l1Client, transactionHash, "withdraw", { @@ -97,7 +97,7 @@ export const relayMessageWithProof = async ( }; export const submitMessageToScroll = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, walletClientData: ReturnType, abi: Abi, input: ReturnType, @@ -113,8 +113,8 @@ export const submitMessageToScroll = async ( }; const [{ pendingNonce, currentNonce }, gasPriceData] = await Promise.all([ - getNonce(ethereumClient, walletClientData.account.address), - getEthersMaxGasMultiplier(ethereumClient, multiplier), + getNonce(l1Client, walletClientData.account.address), + getEthersMaxGasMultiplier(l1Client, multiplier), ]); let { maxFeePerGas, maxPriorityFeePerGas } = gasPriceData; @@ -144,7 +144,7 @@ export const submitMessageToScroll = async ( maxPriorityFeePerGas, }; - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(l1Client.transport.url); const signer = new ethers.Wallet(config.MOCK_MESSENGER_PRIVATE_KEY, provider); toHex; const contract = MockL1ScrollMessenger__factory.connect( diff --git a/packages/shared/src/blockchain/ethersCalculate.ts b/packages/shared/src/blockchain/ethersCalculate.ts index 9e6cc4a..603f06c 100644 --- a/packages/shared/src/blockchain/ethersCalculate.ts +++ b/packages/shared/src/blockchain/ethersCalculate.ts @@ -29,10 +29,10 @@ const calculateScrollAdjustedGasPrices = (multiplier: number, baseGasPrice: bigi }; export const getEthersScrollMaxGasMultiplier = async ( - ethereumClient: PublicClient, + publicClient: PublicClient, multiplier: number, ) => { - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); + const provider = new ethers.JsonRpcProvider(publicClient.transport.url); const [block, feeData] = await Promise.all([provider.getBlock("latest"), provider.getFeeData()]); const baseGasPrice = getGasPrice(block, feeData); @@ -54,11 +54,8 @@ const getGasPrice = (block: Block | null, feeData: FeeData) => { return multiplierGasPrice.gasPrice + (feeData?.maxPriorityFeePerGas ?? 0n); }; -export const getEthersMaxGasMultiplier = async ( - ethereumClient: PublicClient, - multiplier: number, -) => { - const provider = new ethers.JsonRpcProvider(ethereumClient.transport.url); +export const getEthersMaxGasMultiplier = async (publicClient: PublicClient, multiplier: number) => { + const provider = new ethers.JsonRpcProvider(publicClient.transport.url); const feeData = await provider.getFeeData(); const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = calculateAdjustedGasPrices( multiplier, diff --git a/packages/shared/src/blockchain/ethersTransaction.ts b/packages/shared/src/blockchain/ethersTransaction.ts index a86fa56..7c7f666 100644 --- a/packages/shared/src/blockchain/ethersTransaction.ts +++ b/packages/shared/src/blockchain/ethersTransaction.ts @@ -108,14 +108,14 @@ const DEFAULT_OPTIONS: Required = { }; export const ethersWaitForTransactionConfirmation = async ( - ethereumClient: PublicClient, + publicClient: PublicClient, transactionHash: string, functionName: string, options?: WaitForTransactionOptions, ) => { try { const { confirms, timeout } = options ?? DEFAULT_OPTIONS; - const provider = new JsonRpcProvider(ethereumClient.transport.url); + const provider = new JsonRpcProvider(publicClient.transport.url); const receipt = await provider.waitForTransaction(transactionHash, confirms, timeout); if (!receipt) { diff --git a/packages/shared/src/blockchain/utils.ts b/packages/shared/src/blockchain/utils.ts index 65577a6..03f8c4b 100644 --- a/packages/shared/src/blockchain/utils.ts +++ b/packages/shared/src/blockchain/utils.ts @@ -19,7 +19,7 @@ interface EventLogOptions { } export const getEventLogsWithRetry = async ( - ethereumClient: PublicClient, + publicClient: PublicClient, contractAddress: `0x${string}`, event: any, fromBlock: bigint, @@ -31,7 +31,7 @@ export const getEventLogsWithRetry = async ( for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { try { const logs = await getEventLogs( - ethereumClient, + publicClient, contractAddress, event, fromBlock, @@ -82,7 +82,7 @@ export const createBlockRanges = ( }; export const fetchEvents = async ( - ethereumClient: PublicClient, + publicClient: PublicClient, options: EventLogOptions, ): Promise => { const { @@ -104,7 +104,7 @@ export const fetchEvents = async ( const batchPromises = batch.map( ([fromBlock, toBlock]) => getEventLogs( - ethereumClient, + publicClient, contractAddress, eventInterface, fromBlock, @@ -124,7 +124,7 @@ export const fetchEvents = async ( `Failed to fetch events Retrying: ${error instanceof Error ? error.message : "Unknown error"}.`, ); - return fetchEvents(ethereumClient, { + return fetchEvents(publicClient, { ...options, blockRange: blockRange / 2n, maxRetries: maxRetries - 1, diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 577caa7..2f7000c 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -1,6 +1,6 @@ import { bool, cleanEnv, json, num, str, url } from "envalid"; import { version } from "../../../../package.json"; -import { rpcUrls } from "./validator"; +import { l1Chain, l2Chain, rpcUrls } from "./validator"; export const config = cleanEnv(process.env, { // app @@ -47,11 +47,11 @@ export const config = cleanEnv(process.env, { PROXY_DOMAIN: str({ default: "localhost", desc: "" }), PROXY_FRP_TOKEN: str({ default: "dummy", desc: "" }), // blockchain - L1_CHAIN: str({ default: "sepolia" }), - L2_CHAIN: str({ default: "scrollSepolia" }), - L1_RPC_URLS: rpcUrls(), - L2_RPC_URLS: rpcUrls(), - ALCHEMY_API_KEY: str(), + L1_CHAIN: l1Chain({ default: "sepolia" }), + L2_CHAIN: l2Chain({ default: "scroll" }), + L1_RPC_URLS: rpcUrls({ default: ["https://eth-sepolia.alchemyapi.io/v2/dummy"] }), + L2_RPC_URLS: rpcUrls({ default: ["https://scroll-sepolia.alchemyapi.io/v2/dummy"] }), + ALCHEMY_API_KEY: str({ default: "dummy" }), ALCHEMY_L1_NETWORK: str({ default: "eth-sepolia" }), ALCHEMY_L2_NETWORK: str({ default: "scroll-sepolia" }), TRANSACTION_WAIT_TRANSACTION_TIMEOUT: num({ default: 30_000 }), diff --git a/packages/shared/src/config/validator.ts b/packages/shared/src/config/validator.ts index 5b79fda..80b1e27 100644 --- a/packages/shared/src/config/validator.ts +++ b/packages/shared/src/config/validator.ts @@ -41,3 +41,17 @@ export const rpcUrls = makeValidator((value: string) => { return urls; }); + +export const l1Chain = makeValidator<"mainnet" | "sepolia">((input) => { + if (input !== "mainnet" && input !== "sepolia") { + throw new Error("L1_CHAIN must be either 'mainnet' or 'sepolia'"); + } + return input as "mainnet" | "sepolia"; +}); + +export const l2Chain = makeValidator<"scroll" | "scrollSepolia">((input) => { + if (input !== "scroll" && input !== "scrollSepolia") { + throw new Error("L2_CHAIN must be either 'scroll' or 'scrollSepolia'"); + } + return input as "scroll" | "scrollSepolia"; +}); diff --git a/packages/shared/src/monitor/balance-check.ts b/packages/shared/src/monitor/balance-check.ts index 4fb961d..d7a35a4 100644 --- a/packages/shared/src/monitor/balance-check.ts +++ b/packages/shared/src/monitor/balance-check.ts @@ -4,7 +4,7 @@ import { MULTICALL_ADDRESS } from "../constants"; import { logger } from "../lib"; export const fetchEthBalances = async ( - ethereumClient: PublicClient, + l2Client: PublicClient, addresses: string[], maxRetries = 3, retryDelay = 1000, @@ -30,7 +30,7 @@ export const fetchEthBalances = async ( while (attempts < maxRetries) { attempts++; try { - results = await multicall(ethereumClient, { + results = await multicall(l2Client, { contracts: contracts, }); diff --git a/packages/shared/src/monitor/monitor.ts b/packages/shared/src/monitor/monitor.ts index ae9abbf..e742fd6 100644 --- a/packages/shared/src/monitor/monitor.ts +++ b/packages/shared/src/monitor/monitor.ts @@ -21,13 +21,13 @@ const getTimeStampFromLast24Hours = () => { }; export const processMonitor = async (indexers: IndexerInfo[]) => { - const ethereumClient = createNetworkClient("scroll"); + const l2Client = createNetworkClient("l2"); const activeIndexers = []; for (let i = 0; i < indexers.length; i += INDEXER_BATCH_SIZE) { const batch = indexers.slice(i, i + INDEXER_BATCH_SIZE); try { - const availableIndexers = await checkIndexerAvailability(ethereumClient, batch); + const availableIndexers = await checkIndexerAvailability(l2Client, batch); activeIndexers.push(...availableIndexers); } catch (error) { logger.error(`Error checking indexer availability: ${error}`); @@ -37,7 +37,7 @@ export const processMonitor = async (indexers: IndexerInfo[]) => { return activeIndexers; }; -const checkIndexerAvailability = async (ethereumClient: PublicClient, indexers: IndexerInfo[]) => { +const checkIndexerAvailability = async (l2Client: PublicClient, indexers: IndexerInfo[]) => { const healthCheckPromises = await Promise.all( indexers.map(async (indexer) => { try { @@ -67,7 +67,7 @@ const checkIndexerAvailability = async (ethereumClient: PublicClient, indexers: ); const addresses = indexers.map((indexer) => indexer.address); - const balanceMap = await fetchEthBalances(ethereumClient, addresses); + const balanceMap = await fetchEthBalances(l2Client, addresses); const availableIndexers = healthCheckPromises.filter((indexer) => { if (indexer.status === "available") { diff --git a/packages/token-map-register/src/service/event.service.ts b/packages/token-map-register/src/service/event.service.ts index 342a955..6d2b3c8 100644 --- a/packages/token-map-register/src/service/event.service.ts +++ b/packages/token-map-register/src/service/event.service.ts @@ -18,12 +18,12 @@ import { DEPOSIT_EVENT_MAX_ATTEMPTS, MULTICALL_SIZE } from "../constants"; import type { TokenInfo } from "../types"; export const fetchUnprocessedDepositTokenEntries = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, currentBlockNumber: bigint, lastProcessedEvent: DepositsRelayedEventData | null, ) => { const { depositIds, startBlockNumber } = await getDepositIds( - ethereumClient, + l1Client, currentBlockNumber, lastProcessedEvent, ); @@ -35,19 +35,19 @@ export const fetchUnprocessedDepositTokenEntries = async ( } const fromBlockNumber = await calculateDepositStartNumber( - ethereumClient, + l1Client, currentBlockNumber, startBlockNumber, depositIds, ); const depositEventLogs = await getDepositLogs( - ethereumClient, + l1Client, fromBlockNumber, currentBlockNumber, depositIds, ); - const tokenInfoMap = await mapDepositsToTokenInfo(ethereumClient, depositEventLogs); + const tokenInfoMap = await mapDepositsToTokenInfo(l1Client, depositEventLogs); return { depositIds, @@ -56,7 +56,7 @@ export const fetchUnprocessedDepositTokenEntries = async ( }; const getDepositIds = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, currentBlockNumber: bigint, lastProcessedEvent: DepositsRelayedEventData | null, ) => { @@ -72,7 +72,7 @@ const getDepositIds = async ( }; } - const depositsRelayedEvents = await fetchEvents(ethereumClient, { + const depositsRelayedEvents = await fetchEvents(l1Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -130,7 +130,7 @@ const generateDepositIds = ( }; const calculateDepositStartNumber = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, currentBlockNumber: bigint, startBlockNumber: bigint, depositIds: number[], @@ -143,7 +143,7 @@ const calculateDepositStartNumber = async ( const minDepositId = Math.min(...depositIds); while (attempts < DEPOSIT_EVENT_MAX_ATTEMPTS) { - const events = await fetchEvents(ethereumClient, { + const events = await fetchEvents(l1Client, { startBlockNumber: startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -174,12 +174,12 @@ const calculateDepositStartNumber = async ( }; const getDepositLogs = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, fromBlockNumber: bigint, currentBlockNumber: bigint, depositIds: number[], ) => { - const depositEvents = await fetchEvents(ethereumClient, { + const depositEvents = await fetchEvents(l1Client, { startBlockNumber: fromBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_MINIMUM, @@ -193,14 +193,11 @@ const getDepositLogs = async ( return depositEvents.map(({ args }) => args); }; -const mapDepositsToTokenInfo = async ( - ethereumClient: PublicClient, - depositLogs: DepositEventLog[], -) => { +const mapDepositsToTokenInfo = async (l1Client: PublicClient, depositLogs: DepositEventLog[]) => { const tokenIndexSet = new Set(depositLogs.map(({ tokenIndex }) => tokenIndex)); const tokenIndexes = Array.from(tokenIndexSet); - const results = await ethereumClient.multicall({ + const results = await l1Client.multicall({ contracts: tokenIndexes.map((tokenIndex) => { return { address: LIQUIDITY_CONTRACT_ADDRESS, diff --git a/packages/token-map-register/src/service/job.service.ts b/packages/token-map-register/src/service/job.service.ts index 886d85c..9619f80 100644 --- a/packages/token-map-register/src/service/job.service.ts +++ b/packages/token-map-register/src/service/job.service.ts @@ -1,5 +1,4 @@ import { - config, createNetworkClient, type DepositsRelayedEventData, Event, @@ -11,24 +10,24 @@ import { fetchUnprocessedDepositTokenEntries } from "./event.service"; import { saveTokenIndexMaps } from "./map.service"; export const performJob = async (): Promise => { - const ethereumClient = createNetworkClient(config.NETWORK_TYPE); + const l1Client = createNetworkClient("l1"); const event = new Event(FIRESTORE_DOCUMENT_EVENTS.DEPOSITS_RELAYED_TOKEN_MAPS); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - await ethereumClient.getBlockNumber(), + await l1Client.getBlockNumber(), event.getEvent(), ]); - const eventData = await processTokenMap(ethereumClient, currentBlockNumber, lastProcessedEvent); + const eventData = await processTokenMap(l1Client, currentBlockNumber, lastProcessedEvent); await updateEventData(event, eventData); }; const processTokenMap = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, currentBlockNumber: bigint, lastProcessedEvent: DepositsRelayedEventData | null, ) => { const { depositIds, tokenInfoMap } = await fetchUnprocessedDepositTokenEntries( - ethereumClient, + l1Client, currentBlockNumber, lastProcessedEvent, ); @@ -40,7 +39,7 @@ const processTokenMap = async ( }; } - const results = await saveTokenIndexMaps(ethereumClient, tokenInfoMap); + const results = await saveTokenIndexMaps(l1Client, tokenInfoMap); logger.info(`Added ${results.length} new token maps.`); return { diff --git a/packages/token-map-register/src/service/map.service.ts b/packages/token-map-register/src/service/map.service.ts index b13c526..ab28b1f 100644 --- a/packages/token-map-register/src/service/map.service.ts +++ b/packages/token-map-register/src/service/map.service.ts @@ -10,7 +10,7 @@ type MulticallResult = { }; export const saveTokenIndexMaps = async ( - ethereumClient: PublicClient, + l1Client: PublicClient, tokenInfoMap: Map, ) => { const erc20TokenMap = filterERC20Tokens(tokenInfoMap); @@ -24,7 +24,7 @@ export const saveTokenIndexMaps = async ( } const tokenValues = Array.from(newERC20TokenMap.values()); - const metadata = await fetchTokenMetadata(ethereumClient, tokenValues); + const metadata = await fetchTokenMetadata(l1Client, tokenValues); const enrichedTokens = enrichTokensWithMetadata(newERC20TokenMap, metadata); await saveTokenMaps(enrichedTokens); @@ -55,7 +55,7 @@ const filterNewERC20Tokens = async (erc20TokenMap: Map) => { ); }; -const fetchTokenMetadata = async (ethereumClient: PublicClient, tokens: TokenInfo[]) => { +const fetchTokenMetadata = async (l1Client: PublicClient, tokens: TokenInfo[]) => { const createConfig = (functionName: "decimals" | "symbol") => ({ contracts: tokens.map(({ tokenAddress }) => ({ address: tokenAddress as `0x${string}`, @@ -67,8 +67,8 @@ const fetchTokenMetadata = async (ethereumClient: PublicClient, tokens: TokenInf }); const [decimalsResults, symbolsResults] = await Promise.all([ - ethereumClient.multicall(createConfig("decimals")), - ethereumClient.multicall(createConfig("symbol")), + l1Client.multicall(createConfig("decimals")), + l1Client.multicall(createConfig("symbol")), ]); return { decimals: decimalsResults, symbols: symbolsResults }; diff --git a/packages/token-metadata-sync/src/service/token.service.ts b/packages/token-metadata-sync/src/service/token.service.ts index 25de018..80b76f2 100644 --- a/packages/token-metadata-sync/src/service/token.service.ts +++ b/packages/token-metadata-sync/src/service/token.service.ts @@ -55,7 +55,7 @@ export const mergeTokenLists = (tokenList: Token[], coinGeckoList: CoinListRespo }; export const fetchContractDecimals = async (tokenBatches: TokenData[]) => { - const ethereumClient = createNetworkClient("ethereum"); + const l1Client = createNetworkClient("l1"); const results: { id: string; @@ -74,7 +74,7 @@ export const fetchContractDecimals = async (tokenBatches: TokenData[]) => { })); const [ethereumRes] = await Promise.all([ - ethereumClient.multicall({ + l1Client.multicall({ contracts: ethereumContractsToCall, batchSize: MULTICALL_SIZE, }), diff --git a/packages/wallet-observer/src/service/job.service.ts b/packages/wallet-observer/src/service/job.service.ts index 89820f3..ff08bab 100644 --- a/packages/wallet-observer/src/service/job.service.ts +++ b/packages/wallet-observer/src/service/job.service.ts @@ -13,7 +13,7 @@ export const performJob = async () => { .map((type) => { return type.types.map((networkType) => ({ type: type.name, - ethereumClient: createNetworkClient(networkType), + publicClient: createNetworkClient(networkType), walletClientData: getWalletClient(type.name, networkType), min: type.min, })); @@ -25,7 +25,7 @@ export const performJob = async () => { .map((type) => { return type.types.map((networkType) => ({ type: type.name, - ethereumClient: createNetworkClient(networkType), + publicClient: createNetworkClient(networkType), walletClientData: getMockWalletClient(type.name, networkType), min: type.min, })); diff --git a/packages/wallet-observer/src/service/observer.service.ts b/packages/wallet-observer/src/service/observer.service.ts index 9fbe0aa..5f1d840 100644 --- a/packages/wallet-observer/src/service/observer.service.ts +++ b/packages/wallet-observer/src/service/observer.service.ts @@ -3,11 +3,11 @@ import { formatEther, parseEther } from "viem"; import { REQUIRED_ETH, REQUIRED_ETH_MIN } from "../constants"; import type { WalletClient } from "../type"; -export const getBalance = async ({ type, ethereumClient, walletClientData, min }: WalletClient) => { +export const getBalance = async ({ type, publicClient, walletClientData, min }: WalletClient) => { const address = walletClientData.account.address; const chain = walletClientData.walletClient.chain?.name!; - const balance = await ethereumClient.getBalance({ + const balance = await publicClient.getBalance({ address, }); const balanceAsEther = formatEther(balance); @@ -15,7 +15,7 @@ export const getBalance = async ({ type, ethereumClient, walletClientData, min } return ` Name: ${type} - NetworkEnvironment: ${config.NETWORK_ENVIRONMENT} + NetworkEnvironment: ${config.L1_CHAIN} Address: ${address} Chain: ${chain} Balance: ${balanceAsEther} ETH diff --git a/packages/wallet-observer/src/type.ts b/packages/wallet-observer/src/type.ts index 284b3e4..4a2f441 100644 --- a/packages/wallet-observer/src/type.ts +++ b/packages/wallet-observer/src/type.ts @@ -4,27 +4,27 @@ import type { PublicClient } from "viem"; export const walletTypes: WalletType[] = [ { name: "builder", - types: ["scroll"], + types: ["l2"], min: false, }, { name: "depositAnalyzer", - types: ["ethereum"], + types: ["l2"], min: false, }, { name: "withdrawal", - types: ["scroll"], + types: ["l2"], min: false, }, { name: "blockBuilderReward", - types: ["scroll"], + types: ["l2"], min: true, }, { name: "tokenManager", - types: ["ethereum"], + types: ["l1"], min: true, }, ]; @@ -32,19 +32,19 @@ export const walletTypes: WalletType[] = [ export const mockWalletTypes = [ { name: "mockMessenger" as const, - types: ["ethereum", "scroll"] as const, + types: ["l1", "l2"] as const, min: false, }, ]; export type WalletType = { name: "builder" | "depositAnalyzer" | "withdrawal" | "blockBuilderReward" | "tokenManager"; - types: ("ethereum" | "scroll")[]; + types: ("l1" | "l2")[]; min: boolean; }; export type WalletClient = { - ethereumClient: PublicClient; + publicClient: PublicClient; type: string; walletClientData: ReturnType | ReturnType; min: boolean;