From 9e6543dc554f3970e9579ba32bfd1f4618ffed02 Mon Sep 17 00:00:00 2001 From: spsjvc Date: Fri, 13 Jun 2025 12:58:56 +0200 Subject: [PATCH 1/3] refactor: add wagmi tx step type for to driver --- .../TransferPanel/TransferPanel.tsx | 29 +++++++++++++++++++ .../src/ui-driver/UiDriver.ts | 10 ++++++- .../src/ui-driver/UiDriverCommon.ts | 26 +++++++++++++++++ 3 files changed, 64 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 3e1dd3f923..0ed272902f 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -4,6 +4,7 @@ import Tippy from '@tippyjs/react' import { constants, utils } from 'ethers' import { useLatest } from 'react-use' import { useAccount, useConfig } from 'wagmi' +import { writeContract } from '@wagmi/core' import { TransactionResponse } from '@ethersproject/providers' import { twMerge } from 'tailwind-merge' import { scaleFrom18DecimalsToNativeTokenDecimals } from '@arbitrum/sdk' @@ -430,6 +431,34 @@ export function TransferPanel() { return { error: error as unknown as Error } } } + + case 'tx_wagmi': { + try { + const txHash = await writeContract( + wagmiConfig, + step.payload.txRequest + ) + const txReceipt = + await context.transferStarter.sourceChainProvider.waitForTransaction( + txHash + ) + + return { data: txReceipt } + } catch (error) { + // capture error and show toast for anything that's not user rejecting error + if (!isUserRejectedError(error)) { + handleError({ + error, + label: step.payload.txRequestLabel, + category: 'transaction_signing' + }) + + errorToast(`${(error as Error)?.message ?? error}`) + } + + return { error: error as unknown as Error } + } + } } } diff --git a/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts b/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts index 6cc929cfd8..56b0c7e20a 100644 --- a/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts +++ b/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts @@ -1,5 +1,6 @@ import { BigNumber, providers } from 'ethers' import { BridgeTransferStarter } from '@/token-bridge-sdk/BridgeTransferStarter' +import { SimulateContractReturnType } from '@wagmi/core' import { DialogType } from '../components/common/Dialog2' @@ -32,6 +33,13 @@ export type UiDriverStep = txRequestLabel: string } } + | { + type: 'tx_wagmi' + payload: { + txRequest: SimulateContractReturnType['request'] + txRequestLabel: string + } + } export type UiDriverStepType = UiDriverStep['type'] @@ -55,7 +63,7 @@ export type UiDriverStepResultFor = ? boolean : TStepType extends 'scw_tooltip' ? void - : TStepType extends 'tx_ethers' + : TStepType extends 'tx_ethers' | 'tx_wagmi' ? Result : never diff --git a/packages/arb-token-bridge-ui/src/ui-driver/UiDriverCommon.ts b/packages/arb-token-bridge-ui/src/ui-driver/UiDriverCommon.ts index 4de623071a..2e9b8faea2 100644 --- a/packages/arb-token-bridge-ui/src/ui-driver/UiDriverCommon.ts +++ b/packages/arb-token-bridge-ui/src/ui-driver/UiDriverCommon.ts @@ -61,3 +61,29 @@ export const stepGeneratorForTransactionEthers: UiDriverStepGeneratorForTransact return data } } + +export type UiDriverStepGeneratorForTransactionWagmi< + TStep extends UiDriverStep = UiDriverStep +> = ( + context: UiDriverContext, + payload: UiDriverStepPayloadFor<'tx_wagmi'> +) => AsyncGenerator< + TStep, + providers.TransactionReceipt | void, + UiDriverStepResultFor +> + +export const stepGeneratorForTransactionWagmi: UiDriverStepGeneratorForTransactionWagmi = + async function* (context, payload) { + if (context.isSmartContractWallet) { + yield* step({ type: 'scw_tooltip' }) + } + + const { error, data } = yield* step({ type: 'tx_wagmi', payload }) + + if (typeof error !== 'undefined') { + yield* step({ type: 'return' }) + } else { + return data + } + } From 4e1df3b2b3a86a7cc453f8443bd5123d94cf2f5d Mon Sep 17 00:00:00 2001 From: spsjvc Date: Mon, 16 Jun 2025 14:08:30 +0200 Subject: [PATCH 2/3] add fn --- .../TransferPanel/TransferPanel.tsx | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 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 0ed272902f..df8d3852c1 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -384,6 +384,21 @@ export function TransferPanel() { return true } + const handleTxSigningError = (error: unknown, txRequestLabel: string) => { + // capture error and show toast for anything that's not user rejecting error + if (!isUserRejectedError(error)) { + handleError({ + error, + label: txRequestLabel, + category: 'transaction_signing' + }) + + errorToast(`${(error as Error)?.message ?? error}`) + } + + return { error: error as unknown as Error } + } + const stepExecutor: UiDriverStepExecutor = async (context, step) => { if (process.env.NODE_ENV === 'development') { console.log(step) @@ -417,18 +432,7 @@ export function TransferPanel() { return { data: txReceipt } } catch (error) { - // capture error and show toast for anything that's not user rejecting error - if (!isUserRejectedError(error)) { - handleError({ - error, - label: step.payload.txRequestLabel, - category: 'transaction_signing' - }) - - errorToast(`${(error as Error)?.message ?? error}`) - } - - return { error: error as unknown as Error } + return handleTxSigningError(error, step.payload.txRequestLabel) } } @@ -445,18 +449,7 @@ export function TransferPanel() { return { data: txReceipt } } catch (error) { - // capture error and show toast for anything that's not user rejecting error - if (!isUserRejectedError(error)) { - handleError({ - error, - label: step.payload.txRequestLabel, - category: 'transaction_signing' - }) - - errorToast(`${(error as Error)?.message ?? error}`) - } - - return { error: error as unknown as Error } + return handleTxSigningError(error, step.payload.txRequestLabel) } } } From 9433b071846882138d00adf0771eaa4869a6d3c0 Mon Sep 17 00:00:00 2001 From: spsjvc Date: Mon, 16 Jun 2025 14:10:18 +0200 Subject: [PATCH 3/3] fix --- .../src/components/TransferPanel/TransferPanel.tsx | 2 +- packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts | 2 +- 2 files changed, 2 insertions(+), 2 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 df8d3852c1..b9542246b1 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanel.tsx @@ -440,7 +440,7 @@ export function TransferPanel() { try { const txHash = await writeContract( wagmiConfig, - step.payload.txRequest + step.payload.txRequest.request ) const txReceipt = await context.transferStarter.sourceChainProvider.waitForTransaction( diff --git a/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts b/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts index 56b0c7e20a..d2007af501 100644 --- a/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts +++ b/packages/arb-token-bridge-ui/src/ui-driver/UiDriver.ts @@ -36,7 +36,7 @@ export type UiDriverStep = | { type: 'tx_wagmi' payload: { - txRequest: SimulateContractReturnType['request'] + txRequest: SimulateContractReturnType txRequestLabel: string } }