diff --git a/packages/bridge-ui/src/libs/bridge/getInvocationDelayForTx.ts b/packages/bridge-ui/src/libs/bridge/getInvocationDelayForTx.ts index 1813cef6cf0..08c89c647eb 100644 --- a/packages/bridge-ui/src/libs/bridge/getInvocationDelayForTx.ts +++ b/packages/bridge-ui/src/libs/bridge/getInvocationDelayForTx.ts @@ -1,4 +1,5 @@ import type { BridgeTransaction } from '$libs/bridge/types'; +import { NoDelaysForBridgeError } from '$libs/error'; import { getLatestBlockTimestamp } from '$libs/util/getLatestBlockTimestamp'; import { getLogger } from '$libs/util/logger'; @@ -7,20 +8,17 @@ import { getProofReceiptForMsgHash } from './getProofReceiptForMsgHash'; const log = getLogger('bridge:getInvocationDelayForTx'); -export const getInvoationDelayForTx = async (tx: BridgeTransaction) => { - log('getInvoationDelayForTx', tx); +export const getInvocationDelayForTx = async (tx: BridgeTransaction) => { + log('getInvocationDelayForTx', tx); const invocationDelays = await getInvocationDelaysForDestBridge({ srcChainId: tx.srcChainId, destChainId: tx.destChainId, }); - const delayForPreferred = invocationDelays[0]; - const delayForNotPreferred = invocationDelays[1]; - - log('invocationDelays', invocationDelays); - const latestBlockTimestamp = await getLatestBlockTimestamp(tx.destChainId); - log('latestBlockTimestamp', latestBlockTimestamp); + if (invocationDelays[0] === 0n) { + throw new NoDelaysForBridgeError('Destination chain does not have delays'); + } const proofReciept = await getProofReceiptForMsgHash({ msgHash: tx.msgHash, @@ -28,6 +26,22 @@ export const getInvoationDelayForTx = async (tx: BridgeTransaction) => { srcChainId: tx.srcChainId, }); + if (proofReciept[0] === 0n) { + // No proof receipt found, no delay (yet) + return { + preferredDelay: 0n, + notPreferredDelay: 0n, + }; + } + + const delayForPreferred = invocationDelays[0]; + const delayForNotPreferred = invocationDelays[1]; + + log('invocationDelays', invocationDelays); + + const latestBlockTimestamp = await getLatestBlockTimestamp(tx.destChainId); + log('latestBlockTimestamp', latestBlockTimestamp); + const provenAt = proofReciept[0]; // const provenBy = proofReciept[1]; diff --git a/packages/bridge-ui/src/libs/bridge/isTransactionProcessable.ts b/packages/bridge-ui/src/libs/bridge/isTransactionProcessable.ts index e845242dc7e..b6ecf881507 100644 --- a/packages/bridge-ui/src/libs/bridge/isTransactionProcessable.ts +++ b/packages/bridge-ui/src/libs/bridge/isTransactionProcessable.ts @@ -4,9 +4,11 @@ import { hexToBigInt, keccak256, toBytes } from 'viem'; import { signalServiceAbi } from '$abi'; import { routingContractsMap } from '$bridgeConfig'; import { chains } from '$libs/chain'; +import { getLogger } from '$libs/util/logger'; import { config } from '$libs/wagmi'; import { type BridgeTransaction, MessageStatus } from './types'; +const log = getLogger('libs:bridge:isTransactionProcessable'); export async function isTransactionProcessable(bridgeTx: BridgeTransaction) { const { receipt, message, srcChainId, destChainId, msgStatus } = bridgeTx; @@ -39,7 +41,13 @@ export async function isTransactionProcessable(bridgeTx: BridgeTransaction) { const latestSyncedblock = syncedChainData[0]; const synced = latestSyncedblock >= hexToBigInt(receipt.blockNumber); - + log('isTransactionProcessable', { + from: srcChainId, + to: destChainId, + latestSyncedblock, + receiptBlockNumber: hexToBigInt(receipt.blockNumber), + synced, + }); return synced; } catch (error) { console.error('Error checking if transaction is processable', error); diff --git a/packages/bridge-ui/src/libs/bridge/types.ts b/packages/bridge-ui/src/libs/bridge/types.ts index c712611429c..443d8245731 100644 --- a/packages/bridge-ui/src/libs/bridge/types.ts +++ b/packages/bridge-ui/src/libs/bridge/types.ts @@ -1,5 +1,6 @@ -import type { Address, Hash, Hex, TransactionReceipt, WalletClient } from 'viem'; +import type { Address, GetContractReturnType, Hash, Hex, TransactionReceipt, WalletClient } from 'viem'; +import type { bridgeAbi } from '$abi'; import type { ChainID } from '$libs/chain'; import type { TokenType } from '$libs/token'; @@ -186,9 +187,18 @@ export type RequireApprovalArgs = { export type ClaimArgs = { bridgeTx: BridgeTransaction; wallet: WalletClient; + lastAttempt?: boolean; // used for retrying }; -export type ReleaseArgs = ClaimArgs; +export type ProcessMessageType = ClaimArgs & { + bridgeContract: GetContractReturnType; + client: WalletClient; +}; + +export type RetryMessageArgs = ProcessMessageType; + +export type ReleaseArgs = ProcessMessageType; + export interface Bridge { estimateGas(args: BridgeArgs): Promise; bridge(args: BridgeArgs): Promise; diff --git a/packages/bridge-ui/src/libs/error/errors.ts b/packages/bridge-ui/src/libs/error/errors.ts index 36669b4728b..5b47dcbbf5f 100644 --- a/packages/bridge-ui/src/libs/error/errors.ts +++ b/packages/bridge-ui/src/libs/error/errors.ts @@ -165,3 +165,7 @@ export class IpfsError extends Error { export class ClientError extends Error { name = 'ClientError'; } + +export class NoDelaysForBridgeError extends Error { + name = 'NoDelaysForBridgeError'; +} diff --git a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts index 3d46ec0c298..cfc5237fb97 100644 --- a/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts +++ b/packages/bridge-ui/src/libs/relayer/RelayerAPIService.ts @@ -291,22 +291,3 @@ const _eventToTokenType = (eventType: RelayerEventType): TokenType => { return TokenType.ETH; } }; - -// function _checkType(bridgeTx: BridgeTransaction): TokenType { -// const to = bridgeTx.message?.to; - -// switch (to?.toLowerCase()) { -// case routingContractsMap[Number(bridgeTx.destChainId)][Number(bridgeTx.srcChainId)].erc20VaultAddress.toLowerCase(): -// return TokenType.ERC20; -// case routingContractsMap[Number(bridgeTx.destChainId)][ -// Number(bridgeTx.srcChainId) -// ].erc721VaultAddress.toLowerCase(): -// return TokenType.ERC721; -// case routingContractsMap[Number(bridgeTx.destChainId)][ -// Number(bridgeTx.srcChainId) -// ].erc1155VaultAddress.toLowerCase(): -// return TokenType.ERC1155; -// default: -// return TokenType.ETH; -// } -// } diff --git a/packages/bridge-ui/src/tests/libs/bridge/getInvocationDelayForTx.test.ts b/packages/bridge-ui/src/tests/libs/bridge/getInvocationDelayForTx.test.ts index 6149103108c..c461acb74bb 100644 --- a/packages/bridge-ui/src/tests/libs/bridge/getInvocationDelayForTx.test.ts +++ b/packages/bridge-ui/src/tests/libs/bridge/getInvocationDelayForTx.test.ts @@ -1,4 +1,4 @@ -import { getInvoationDelayForTx } from '$libs/bridge/getInvocationDelayForTx'; +import { getInvocationDelayForTx } from '$libs/bridge/getInvocationDelayForTx'; import { getInvocationDelaysForDestBridge } from '$libs/bridge/getInvocationDelaysForDestBridge'; import { getProofReceiptForMsgHash } from '$libs/bridge/getProofReceiptForMsgHash'; import { getLatestBlockTimestamp } from '$libs/util/getLatestBlockTimestamp'; @@ -35,7 +35,7 @@ describe('getInvocationDelayForTx()', () => { vi.mocked(getProofReceiptForMsgHash).mockResolvedValue([MOCK_RECIEPT_TIMESTAMP, ALICE]); //When - const result = await getInvoationDelayForTx(MOCK_BRIDGE_TX_1); + const result = await getInvocationDelayForTx(MOCK_BRIDGE_TX_1); //Then expect(result).toStrictEqual({