diff --git a/.env.example b/.env.example index cccad19..a7ffc34 100644 --- a/.env.example +++ b/.env.example @@ -32,10 +32,6 @@ BLOCK_BUILDER_VERSION=0.0.0 PROXY_DOMAIN=localhost PROXY_FRP_TOKEN=dummy -# network -NETWORK_TYPE=ethereum -NETWORK_ENVIRONMENT=sepolia - # blockchain L1_CHAIN=sepolia L2_CHAIN=scrollSepolia @@ -47,6 +43,9 @@ TRANSACTION_INCREMENT_RATE=0.3 # mint MINT_AVAILABLE_FROM="2025-06-23T00:00:00Z" +# layer zero +LAYER_ZERO_NETWORK=testnet + # predicate PREDICATE_API_URL=http://localhost:4000 PREDICATE_API_KEY=dummy @@ -66,6 +65,11 @@ MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK=0 BASE_BRIDGE_O_APP_CONTRACT_ADDRESS=0x BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK=0 +# sender bridge o app +SENDER_BRIDGE_O_APP_CHAIN_TYPE=l2 +SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS=0x +SENDER_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK=0 + # messenger contract L1_SCROLL_MESSENGER_CONTRACT_ADDRESS=0x diff --git a/packages/bridge-event-watcher/src/service/job.service.ts b/packages/bridge-event-watcher/src/service/job.service.ts index 43d1deb..388ac63 100644 --- a/packages/bridge-event-watcher/src/service/job.service.ts +++ b/packages/bridge-event-watcher/src/service/job.service.ts @@ -1,6 +1,5 @@ +import type { FirestoreDocumentKey } from "@intmax2-function/shared"; import { - BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, - BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, BLOCK_RANGE_TINY, type BridgeRequestedEvent, BridgeTransaction, @@ -12,30 +11,35 @@ import { fetchEvents, getStartBlockNumber, logger, + SENDER_BRIDGE_O_APP_CHAIN_TYPE, + SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS, + SENDER_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, validateBlockRange, } from "@intmax2-function/shared"; export const performJob = async () => { - const l2Client = createNetworkClient("l2"); - const event = new Event(FIRESTORE_DOCUMENT_EVENTS.BRIDGE_REQUESTED); + const networkClient = createNetworkClient(SENDER_BRIDGE_O_APP_CHAIN_TYPE); + const eventDocName = + `${FIRESTORE_DOCUMENT_EVENTS.BRIDGE_REQUESTED}-${SENDER_BRIDGE_O_APP_CHAIN_TYPE}` as FirestoreDocumentKey; + const event = new Event(eventDocName); const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - await l2Client.getBlockNumber(), + await networkClient.getBlockNumber(), await event.getEvent(), ]); - await processBridgeMonitor(l2Client, currentBlockNumber, event, lastProcessedEvent); + await processBridgeMonitor(networkClient, currentBlockNumber, event, lastProcessedEvent); }; const processBridgeMonitor = async ( - l2Client: ReturnType, + networkClient: ReturnType, currentBlockNumber: bigint, event: Event, lastProcessedEvent: EventData | null, ) => { const startBlockNumber = getStartBlockNumber( lastProcessedEvent, - BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, + SENDER_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, ); const isValid = validateBlockRange("BridgeRequested", startBlockNumber, currentBlockNumber); if (!isValid) { @@ -43,11 +47,11 @@ const processBridgeMonitor = async ( return; } - const bridgeRequestedEvents = await fetchEvents(l2Client, { - startBlockNumber: BigInt(BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK), + const bridgeRequestedEvents = await fetchEvents(networkClient, { + startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_TINY, - contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + contractAddress: SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS, eventInterface: bridgeRequestedEvent, }); @@ -57,8 +61,11 @@ const processBridgeMonitor = async ( recipient: event.args.recipient, amount: event.args.amount.toString(), transactionHash: event.transactionHash, + chainType: SENDER_BRIDGE_O_APP_CHAIN_TYPE, })); + logger.info(`BridgeRequested events fetched: ${bridgeRequestedInputs.length}`); + await BridgeTransaction.getInstance().saveBridgeTransactionsBatch(bridgeRequestedInputs); await updateEventState(event, currentBlockNumber); diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts index b390813..461f5f3 100644 --- a/packages/bridge-monitor/src/service/job.service.ts +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -30,6 +30,8 @@ export const performJob = async () => { for (const bridgeTransaction of sortedTransactions) { await processBridgeTransaction(bridgeTransaction); } + + logger.info(`Processed ${sortedTransactions.length} bridge transactions`); }; const processBridgeTransaction = async (bridgeTransaction: BridgeTransactionData) => { diff --git a/packages/bridge-monitor/src/service/submit.service.ts b/packages/bridge-monitor/src/service/submit.service.ts index 6193132..27395ad 100644 --- a/packages/bridge-monitor/src/service/submit.service.ts +++ b/packages/bridge-monitor/src/service/submit.service.ts @@ -1,4 +1,6 @@ import { + BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + BaseBridgeOAppAbi, type ContractCallOptionsEthers, type ContractCallParameters, calculateGasMultiplier, @@ -12,9 +14,7 @@ import { getNonce, getWalletClient, logger, - MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS, MainnetBridgeOApp__factory, - MainnetBridgeOAppAbi, type RetryOptions, replacedEthersTransaction, TRANSACTION_INCREMENT_RATE, @@ -85,8 +85,8 @@ export const submitWithRetry = async ( const walletClientData = getWalletClient("bridgeManager", "l1"); const contractCallParams: ContractCallParameters = { - contractAddress: MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS, - abi: MainnetBridgeOAppAbi as Abi, + contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + abi: BaseBridgeOAppAbi as Abi, functionName: params.operation, account: walletClientData.account, args: params.args, diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 3d61ec4..edabeb6 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -80,6 +80,10 @@ export const config = cleanEnv(process.env, { MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), BASE_BRIDGE_O_APP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), + // SenderBridgeOApp + SENDER_BRIDGE_O_APP_CHAIN_TYPE: str({ devDefault: "l2" }), + SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), + SENDER_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), // messenger contract L1_SCROLL_MESSENGER_CONTRACT_ADDRESS: str({ devDefault: "0x" }), // mock messenger contract (for test and dev) diff --git a/packages/shared/src/constants/constants.ts b/packages/shared/src/constants/constants.ts index e520336..8737edf 100644 --- a/packages/shared/src/constants/constants.ts +++ b/packages/shared/src/constants/constants.ts @@ -78,6 +78,13 @@ export const MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS = export const MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK = config.MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK; +// SenderBridgeOApp +export const SENDER_BRIDGE_O_APP_CHAIN_TYPE = config.SENDER_BRIDGE_O_APP_CHAIN_TYPE as "l1" | "l2"; +export const SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS = + config.SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS as `0x${string}`; +export const SENDER_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK = + config.SENDER_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK; + // mock export const MOCK_L1_SCROLL_MESSENGER_CONTRACT_ADDRESS = config.MOCK_L1_SCROLL_MESSENGER_CONTRACT_ADDRESS as `0x${string}`; diff --git a/vitest.config.ts b/vitest.config.ts index 5556ab6..0b4bf94 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,5 +1,5 @@ -import { configDefaults, defineConfig } from "vitest/config"; import path from "path"; +import { configDefaults, defineConfig } from "vitest/config"; export default defineConfig({ test: {