From e9effa6cfa97eb7b4e199a09a713992d2bc4f18a Mon Sep 17 00:00:00 2001 From: Fionna <13184582+fionnachan@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:09:04 +0100 Subject: [PATCH] update --- .../src/token-bridge-sdk/Erc20DepositStarter.ts | 7 +++++++ .../src/token-bridge-sdk/Erc20TeleportStarter.ts | 7 +++++++ .../src/token-bridge-sdk/Erc20WithdrawalStarter.ts | 6 ++++++ .../src/token-bridge-sdk/EthDepositStarter.ts | 5 +++++ .../src/token-bridge-sdk/EthTeleportStarter.ts | 5 +++++ .../src/token-bridge-sdk/EthWithdrawalStarter.ts | 7 +++++++ .../src/token-bridge-sdk/utils.ts | 2 +- .../arb-token-bridge-ui/src/util/AddressUtils.ts | 13 +++++++++++-- 8 files changed, 49 insertions(+), 3 deletions(-) diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20DepositStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20DepositStarter.ts index 98719e852f..9eba8d5eee 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20DepositStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20DepositStarter.ts @@ -23,6 +23,7 @@ import { validateSignerChainId } from './utils' import { depositTokenEstimateGas } from '../util/TokenDepositUtils' +import { addressIsSmartContract } from '../util/AddressUtils' // https://github.com/OffchainLabs/arbitrum-sdk/blob/main/src/lib/message/L1ToL2MessageGasEstimator.ts#L33 export const DEFAULT_GAS_PRICE_PERCENT_INCREASE = BigNumber.from(500) @@ -321,6 +322,12 @@ export class Erc20DepositStarter extends BridgeTransferStarter { const depositToAddress = depositRequest.txRequest.to.toLowerCase() + if (!addressIsSmartContract(depositToAddress, this.sourceChainProvider)) { + throw new Error( + `Parent chain token gateway router address provided is not a smart contract address.` + ) + } + const parentGatewayRouterAddressForChain = getArbitrumNetwork( destinationChainId diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20TeleportStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20TeleportStarter.ts index f0d2630a84..14619e6348 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20TeleportStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20TeleportStarter.ts @@ -18,6 +18,7 @@ import { validateSignerChainId } from './utils' import { getL2ConfigForTeleport } from './teleport' +import { addressIsSmartContract } from '../util/AddressUtils' export class Erc20TeleportStarter extends BridgeTransferStarter { public transferType: TransferType = 'erc20_teleport' @@ -200,6 +201,12 @@ export class Erc20TeleportStarter extends BridgeTransferStarter { const depositToAddress = depositRequest.txRequest.to.toLowerCase() + if (!addressIsSmartContract(depositToAddress, this.sourceChainProvider)) { + throw new Error( + `Teleporter transfer address provided is not a smart contract address.` + ) + } + const l1TeleporterAddress = l1l3Bridger.l2Network.teleporter?.l1Teleporter.toLowerCase() diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20WithdrawalStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20WithdrawalStarter.ts index 1cf9814fa7..5f40a3d411 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20WithdrawalStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/Erc20WithdrawalStarter.ts @@ -227,6 +227,12 @@ export class Erc20WithdrawalStarter extends BridgeTransferStarter { const withdrawToAddress = request.txRequest.to.toLowerCase() + if (!addressIsSmartContract(withdrawToAddress, this.sourceChainProvider)) { + throw new Error( + `Child chain token gateway router address provided is not a smart contract address.` + ) + } + const childGatewayRouterAddressForChain = getArbitrumNetwork( sourceChainId diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthDepositStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthDepositStarter.ts index 8ae057ec40..0015991e21 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthDepositStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthDepositStarter.ts @@ -18,6 +18,7 @@ import { depositEthEstimateGas } from '../util/EthDepositUtils' import { fetchErc20Allowance } from '../util/TokenUtils' import { isExperimentalFeatureEnabled } from '../util' import { isCustomDestinationAddressTx } from '../state/app/utils' +import { addressIsSmartContract } from '../util/AddressUtils' export class EthDepositStarter extends BridgeTransferStarter { public transferType: TransferType = 'eth_deposit' @@ -151,6 +152,10 @@ export class EthDepositStarter extends BridgeTransferStarter { const depositToAddress = depositRequest.txRequest.to.toLowerCase() + if (!addressIsSmartContract(depositToAddress, this.sourceChainProvider)) { + throw new Error(`Inbox address provided is not a smart contract address.`) + } + const inboxAddressForChain = getArbitrumNetwork(destinationChainId).ethBridge.inbox.toLowerCase() diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthTeleportStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthTeleportStarter.ts index 1dcd5ffca5..c1bb23cdb3 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthTeleportStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthTeleportStarter.ts @@ -14,6 +14,7 @@ import { percentIncrease, validateSignerChainId } from './utils' +import { addressIsSmartContract } from '../util/AddressUtils' export class EthTeleportStarter extends BridgeTransferStarter { public transferType: TransferType = 'eth_teleport' @@ -131,6 +132,10 @@ export class EthTeleportStarter extends BridgeTransferStarter { const depositToAddress = depositRequest.txRequest.to.toLowerCase() + if (!addressIsSmartContract(depositToAddress, this.sourceChainProvider)) { + throw new Error(`Inbox address provided is not a smart contract address.`) + } + const inboxAddressForChain = l1l3Bridger.l2Network.ethBridge.inbox.toLowerCase() diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthWithdrawalStarter.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthWithdrawalStarter.ts index 8e27d55d3c..6aa1abe254 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthWithdrawalStarter.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/EthWithdrawalStarter.ts @@ -14,6 +14,7 @@ import { } from './utils' import { withdrawInitTxEstimateGas } from '../util/WithdrawalUtils' import { isExperimentalFeatureEnabled } from '../util' +import { addressIsSmartContract } from '../util/AddressUtils' export class EthWithdrawalStarter extends BridgeTransferStarter { public transferType: TransferType = 'eth_withdrawal' @@ -77,6 +78,12 @@ export class EthWithdrawalStarter extends BridgeTransferStarter { const withdrawToAddress = request.txRequest.to + if (!addressIsSmartContract(withdrawToAddress, this.sourceChainProvider)) { + throw new Error( + `Native currency withdrawal request address is not a smart contract address.` + ) + } + if (withdrawToAddress.toLowerCase() !== ARB_SYS_ADDRESS.toLowerCase()) { throw new Error( `Native currency withdrawal request address must be the ArbSys address ${ARB_SYS_ADDRESS} instead of ${withdrawToAddress}.` diff --git a/packages/arb-token-bridge-ui/src/token-bridge-sdk/utils.ts b/packages/arb-token-bridge-ui/src/token-bridge-sdk/utils.ts index ba04be1f2a..b9ca7825c5 100644 --- a/packages/arb-token-bridge-ui/src/token-bridge-sdk/utils.ts +++ b/packages/arb-token-bridge-ui/src/token-bridge-sdk/utils.ts @@ -138,7 +138,7 @@ export async function validateSignerChainId({ if (signerChainId !== sourceChainId) { throw new Error( - `Signer is on chain ${signerChainId} but should be on chain ${sourceChainId}.` + `Signer is on chain ${signerChainId} but should be on chain ${sourceChainId}. Please try again after connecting to the correct chain in your wallet.` ) } } diff --git a/packages/arb-token-bridge-ui/src/util/AddressUtils.ts b/packages/arb-token-bridge-ui/src/util/AddressUtils.ts index 4f33e3da77..a9c4368337 100644 --- a/packages/arb-token-bridge-ui/src/util/AddressUtils.ts +++ b/packages/arb-token-bridge-ui/src/util/AddressUtils.ts @@ -1,10 +1,19 @@ +import { Provider } from '@ethersproject/providers' + import { getAPIBaseUrl } from '.' import { getProviderForChainId } from '../token-bridge-sdk/utils' export type Address = `0x${string}` -export async function addressIsSmartContract(address: string, chainId: number) { - const provider = getProviderForChainId(chainId) +export async function addressIsSmartContract( + address: string, + chainIdOrProvider: number | Provider +) { + const provider = + typeof chainIdOrProvider === 'number' + ? getProviderForChainId(chainIdOrProvider) + : chainIdOrProvider + try { return (await provider.getCode(address)).length > 2 } catch (_) {