Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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

Expand Down
29 changes: 18 additions & 11 deletions packages/bridge-event-watcher/src/service/job.service.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -12,42 +11,47 @@ 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<EventData>(),
]);

await processBridgeMonitor(l2Client, currentBlockNumber, event, lastProcessedEvent);
await processBridgeMonitor(networkClient, currentBlockNumber, event, lastProcessedEvent);
};

const processBridgeMonitor = async (
l2Client: ReturnType<typeof createNetworkClient>,
networkClient: ReturnType<typeof createNetworkClient>,
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) {
logger.info("Skipping process BridgeRequested due to invalid block range.");
return;
}

const bridgeRequestedEvents = await fetchEvents<BridgeRequestedEvent>(l2Client, {
startBlockNumber: BigInt(BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK),
const bridgeRequestedEvents = await fetchEvents<BridgeRequestedEvent>(networkClient, {
startBlockNumber,
endBlockNumber: currentBlockNumber,
blockRange: BLOCK_RANGE_TINY,
contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS,
contractAddress: SENDER_BRIDGE_O_APP_CONTRACT_ADDRESS,
eventInterface: bridgeRequestedEvent,
});

Expand All @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions packages/bridge-monitor/src/service/job.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
8 changes: 4 additions & 4 deletions packages/bridge-monitor/src/service/submit.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import {
BASE_BRIDGE_O_APP_CONTRACT_ADDRESS,
BaseBridgeOAppAbi,
type ContractCallOptionsEthers,
type ContractCallParameters,
calculateGasMultiplier,
Expand All @@ -12,9 +14,7 @@ import {
getNonce,
getWalletClient,
logger,
MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS,
MainnetBridgeOApp__factory,
MainnetBridgeOAppAbi,
type RetryOptions,
replacedEthersTransaction,
TRANSACTION_INCREMENT_RATE,
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions packages/shared/src/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions packages/shared/src/constants/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}`;
Expand Down
2 changes: 1 addition & 1 deletion vitest.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { configDefaults, defineConfig } from "vitest/config";
import path from "path";
import { configDefaults, defineConfig } from "vitest/config";

export default defineConfig({
test: {
Expand Down