From fb60f5868e951cde90689c32c8a63847f637b7a4 Mon Sep 17 00:00:00 2001 From: Christophe Date: Tue, 3 Jun 2025 11:29:12 +0000 Subject: [PATCH 1/8] fix: ensure correct network before any transaction --- .../TransferPanel/TransferPanel.tsx | 159 +++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index 1a9af38a7b..99bd5ccb7b 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -116,6 +116,35 @@ const networkConnectionWarningToast = () => { autoClose: false } ) +// Returns false if user rejected the network switch and network is still incorrect +async function ensureCorrectNetwork({ + switchChainAsync, + sourceChainId, + currentChainId +}: { + switchChainAsync: ReturnType< + typeof useSwitchNetworkWithConfig + >['switchChainAsync'] + sourceChainId: number + currentChainId: number | undefined +}) { + let newChain: { id: number } | null = { id: currentChainId || -1 } + while (newChain?.id !== sourceChainId) { + try { + newChain = await switchChainAsync({ + chainId: sourceChainId + }) + } catch (e) { + // If user reject the switch, stop the transfer + if (isUserRejectedError(e)) { + return false + } + } + } + + return true +} + export function TransferPanel() { // Link the amount state directly to the amount in query params - no need of useState // Both `amount` getter and setter will internally be using `useArbQueryParams` functions @@ -471,12 +500,68 @@ export function TransferPanel() { return } + const isTokenApprovalRequired = + await cctpTransferStarter.requiresTokenApproval({ + amount: amountBigNumber, + owner: await signer.getAddress() + }) + + if (isTokenApprovalRequired) { + const userConfirmation = await confirmDialog('approve_token') + if (!userConfirmation) return false + + if (isSmartContractWallet) { + showDelayedSmartContractTxRequest() + } + try { + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } + const tx = await cctpTransferStarter.approveToken({ + signer, + amount: amountBigNumber + }) + + await tx.wait() + } catch (error) { + if (isUserRejectedError(error)) { + return + } + handleError({ + error, + label: 'cctp_approve_token', + category: 'token_approval' + }) + errorToast( + `USDC approval transaction failed: ${ + (error as Error)?.message ?? error + }` + ) + return + } + } + let depositForBurnTx try { if (isSmartContractWallet) { showDelayedSmartContractTxRequest() } + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const transfer = await cctpTransferStarter.transfer({ amount: amountBigNumber, signer, @@ -626,6 +711,15 @@ export function TransferPanel() { } try { + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const tx = await lifiTransferStarter.approveToken({ signer, amount: amountBigNumber @@ -653,6 +747,15 @@ export function TransferPanel() { showDelayedSmartContractTxRequest() } + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const transfer = await lifiTransferStarter.transfer({ amount: amountBigNumber, signer, @@ -777,6 +880,15 @@ export function TransferPanel() { } try { + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const tx = await oftTransferStarter.approveToken({ signer, amount: amountBigNumber @@ -804,6 +916,15 @@ export function TransferPanel() { showDelayedSmartContractTxRequest() } + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const transfer = await oftTransferStarter.transfer({ amount: amountBigNumber, signer, @@ -984,6 +1105,15 @@ export function TransferPanel() { const userConfirmation = await confirmDialog('approve_custom_fee_token') if (!userConfirmation) return false + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const approvalTx = await bridgeTransferStarter.approveNativeCurrency({ signer, amount: amountBigNumber, @@ -1060,6 +1190,15 @@ export function TransferPanel() { if (isSmartContractWallet && isWithdrawal) { showDelayInSmartContractTransaction() } + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const approvalTx = await bridgeTransferStarter.approveToken({ signer, amount: amountBigNumber @@ -1111,6 +1250,16 @@ export function TransferPanel() { } // finally, call the transfer function + + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } const transfer = await bridgeTransferStarter.transfer({ amount: amountBigNumber, signer, @@ -1293,7 +1442,15 @@ export function TransferPanel() { amount2: isBatchTransfer ? Number(amount2) : undefined, version: 2 }) - await switchChainAsync({ chainId: sourceChainId }) + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId, + switchChainAsync + })) + ) { + return networkConnectionWarningToast() + } } } catch (error) { if (isUserRejectedError(error)) { From 8a3410f6c65278e299c9032a1348a0b67f218f60 Mon Sep 17 00:00:00 2001 From: Christophe Date: Tue, 3 Jun 2025 11:31:45 +0000 Subject: [PATCH 2/8] Use signer rather than latestChain --- .../TransferPanel/TransferPanel.tsx | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index 99bd5ccb7b..d08c65bf5a 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -516,7 +516,7 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -555,7 +555,7 @@ export function TransferPanel() { } if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -713,7 +713,7 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -749,7 +749,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -882,7 +882,7 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -918,7 +918,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1107,7 +1107,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1192,7 +1192,7 @@ export function TransferPanel() { } if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1253,7 +1253,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId,, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1425,6 +1425,10 @@ export function TransferPanel() { trackTransferButtonClick() + if (!signer) { + throw new Error(signerUndefinedError) + } + try { setTransferring(true) if (isConnectedToTheWrongChain) { @@ -1444,7 +1448,7 @@ export function TransferPanel() { }) if ( !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, + currentChainId: signer.provider.network.chainId, sourceChainId, switchChainAsync })) From 29f1ec3306f05ddaebadfff79d4f9cd92b569e50 Mon Sep 17 00:00:00 2001 From: Christophe Date: Tue, 3 Jun 2025 11:34:47 +0000 Subject: [PATCH 3/8] typo --- .../src/components/TransferPanel/TransferPanel.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index d08c65bf5a..c439350e7b 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -713,7 +713,7 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -749,7 +749,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -882,7 +882,7 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -918,7 +918,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1107,7 +1107,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1192,7 +1192,7 @@ export function TransferPanel() { } if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) @@ -1253,7 +1253,7 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId,, + currentChainId: signer.provider.network.chainId, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) From 8a4ff6eb4ebb5e33cd6fb92f579ddff1af5071a9 Mon Sep 17 00:00:00 2001 From: Christophe Date: Wed, 4 Jun 2025 09:44:19 +0000 Subject: [PATCH 4/8] Return false for any error --- .../src/components/TransferPanel/TransferPanel.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index c439350e7b..105e31fdc2 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -135,10 +135,7 @@ async function ensureCorrectNetwork({ chainId: sourceChainId }) } catch (e) { - // If user reject the switch, stop the transfer - if (isUserRejectedError(e)) { - return false - } + return false } } From e12fe6d590a0c60238669b77a33e1ce7a2be5cdc Mon Sep 17 00:00:00 2001 From: Christophe Date: Wed, 4 Jun 2025 11:17:08 +0000 Subject: [PATCH 5/8] Change toast, get correct current chain id --- .../TransferPanel/TransferPanel.tsx | 115 +++++++++++++----- 1 file changed, 85 insertions(+), 30 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index 105e31fdc2..b907808362 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -116,6 +116,12 @@ const networkConnectionWarningToast = () => { autoClose: false } ) +const wrongChainDetectedWarningToast = (networkName: string) => { + warningToast( + <>Wrong chain detected. Please connect to {networkName} in your wallet. + ) +} + // Returns false if user rejected the network switch and network is still incorrect async function ensureCorrectNetwork({ switchChainAsync, @@ -513,12 +519,14 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const tx = await cctpTransferStarter.approveToken({ signer, @@ -552,12 +560,14 @@ export function TransferPanel() { } if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const transfer = await cctpTransferStarter.transfer({ amount: amountBigNumber, @@ -671,17 +681,27 @@ export function TransferPanel() { const { sourceChainProvider, destinationChainProvider } = networks - const { fromToken, toToken } = getFromAndToTokenAddresses({ - isDepositMode, - selectedToken, - sourceChainId: networks.sourceChain.id - }) - const { transactionRequest } = await getStepTransaction(context.step) if (!isValidTransactionRequest(transactionRequest)) { return } + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) + } + const { fromToken, toToken } = getFromAndToTokenAddresses({ + isDepositMode, + selectedToken, + sourceChainId: networks.sourceChain.id + }) const lifiTransferStarter = new LifiTransferStarter({ destinationChainProvider, sourceChainProvider, @@ -710,12 +730,14 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const tx = await lifiTransferStarter.approveToken({ signer, @@ -746,13 +768,16 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } + const transfer = await lifiTransferStarter.transfer({ amount: amountBigNumber, signer, @@ -854,6 +879,17 @@ export function TransferPanel() { return } + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) + } const oftTransferStarter = new OftV2TransferStarter({ sourceChainProvider, sourceChainErc20Address: isDepositMode @@ -879,12 +915,14 @@ export function TransferPanel() { try { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const tx = await oftTransferStarter.approveToken({ signer, @@ -915,12 +953,14 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const transfer = await oftTransferStarter.transfer({ amount: amountBigNumber, @@ -1012,8 +1052,6 @@ export function TransferPanel() { return } - const childChainName = getNetworkName(childChain.id) - setTransferring(true) try { @@ -1029,6 +1067,19 @@ export function TransferPanel() { const destinationChainId = latestNetworks.current.destinationChain.id + if ( + !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + ) { + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) + } + const childChainName = getNetworkName(childChain.id) + const sourceChainErc20Address = isDepositMode ? selectedToken?.address : selectedToken?.l2Address @@ -1036,7 +1087,6 @@ export function TransferPanel() { const destinationChainErc20Address = isDepositMode ? selectedToken?.l2Address : selectedToken?.address - const bridgeTransferStarter = BridgeTransferStarterFactory.create({ sourceChainId, sourceChainErc20Address, @@ -1104,12 +1154,14 @@ export function TransferPanel() { if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const approvalTx = await bridgeTransferStarter.approveNativeCurrency({ signer, @@ -1189,12 +1241,14 @@ export function TransferPanel() { } if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const approvalTx = await bridgeTransferStarter.approveToken({ signer, @@ -1247,15 +1301,16 @@ export function TransferPanel() { } // finally, call the transfer function - if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId: latestNetworks.current.sourceChain.id, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } const transfer = await bridgeTransferStarter.transfer({ amount: amountBigNumber, @@ -1445,12 +1500,12 @@ export function TransferPanel() { }) if ( !(await ensureCorrectNetwork({ - currentChainId: signer.provider.network.chainId, + currentChainId: latestChain.current?.id, sourceChainId, switchChainAsync })) ) { - return networkConnectionWarningToast() + return wrongChainDetectedWarningToast(getNetworkName(sourceChainId)) } } } catch (error) { From 2d23ac2481645fcff0a6b1702ada788203414b69 Mon Sep 17 00:00:00 2001 From: Christophe Date: Wed, 4 Jun 2025 11:38:36 +0000 Subject: [PATCH 6/8] Enforce sourceChainid in transfer --- .../src/token-bridge-sdk/CctpTransferStarter.ts | 3 ++- .../src/token-bridge-sdk/LifiTransferStarter.ts | 3 ++- .../src/token-bridge-sdk/OftV2TransferStarter.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/CctpTransferStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/CctpTransferStarter.ts index 6b80b4fe08..44601076ef 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/CctpTransferStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/CctpTransferStarter.ts @@ -132,7 +132,8 @@ export class CctpTransferStarter extends BridgeTransferStarter { targetChainDomain, mintRecipient, usdcContractAddress - ] + ], + chainId: await this.getSourceChainId() }) } diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/LifiTransferStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/LifiTransferStarter.ts index c923f72f41..198fa97af3 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/LifiTransferStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/LifiTransferStarter.ts @@ -135,7 +135,8 @@ export class LifiTransferStarter extends BridgeTransferStarter { const tx = await sendTransaction(wagmiConfig, { to: this.lifiData.transactionRequest.to as Address, data: this.lifiData.transactionRequest.data as Address, - value: BigInt(this.lifiData.transactionRequest.value) + value: BigInt(this.lifiData.transactionRequest.value), + chainId: (await this.sourceChainProvider.getNetwork()).chainId }) return { diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/OftV2TransferStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/OftV2TransferStarter.ts index 4884527934..ffaa1d552a 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/OftV2TransferStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/OftV2TransferStarter.ts @@ -76,6 +76,7 @@ async function prepareTransferConfig({ quoteFee, from as Address ], + chainId: sourceChainId, value: quoteFee.nativeFee }) } From e1acb4e385517d49d670e348cb1ad67e8906e39e Mon Sep 17 00:00:00 2001 From: Christophe Date: Wed, 4 Jun 2025 13:27:53 +0000 Subject: [PATCH 7/8] Remove unecessary check --- .../TransferPanel/TransferPanel.tsx | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index b907808362..058318bcdf 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -686,17 +686,6 @@ export function TransferPanel() { return } - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { - return wrongChainDetectedWarningToast( - getNetworkName(latestNetworks.current.sourceChain.id) - ) - } const { fromToken, toToken } = getFromAndToTokenAddresses({ isDepositMode, selectedToken, @@ -879,17 +868,6 @@ export function TransferPanel() { return } - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { - return wrongChainDetectedWarningToast( - getNetworkName(latestNetworks.current.sourceChain.id) - ) - } const oftTransferStarter = new OftV2TransferStarter({ sourceChainProvider, sourceChainErc20Address: isDepositMode @@ -1067,17 +1045,6 @@ export function TransferPanel() { const destinationChainId = latestNetworks.current.destinationChain.id - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { - return wrongChainDetectedWarningToast( - getNetworkName(latestNetworks.current.sourceChain.id) - ) - } const childChainName = getNetworkName(childChain.id) const sourceChainErc20Address = isDepositMode From 7cfa4d9f917e2be06d996371d9dc4cf1db12adab Mon Sep 17 00:00:00 2001 From: Christophe Date: Mon, 9 Jun 2025 09:44:08 +0000 Subject: [PATCH 8/8] Use utility function --- .../TransferPanel/TransferPanel.tsx | 92 +++++-------------- 1 file changed, 21 insertions(+), 71 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx index 058318bcdf..8c47a22587 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -411,6 +411,14 @@ export function TransferPanel() { return true } + async function isOnCorrectNetworks() { + return !(await ensureCorrectNetwork({ + currentChainId: latestChain.current?.id, + sourceChainId: latestNetworks.current.sourceChain.id, + switchChainAsync + })) + } + const stepExecutor: UiDriverStepExecutor = async (context, step) => { if (process.env.NODE_ENV === 'development') { console.log(step) @@ -517,13 +525,7 @@ export function TransferPanel() { showDelayedSmartContractTxRequest() } try { - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -558,13 +560,7 @@ export function TransferPanel() { if (isSmartContractWallet) { showDelayedSmartContractTxRequest() } - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -717,13 +713,7 @@ export function TransferPanel() { } try { - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -755,13 +745,7 @@ export function TransferPanel() { showDelayedSmartContractTxRequest() } - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -891,13 +875,7 @@ export function TransferPanel() { } try { - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -929,13 +907,7 @@ export function TransferPanel() { showDelayedSmartContractTxRequest() } - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -1119,13 +1091,7 @@ export function TransferPanel() { const userConfirmation = await confirmDialog('approve_custom_fee_token') if (!userConfirmation) return false - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -1206,13 +1172,7 @@ export function TransferPanel() { if (isSmartContractWallet && isWithdrawal) { showDelayInSmartContractTransaction() } - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -1268,13 +1228,7 @@ export function TransferPanel() { } // finally, call the transfer function - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId: latestNetworks.current.sourceChain.id, - switchChainAsync - })) - ) { + if (!(await isOnCorrectNetworks())) { return wrongChainDetectedWarningToast( getNetworkName(latestNetworks.current.sourceChain.id) ) @@ -1465,14 +1419,10 @@ export function TransferPanel() { amount2: isBatchTransfer ? Number(amount2) : undefined, version: 2 }) - if ( - !(await ensureCorrectNetwork({ - currentChainId: latestChain.current?.id, - sourceChainId, - switchChainAsync - })) - ) { - return wrongChainDetectedWarningToast(getNetworkName(sourceChainId)) + if (!(await isOnCorrectNetworks())) { + return wrongChainDetectedWarningToast( + getNetworkName(latestNetworks.current.sourceChain.id) + ) } } } catch (error) {