From 5b8a9f99e43d92f3d89932d16d10f436918181c3 Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Mon, 15 Apr 2024 19:57:54 +0800 Subject: [PATCH 01/13] support merege token withraw --- .../common/input/TransactionWithdraw.vue | 11 + composables/transaction/useAllowance.ts | 7 +- composables/zksync/useFee.ts | 2 + composables/zksync/useTransaction.ts | 2 + utils/constants.ts | 4 +- views/transactions/Withdraw.vue | 333 +++++++++++--- zksync-web3-nova/abi/IL2Bridge.json | 123 +++++- zksync-web3-nova/src/adapters.ts | 1 + zksync-web3-nova/src/provider.ts | 8 +- zksync-web3-nova/typechain/IL2Bridge.d.ts | 409 +++++++++++++----- .../typechain/IL2BridgeFactory.ts | 23 + 11 files changed, 753 insertions(+), 170 deletions(-) diff --git a/components/common/input/TransactionWithdraw.vue b/components/common/input/TransactionWithdraw.vue index b80e8fbb..86a9c918 100644 --- a/components/common/input/TransactionWithdraw.vue +++ b/components/common/input/TransactionWithdraw.vue @@ -56,6 +56,9 @@ Input amount exceeds the merge limit. + + The input amount exceeds the USDC.Arbitrum amount locked in the merge token contract. Consider withdrawing to another network or reducing the input. + Max amount is { if(props.mergeLimitExceeds) { return 'exceeds_merge_limit' } + if(props.mergeWithdrawalLimitExceeds) { + return 'exceeds_merge_withdrawal_limit' + } if (!selectedToken.value) return; if (tokenBalance.value && totalComputeAmount.value.gt(tokenBalance.value.amount)) { return "exceeds_balance"; diff --git a/composables/transaction/useAllowance.ts b/composables/transaction/useAllowance.ts index 8cf588b0..addbde6f 100644 --- a/composables/transaction/useAllowance.ts +++ b/composables/transaction/useAllowance.ts @@ -41,7 +41,12 @@ export default ( ); const requestAllowance = async () => { - if (accountAddress.value && tokenAddress.value && tokenAddress.value !== ETH_TOKEN.l1Address) { + if ( + accountAddress.value && + tokenAddress.value && + tokenAddress.value !== ETH_TOKEN.l1Address && + tokenAddress.value !== ETH_TOKEN.address + ) { await getAllowance(); } else { reset(); diff --git a/composables/zksync/useFee.ts b/composables/zksync/useFee.ts index da276e37..03cbcdc2 100644 --- a/composables/zksync/useFee.ts +++ b/composables/zksync/useFee.ts @@ -15,6 +15,7 @@ export type FeeEstimationParams = { from: string; to: string; tokenAddress: string; + isMergeToken?: boolean; }; export default ( @@ -66,6 +67,7 @@ export default ( to: params.to, token: params.tokenAddress === ETH_TOKEN.address ? ETH_TOKEN.l1Address! : params.tokenAddress, amount: "1", + isMergeToken: params.isMergeToken, }); }), ]); diff --git a/composables/zksync/useTransaction.ts b/composables/zksync/useTransaction.ts index c0063f51..36430aee 100644 --- a/composables/zksync/useTransaction.ts +++ b/composables/zksync/useTransaction.ts @@ -15,6 +15,7 @@ type TransactionParams = { to: string; tokenAddress: string; amount: BigNumberish; + isMergeToken?: boolean; }; // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -59,6 +60,7 @@ export default (getSigner: () => Promise, getProvider: () => to: transaction.to, token: transaction.tokenAddress === ETH_TOKEN.address ? ETH_TOKEN.l1Address! : transaction.tokenAddress, amount: transaction.amount, + isMergeToken: transaction.isMergeToken, bridgeAddress, overrides: { gasPrice: fee.gasPrice, diff --git a/utils/constants.ts b/utils/constants.ts index dea0f351..9934412e 100644 --- a/utils/constants.ts +++ b/utils/constants.ts @@ -39,5 +39,7 @@ export const MERGE_TOKENS = [ ]; export const isMergeToken = (address: string) => { - return address && MERGE_TOKENS.some((token) => token.address.toLowerCase() === address.toLowerCase()); + return address ? MERGE_TOKENS.some((token) => token.address.toLowerCase() === address.toLowerCase()) : false; }; + +export const MergeTokenContractUrl = "https://explorer.zklink.io/address/0x83FD59FD58C6A5E6eA449e5400D02803875e1104" \ No newline at end of file diff --git a/views/transactions/Withdraw.vue b/views/transactions/Withdraw.vue index 2d851810..6fdbb7ab 100644 --- a/views/transactions/Withdraw.vue +++ b/views/transactions/Withdraw.vue @@ -54,6 +54,7 @@ :balances="availableBalances" :max-amount="maxAmount" :loading="tokensRequestInProgress || balanceInProgress" + :merge-withdrawal-limit-exceeds="mergeTokenWithdrawalLimitExceeds" > @@ -175,11 +176,11 @@ class="mb-block-padding-1/2 sm:mb-block-gap" > - You will be able to claim your withdrawal only after a {{WITHDRAWAL_DELAY_DAYS}}-day withdrawal delay. + You will be able to claim your withdrawal only after a {{ WITHDRAWAL_DELAY_DAYS }}-day withdrawal delay. - You will receive funds only after a {{WITHDRAWAL_DELAY_DAYS}}-day withdrawal delay. + You will receive funds only after a {{ WITHDRAWAL_DELAY_DAYS }}-day withdrawal delay. @@ -252,10 +253,20 @@ - - Withdrawal of Merged Tokens + + + + Withdrawal of Merged {{ selectedToken?.symbol }} to {{ selectedNetwork.l1Network?.name }} + - The zkLink Nova Portal currently doesn't facilitate withdrawing merged tokens. You can redeem your merged tokens back to the source token at https://zklink.io/merge/ and then proceed with the withdrawal. + Please be aware that there are currently {{ mergeTokenLockedBalance }} {{ selectedToken?.symbol }}.{{ + selectedNetwork.l1Network?.name + }} + tokens locked in the + token merge contract + . Therefore, the available withdrawal amount for merged USDC to Linea is {{ mergeTokenLockedBalance }} @@ -263,19 +274,110 @@ + + + + + + + {{ selectedToken?.symbol }} allowance approved + + View on Explorer + + + + + + + + + + + + Approve {{ selectedToken?.symbol }} allowance + + View on Explorer + + + + + Before depositing you need to give our deposit permission to spend specified amount of + {{ selectedToken?.symbol }}. + You can deposit up to + + {{ parseTokenAmount(allowance!, selectedToken!.decimals) }} + + {{ selectedToken!.symbol }} without approving a new allowance. + + + Learn more + + + + + + + + + + - - {{ isMergeTokenSelected ? "Redeem Now" : "Continue" }} - + + + + + Processing... + Waiting for allowance approval confirmation + + + Approving allowance... + + Approve {{ selectedToken?.symbol }} allowance + + + + + + {{ "Continue" }} + + @@ -322,7 +424,10 @@ - + @@ -331,12 +436,19 @@ diff --git a/zksync-web3-nova/abi/IL2Bridge.json b/zksync-web3-nova/abi/IL2Bridge.json index f1b9d3ca..2a42b142 100644 --- a/zksync-web3-nova/abi/IL2Bridge.json +++ b/zksync-web3-nova/abi/IL2Bridge.json @@ -3,6 +3,17 @@ "contractName": "IL2Bridge", "sourceName": "cache-zk/solpp-generated-contracts/bridge/interfaces/IL2Bridge.sol", "abi": [ + { + "inputs": [ + { + "internalType": "contract IMergeTokenPortal", + "name": "_mergeTokenPortal", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "inputs": [], "name": "FunctionNotSupported", @@ -76,6 +87,19 @@ "name": "FinalizeDepositToMerge", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -107,6 +131,42 @@ "name": "WithdrawalInitiated", "type": "event" }, + { + "inputs": [], + "name": "MERGE_TOKEN_PORTAL", + "outputs": [ + { + "internalType": "contract IMergeTokenPortal", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l2Token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_l2Receiver", + "type": "address" + } + ], + "name": "depositToMerge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -173,6 +233,29 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Bridge", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_l2TokenProxyBytecodeHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_governor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "l1Bridge", @@ -190,7 +273,7 @@ "inputs": [ { "internalType": "address", - "name": "_l2Token", + "name": "l2TokenAddress", "type": "address" } ], @@ -198,7 +281,7 @@ "outputs": [ { "internalType": "address", - "name": "", + "name": "l1TokenAddress", "type": "address" } ], @@ -224,6 +307,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "l2TokenBeacon", + "outputs": [ + { + "internalType": "contract UpgradeableBeacon", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -246,6 +342,29 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_l1Receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "_l2Token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdrawFromMerge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], "bytecode": "0x", diff --git a/zksync-web3-nova/src/adapters.ts b/zksync-web3-nova/src/adapters.ts index 92a016e7..d774f228 100644 --- a/zksync-web3-nova/src/adapters.ts +++ b/zksync-web3-nova/src/adapters.ts @@ -820,6 +820,7 @@ export function AdapterL2>(Base: TBase) { async withdraw(transaction: { token: Address; amount: BigNumberish; + isMergeToken?: boolean; to?: Address; bridgeAddress?: Address; overrides?: ethers.Overrides; diff --git a/zksync-web3-nova/src/provider.ts b/zksync-web3-nova/src/provider.ts index a10216c0..859147b3 100644 --- a/zksync-web3-nova/src/provider.ts +++ b/zksync-web3-nova/src/provider.ts @@ -311,7 +311,7 @@ export class Provider extends ethers.providers.JsonRpcProvider { return this.networkKey === "blast"; } isLineaChain(): boolean { - return this.isPrimaryChain() + return this.isPrimaryChain(); } isZkSyncChain(): boolean { return this.networkKey === "zksync"; @@ -433,6 +433,7 @@ export class Provider extends ethers.providers.JsonRpcProvider { async getWithdrawTx(transaction: { token: Address; amount: BigNumberish; + isMergeToken?: boolean; from?: Address; to?: Address; bridgeAddress?: Address; @@ -483,12 +484,15 @@ export class Provider extends ethers.providers.JsonRpcProvider { } const bridge = IL2BridgeFactory.connect(tx.bridgeAddress!, this); - return bridge.populateTransaction.withdraw(tx.to!, tx.token, tx.amount, tx.overrides); + return transaction.isMergeToken + ? bridge.populateTransaction.withdrawFromMerge(tx.to!, tx.token, tx.amount, tx.overrides) + : bridge.populateTransaction.withdraw(tx.to!, tx.token, tx.amount, tx.overrides); } async estimateGasWithdraw(transaction: { token: Address; amount: BigNumberish; + isMergeToken?: boolean; from?: Address; to?: Address; bridgeAddress?: Address; diff --git a/zksync-web3-nova/typechain/IL2Bridge.d.ts b/zksync-web3-nova/typechain/IL2Bridge.d.ts index 6e920fcf..85392e16 100644 --- a/zksync-web3-nova/typechain/IL2Bridge.d.ts +++ b/zksync-web3-nova/typechain/IL2Bridge.d.ts @@ -2,35 +2,29 @@ /* tslint:disable */ /* eslint-disable */ -import { - ethers, - EventFilter, - Signer, - BigNumber, - BigNumberish, - PopulatedTransaction, -} from "ethers"; -import { - Contract, - ContractTransaction, - Overrides, - PayableOverrides, - CallOverrides, -} from "@ethersproject/contracts"; +import { ethers, EventFilter, Signer, BigNumber, BigNumberish, PopulatedTransaction } from "ethers"; +import { Contract, ContractTransaction, Overrides, PayableOverrides, CallOverrides } from "@ethersproject/contracts"; import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; -interface IL2BridgeInterface extends ethers.utils.Interface { +interface L2ERC20BridgeInterface extends ethers.utils.Interface { functions: { + "MERGE_TOKEN_PORTAL()": FunctionFragment; + "depositToMerge(address,uint256,address)": FunctionFragment; "finalizeDeposit(address,address,address,uint256,bytes)": FunctionFragment; "finalizeDepositToMerge(address,address,address,uint256,bytes)": FunctionFragment; + "initialize(address,bytes32,address)": FunctionFragment; "l1Bridge()": FunctionFragment; "l1TokenAddress(address)": FunctionFragment; "l2TokenAddress(address)": FunctionFragment; + "l2TokenBeacon()": FunctionFragment; "withdraw(address,address,uint256)": FunctionFragment; + "withdrawFromMerge(address,address,uint256)": FunctionFragment; }; + encodeFunctionData(functionFragment: "MERGE_TOKEN_PORTAL", values?: undefined): string; + encodeFunctionData(functionFragment: "depositToMerge", values: [string, BigNumberish, string]): string; encodeFunctionData( functionFragment: "finalizeDeposit", values: [string, string, string, BigNumberish, BytesLike] @@ -39,51 +33,40 @@ interface IL2BridgeInterface extends ethers.utils.Interface { functionFragment: "finalizeDepositToMerge", values: [string, string, string, BigNumberish, BytesLike] ): string; + encodeFunctionData(functionFragment: "initialize", values: [string, BytesLike, string]): string; encodeFunctionData(functionFragment: "l1Bridge", values?: undefined): string; - encodeFunctionData( - functionFragment: "l1TokenAddress", - values: [string] - ): string; - encodeFunctionData( - functionFragment: "l2TokenAddress", - values: [string] - ): string; - encodeFunctionData( - functionFragment: "withdraw", - values: [string, string, BigNumberish] - ): string; - - decodeFunctionResult( - functionFragment: "finalizeDeposit", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "finalizeDepositToMerge", - data: BytesLike - ): Result; + encodeFunctionData(functionFragment: "l1TokenAddress", values: [string]): string; + encodeFunctionData(functionFragment: "l2TokenAddress", values: [string]): string; + encodeFunctionData(functionFragment: "l2TokenBeacon", values?: undefined): string; + encodeFunctionData(functionFragment: "withdraw", values: [string, string, BigNumberish]): string; + encodeFunctionData(functionFragment: "withdrawFromMerge", values: [string, string, BigNumberish]): string; + + decodeFunctionResult(functionFragment: "MERGE_TOKEN_PORTAL", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "depositToMerge", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "finalizeDeposit", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "finalizeDepositToMerge", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; decodeFunctionResult(functionFragment: "l1Bridge", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "l1TokenAddress", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "l2TokenAddress", - data: BytesLike - ): Result; + decodeFunctionResult(functionFragment: "l1TokenAddress", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "l2TokenAddress", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "l2TokenBeacon", data: BytesLike): Result; decodeFunctionResult(functionFragment: "withdraw", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "withdrawFromMerge", data: BytesLike): Result; events: { "FinalizeDeposit(address,address,address,uint256)": EventFragment; "FinalizeDepositToMerge(address,address,address,address,uint256)": EventFragment; + "Initialized(uint8)": EventFragment; "WithdrawalInitiated(address,address,address,uint256)": EventFragment; }; getEvent(nameOrSignatureOrTopic: "FinalizeDeposit"): EventFragment; getEvent(nameOrSignatureOrTopic: "FinalizeDepositToMerge"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; getEvent(nameOrSignatureOrTopic: "WithdrawalInitiated"): EventFragment; } -export class IL2Bridge extends Contract { +export class L2ERC20Bridge extends Contract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; deployed(): Promise; @@ -94,9 +77,31 @@ export class IL2Bridge extends Contract { removeAllListeners(eventName: EventFilter | string): this; removeListener(eventName: any, listener: Listener): this; - interface: IL2BridgeInterface; + interface: L2ERC20BridgeInterface; functions: { + MERGE_TOKEN_PORTAL(overrides?: CallOverrides): Promise<{ + 0: string; + }>; + + "MERGE_TOKEN_PORTAL()"(overrides?: CallOverrides): Promise<{ + 0: string; + }>; + + depositToMerge( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + + "depositToMerge(address,uint256,address)"( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + finalizeDeposit( _l1Sender: string, _l2Receiver: string, @@ -133,6 +138,20 @@ export class IL2Bridge extends Contract { overrides?: PayableOverrides ): Promise; + initialize( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + + "initialize(address,bytes32,address)"( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + l1Bridge(overrides?: CallOverrides): Promise<{ 0: string; }>; @@ -142,16 +161,18 @@ export class IL2Bridge extends Contract { }>; l1TokenAddress( - _l2Token: string, + l2TokenAddress: string, overrides?: CallOverrides ): Promise<{ + l1TokenAddress: string; 0: string; }>; "l1TokenAddress(address)"( - _l2Token: string, + l2TokenAddress: string, overrides?: CallOverrides ): Promise<{ + l1TokenAddress: string; 0: string; }>; @@ -169,6 +190,14 @@ export class IL2Bridge extends Contract { 0: string; }>; + l2TokenBeacon(overrides?: CallOverrides): Promise<{ + 0: string; + }>; + + "l2TokenBeacon()"(overrides?: CallOverrides): Promise<{ + 0: string; + }>; + withdraw( _l1Receiver: string, _l2Token: string, @@ -182,8 +211,40 @@ export class IL2Bridge extends Contract { _amount: BigNumberish, overrides?: Overrides ): Promise; + + withdrawFromMerge( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides + ): Promise; + + "withdrawFromMerge(address,address,uint256)"( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides + ): Promise; }; + MERGE_TOKEN_PORTAL(overrides?: CallOverrides): Promise; + + "MERGE_TOKEN_PORTAL()"(overrides?: CallOverrides): Promise; + + depositToMerge( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + + "depositToMerge(address,uint256,address)"( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + finalizeDeposit( _l1Sender: string, _l2Receiver: string, @@ -220,23 +281,35 @@ export class IL2Bridge extends Contract { overrides?: PayableOverrides ): Promise; + initialize( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + + "initialize(address,bytes32,address)"( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + l1Bridge(overrides?: CallOverrides): Promise; "l1Bridge()"(overrides?: CallOverrides): Promise; - l1TokenAddress(_l2Token: string, overrides?: CallOverrides): Promise; + l1TokenAddress(l2TokenAddress: string, overrides?: CallOverrides): Promise; - "l1TokenAddress(address)"( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + "l1TokenAddress(address)"(l2TokenAddress: string, overrides?: CallOverrides): Promise; l2TokenAddress(_l1Token: string, overrides?: CallOverrides): Promise; - "l2TokenAddress(address)"( - _l1Token: string, - overrides?: CallOverrides - ): Promise; + "l2TokenAddress(address)"(_l1Token: string, overrides?: CallOverrides): Promise; + + l2TokenBeacon(overrides?: CallOverrides): Promise; + + "l2TokenBeacon()"(overrides?: CallOverrides): Promise; withdraw( _l1Receiver: string, @@ -252,7 +325,39 @@ export class IL2Bridge extends Contract { overrides?: Overrides ): Promise; + withdrawFromMerge( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides + ): Promise; + + "withdrawFromMerge(address,address,uint256)"( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides + ): Promise; + callStatic: { + MERGE_TOKEN_PORTAL(overrides?: CallOverrides): Promise; + + "MERGE_TOKEN_PORTAL()"(overrides?: CallOverrides): Promise; + + depositToMerge( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: CallOverrides + ): Promise; + + "depositToMerge(address,uint256,address)"( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: CallOverrides + ): Promise; + finalizeDeposit( _l1Sender: string, _l2Receiver: string, @@ -289,38 +394,53 @@ export class IL2Bridge extends Contract { overrides?: CallOverrides ): Promise; + initialize( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: CallOverrides + ): Promise; + + "initialize(address,bytes32,address)"( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: CallOverrides + ): Promise; + l1Bridge(overrides?: CallOverrides): Promise; "l1Bridge()"(overrides?: CallOverrides): Promise; - l1TokenAddress( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + l1TokenAddress(l2TokenAddress: string, overrides?: CallOverrides): Promise; - "l1TokenAddress(address)"( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + "l1TokenAddress(address)"(l2TokenAddress: string, overrides?: CallOverrides): Promise; - l2TokenAddress( - _l1Token: string, - overrides?: CallOverrides - ): Promise; + l2TokenAddress(_l1Token: string, overrides?: CallOverrides): Promise; - "l2TokenAddress(address)"( - _l1Token: string, + "l2TokenAddress(address)"(_l1Token: string, overrides?: CallOverrides): Promise; + + l2TokenBeacon(overrides?: CallOverrides): Promise; + + "l2TokenBeacon()"(overrides?: CallOverrides): Promise; + + withdraw(_l1Receiver: string, _l2Token: string, _amount: BigNumberish, overrides?: CallOverrides): Promise; + + "withdraw(address,address,uint256)"( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, overrides?: CallOverrides - ): Promise; + ): Promise; - withdraw( + withdrawFromMerge( _l1Receiver: string, _l2Token: string, _amount: BigNumberish, overrides?: CallOverrides ): Promise; - "withdraw(address,address,uint256)"( + "withdrawFromMerge(address,address,uint256)"( _l1Receiver: string, _l2Token: string, _amount: BigNumberish, @@ -344,6 +464,8 @@ export class IL2Bridge extends Contract { amount: null ): EventFilter; + Initialized(version: null): EventFilter; + WithdrawalInitiated( l2Sender: string | null, l1Receiver: string | null, @@ -353,6 +475,24 @@ export class IL2Bridge extends Contract { }; estimateGas: { + MERGE_TOKEN_PORTAL(overrides?: CallOverrides): Promise; + + "MERGE_TOKEN_PORTAL()"(overrides?: CallOverrides): Promise; + + depositToMerge( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + + "depositToMerge(address,uint256,address)"( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + finalizeDeposit( _l1Sender: string, _l2Receiver: string, @@ -389,38 +529,53 @@ export class IL2Bridge extends Contract { overrides?: PayableOverrides ): Promise; + initialize( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + + "initialize(address,bytes32,address)"( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + l1Bridge(overrides?: CallOverrides): Promise; "l1Bridge()"(overrides?: CallOverrides): Promise; - l1TokenAddress( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + l1TokenAddress(l2TokenAddress: string, overrides?: CallOverrides): Promise; - "l1TokenAddress(address)"( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + "l1TokenAddress(address)"(l2TokenAddress: string, overrides?: CallOverrides): Promise; - l2TokenAddress( - _l1Token: string, - overrides?: CallOverrides - ): Promise; + l2TokenAddress(_l1Token: string, overrides?: CallOverrides): Promise; - "l2TokenAddress(address)"( - _l1Token: string, - overrides?: CallOverrides + "l2TokenAddress(address)"(_l1Token: string, overrides?: CallOverrides): Promise; + + l2TokenBeacon(overrides?: CallOverrides): Promise; + + "l2TokenBeacon()"(overrides?: CallOverrides): Promise; + + withdraw(_l1Receiver: string, _l2Token: string, _amount: BigNumberish, overrides?: Overrides): Promise; + + "withdraw(address,address,uint256)"( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides ): Promise; - withdraw( + withdrawFromMerge( _l1Receiver: string, _l2Token: string, _amount: BigNumberish, overrides?: Overrides ): Promise; - "withdraw(address,address,uint256)"( + "withdrawFromMerge(address,address,uint256)"( _l1Receiver: string, _l2Token: string, _amount: BigNumberish, @@ -429,6 +584,24 @@ export class IL2Bridge extends Contract { }; populateTransaction: { + MERGE_TOKEN_PORTAL(overrides?: CallOverrides): Promise; + + "MERGE_TOKEN_PORTAL()"(overrides?: CallOverrides): Promise; + + depositToMerge( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + + "depositToMerge(address,uint256,address)"( + _l2Token: string, + _amount: BigNumberish, + _l2Receiver: string, + overrides?: Overrides + ): Promise; + finalizeDeposit( _l1Sender: string, _l2Receiver: string, @@ -465,29 +638,35 @@ export class IL2Bridge extends Contract { overrides?: PayableOverrides ): Promise; + initialize( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + + "initialize(address,bytes32,address)"( + _l1Bridge: string, + _l2TokenProxyBytecodeHash: BytesLike, + _governor: string, + overrides?: Overrides + ): Promise; + l1Bridge(overrides?: CallOverrides): Promise; "l1Bridge()"(overrides?: CallOverrides): Promise; - l1TokenAddress( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + l1TokenAddress(l2TokenAddress: string, overrides?: CallOverrides): Promise; - "l1TokenAddress(address)"( - _l2Token: string, - overrides?: CallOverrides - ): Promise; + "l1TokenAddress(address)"(l2TokenAddress: string, overrides?: CallOverrides): Promise; - l2TokenAddress( - _l1Token: string, - overrides?: CallOverrides - ): Promise; + l2TokenAddress(_l1Token: string, overrides?: CallOverrides): Promise; - "l2TokenAddress(address)"( - _l1Token: string, - overrides?: CallOverrides - ): Promise; + "l2TokenAddress(address)"(_l1Token: string, overrides?: CallOverrides): Promise; + + l2TokenBeacon(overrides?: CallOverrides): Promise; + + "l2TokenBeacon()"(overrides?: CallOverrides): Promise; withdraw( _l1Receiver: string, @@ -502,5 +681,19 @@ export class IL2Bridge extends Contract { _amount: BigNumberish, overrides?: Overrides ): Promise; + + withdrawFromMerge( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides + ): Promise; + + "withdrawFromMerge(address,address,uint256)"( + _l1Receiver: string, + _l2Token: string, + _amount: BigNumberish, + overrides?: Overrides + ): Promise; }; } diff --git a/zksync-web3-nova/typechain/IL2BridgeFactory.ts b/zksync-web3-nova/typechain/IL2BridgeFactory.ts index 5de84770..93a0bd1c 100644 --- a/zksync-web3-nova/typechain/IL2BridgeFactory.ts +++ b/zksync-web3-nova/typechain/IL2BridgeFactory.ts @@ -147,4 +147,27 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "address", + name: "_l1Receiver", + type: "address", + }, + { + internalType: "address", + name: "_l2Token", + type: "address", + }, + { + internalType: "uint256", + name: "_amount", + type: "uint256", + }, + ], + name: "withdrawFromMerge", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, ]; From acc4c7ada674494b08eb088d96f1107a4db9b6cb Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Mon, 15 Apr 2024 22:50:30 +0800 Subject: [PATCH 02/13] update ui fir withdraw merge token --- .../common/input/TransactionWithdraw.vue | 2 +- views/transactions/Withdraw.vue | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/components/common/input/TransactionWithdraw.vue b/components/common/input/TransactionWithdraw.vue index 86a9c918..a108c1a9 100644 --- a/components/common/input/TransactionWithdraw.vue +++ b/components/common/input/TransactionWithdraw.vue @@ -57,7 +57,7 @@ Input amount exceeds the merge limit. - The input amount exceeds the USDC.Arbitrum amount locked in the merge token contract. Consider withdrawing to another network or reducing the input. + The input amount exceeds the {{ selectedToken.symbol }}.{{ selectedNetwork.l1Network?.name }} amount locked in the merge token contract. Consider withdrawing to another network or reducing the input. Max amount is diff --git a/views/transactions/Withdraw.vue b/views/transactions/Withdraw.vue index 6fdbb7ab..7282496a 100644 --- a/views/transactions/Withdraw.vue +++ b/views/transactions/Withdraw.vue @@ -217,8 +217,12 @@ - - Fee estimation error: {{ feeError.message }} + + Fee estimation error: {{ feeError.message }} @@ -253,8 +257,9 @@ - - + + + Withdrawal of Merged {{ selectedToken?.symbol }} to {{ selectedNetwork.l1Network?.name }} @@ -267,6 +272,9 @@ >token merge contract . Therefore, the available withdrawal amount for merged USDC to Linea is {{ mergeTokenLockedBalance }} + + Note: All LRT points will continue to be calculated after you request a withdrawal. They will appear in the next few days in dashboard due to the data synchronization process. + @@ -274,6 +282,7 @@ + { query: { network: eraNetwork.value.key }, }).href ); + setTokenAllowance() waitForCompletion(transactionInfo.value) .then(async (completedTransaction) => { transactionInfo.value = completedTransaction; @@ -1104,6 +1114,13 @@ onBeforeUnmount(() => { color: #0bc48f; } } +.warnNote { + color: #f29914; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: normal; +} .warnBox { display: inline-flex; padding: 0 0 16px 0; From b9068ff9761db08c2945a30f7f5688a6df456a5f Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Mon, 15 Apr 2024 23:13:37 +0800 Subject: [PATCH 03/13] update estimate withdraw left time --- components/common/Timer.vue | 11 ++++-- .../transaction/TransactionProgress.vue | 36 +++++++++++++++++-- views/transactions/WithdrawalSubmitted.vue | 1 + 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/components/common/Timer.vue b/components/common/Timer.vue index 1e063c3a..95021ecc 100644 --- a/components/common/Timer.vue +++ b/components/common/Timer.vue @@ -16,6 +16,10 @@ const props = defineProps({ type: String, default: "hh:mm:ss", // 'hh:mm:ss' for "00:00:00", 'human-readable' for "1 hour 30 minutes" }, + onlyDays: { + type: Boolean, + default: false, + }, }); const emit = defineEmits<{ (eventName: "finish"): void; @@ -37,13 +41,16 @@ watch( let intervalId: ReturnType | undefined = undefined; -const formatTimeDiff = (diff: number): string => { +const formatTimeDiff = (diff: number, onlyDays = false): string => { const day = Math.floor(diff / (1000 * 60 * 60 * 24)); const hours = Math.floor(diff % (1000 * 60 * 60 * 24) / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((diff % (1000 * 60)) / 1000); if (props.format === "human-readable") { + if (onlyDays) { + return `~ ${day} day${day !== 1 ? "s" : ""}` + } let formattedString = ""; if (hours > 0) formattedString += `${day} day ${hours} hour${hours > 1 ? "s" : ""} `; if (minutes > 0) formattedString += `${minutes} minute${minutes > 1 ? "s" : ""} `; @@ -61,7 +68,7 @@ const updateTimer = () => { const currentTime = new Date().getTime(); const targetTime = new Date(props.futureDate).getTime(); diff.value = Math.max(targetTime - currentTime, 0); - timer.value = formatTimeDiff(diff.value); + timer.value = formatTimeDiff(diff.value, props.onlyDays); if (diff.value === 0) { clearInterval(intervalId); diff --git a/components/transaction/TransactionProgress.vue b/components/transaction/TransactionProgress.vue index cc0b7bc1..2c735136 100644 --- a/components/transaction/TransactionProgress.vue +++ b/components/transaction/TransactionProgress.vue @@ -89,12 +89,18 @@ - Time: - + Time{{ !isWithdraw ? "" : " left" }}: + Funds should arrive soon! - {{ timer }} left + {{ timer }} {{ isWithdraw ? "" : "left" }} + + + + The estimated time remaining may differ from the actual time remaining. + + @@ -162,6 +168,10 @@ const props = defineProps({ animationState: { type: String as PropType, }, + isWithdraw: { + type: Boolean, + default: false, + } }); const isSameAddress = computed(() => props.fromAddress === props.toAddress); @@ -220,4 +230,24 @@ const isSameAddressDifferentDestination = computed( } } } +.showTip:hover { + .tooltip { + display: block; + z-index: 100; + } +} +.tooltip { + display: none; + position: absolute; + padding: 12px 20px 12px 24px; + bottom: 105%; + width: 30rem; + left: -15rem; + border-radius: 8px; + background: #1f2127; + color: #ffffff; + font-size: 14px; + font-weight: 400; + transition: all .5s linear; +} diff --git a/views/transactions/WithdrawalSubmitted.vue b/views/transactions/WithdrawalSubmitted.vue index 66b07f95..b79ccd9b 100644 --- a/views/transactions/WithdrawalSubmitted.vue +++ b/views/transactions/WithdrawalSubmitted.vue @@ -52,6 +52,7 @@ :expected-complete-timestamp=" withdrawalFinalizationAvailable ? undefined : transaction.info.expectedCompleteTimestamp " + :is-withdraw="true" > From 1ed296b78f49db9a8fc34c69971aa4eeee291aa5 Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Tue, 16 Apr 2024 11:17:21 +0800 Subject: [PATCH 04/13] update approve for merge token --- views/transactions/Withdraw.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/views/transactions/Withdraw.vue b/views/transactions/Withdraw.vue index 7282496a..266cef9c 100644 --- a/views/transactions/Withdraw.vue +++ b/views/transactions/Withdraw.vue @@ -841,7 +841,7 @@ const { resetSetAllowance, } = useAllowance( computed(() => account.value.address), - computed(() => mergeTokenL2Address.value), + computed(() => selectedToken.value?.address), async () => (await providerStore.requestProvider().getDefaultBridgeAddresses()).erc20L2, getWallet, getPublicClient @@ -1057,7 +1057,8 @@ const makeTransaction = async () => { query: { network: eraNetwork.value.key }, }).href ); - setTokenAllowance() + await new Promise((resolve) => setTimeout(resolve, 2000)); // Wait for balances to be updated on API side + await fetchBalances(true); waitForCompletion(transactionInfo.value) .then(async (completedTransaction) => { transactionInfo.value = completedTransaction; From 6dd41669e402bad241910e3496be489b0f6626e8 Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Tue, 16 Apr 2024 11:31:51 +0800 Subject: [PATCH 05/13] update ui for withdraw merge token --- views/transactions/Withdraw.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/transactions/Withdraw.vue b/views/transactions/Withdraw.vue index 266cef9c..902726da 100644 --- a/views/transactions/Withdraw.vue +++ b/views/transactions/Withdraw.vue @@ -770,7 +770,7 @@ const { result: mergeTokenInfo, inProgress: mergeTokenInfoInProgress } = useMerg const mergeTokenWithdrawalLimitExceeds = computed(() => { try { - return totalComputeAmount.value.gt(mergeTokenInfo.value?.balance ?? 0n); + return isMergeTokenSelected.value && totalComputeAmount.value.gt(mergeTokenInfo.value?.balance ?? 0n); } catch (e) { // may throw exception when amount exceeds decimals return false; From 456cdce9b998eae228be37606ea12829e51a88f2 Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Tue, 16 Apr 2024 13:42:57 +0800 Subject: [PATCH 06/13] update ui for merge token allowance --- views/transactions/Withdraw.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/views/transactions/Withdraw.vue b/views/transactions/Withdraw.vue index 902726da..bdd007a6 100644 --- a/views/transactions/Withdraw.vue +++ b/views/transactions/Withdraw.vue @@ -286,14 +286,14 @@ {{ selectedToken?.symbol }} allowance approved @@ -327,10 +327,10 @@ - Before depositing you need to give our deposit permission to spend specified amount of + Before withdrawing you need to give our permission to spend specified amount of {{ selectedToken?.symbol }}. You can deposit up to + >You can withdraw up to {{ parseTokenAmount(allowance!, selectedToken!.decimals) }} @@ -352,7 +352,7 @@ - + Date: Tue, 16 Apr 2024 13:47:38 +0800 Subject: [PATCH 07/13] update ui for merge token allowance --- views/transactions/Withdraw.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/transactions/Withdraw.vue b/views/transactions/Withdraw.vue index bdd007a6..3fa79014 100644 --- a/views/transactions/Withdraw.vue +++ b/views/transactions/Withdraw.vue @@ -265,13 +265,13 @@ Please be aware that there are currently {{ mergeTokenLockedBalance }} {{ selectedToken?.symbol }}.{{ - selectedNetwork.l1Network?.name + selectedNetwork.l1Network?.name.split(' ')[0] }} tokens locked in the token merge contract - . Therefore, the available withdrawal amount for merged USDC to Linea is {{ mergeTokenLockedBalance }} + . Therefore, the available withdrawal amount for merged USDC to {{ selectedNetwork.l1Network?.name }} is {{ mergeTokenLockedBalance }} Note: All LRT points will continue to be calculated after you request a withdrawal. They will appear in the next few days in dashboard due to the data synchronization process. From fc37521609af5ce5ff14b7153e51e12a4fcc8a93 Mon Sep 17 00:00:00 2001 From: haymond-ZK Date: Tue, 16 Apr 2024 14:03:18 +0800 Subject: [PATCH 08/13] fix: Fixing the issue of incorrect chain display in the withdraw feature --- components/transaction/TransferLineItem.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/components/transaction/TransferLineItem.vue b/components/transaction/TransferLineItem.vue index 0e0cfcc3..9b1faff2 100644 --- a/components/transaction/TransferLineItem.vue +++ b/components/transaction/TransferLineItem.vue @@ -169,7 +169,15 @@ const getl1NetworkName = () => { from: eraNetwork.value.name, to: eraNetwork.value.name, }; - } else { + } else if (type === "withdrawal") { + const newNetwork = zkSyncNetworks.find( + (item) => item.key && item.key.toLowerCase() === props.transfer.token?.networkKey?.toLowerCase() + ); + return { + from: newNetwork?.l1Network?.name, + to: newNetwork?.l1Network?.name, + }; + } else { return { from: getNetworkInfo().l1Network?.name, to: getNetworkInfo().l1Network?.name, From ce7e4bfaab210eeda8187fafecd660edbd0f4f8c Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Tue, 16 Apr 2024 15:19:40 +0800 Subject: [PATCH 09/13] update switch chain for binance --- components/transaction/EthereumTransactionFooter.vue | 3 +++ components/transaction/TransactionFooter.vue | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/components/transaction/EthereumTransactionFooter.vue b/components/transaction/EthereumTransactionFooter.vue index 13418fff..16fbae51 100644 --- a/components/transaction/EthereumTransactionFooter.vue +++ b/components/transaction/EthereumTransactionFooter.vue @@ -62,6 +62,9 @@ Change wallet network to {{ l1Network.name }} + + If you're using the Binance Web3 Wallet, please update it to the newest version. + diff --git a/components/transaction/TransactionFooter.vue b/components/transaction/TransactionFooter.vue index d51ac446..1c0f61b9 100644 --- a/components/transaction/TransactionFooter.vue +++ b/components/transaction/TransactionFooter.vue @@ -21,7 +21,7 @@ Change wallet network to {{ eraNetwork.name }} + + If you're using the Binance Web3 Wallet, please update it to the newest version. + + The current version of your {{ walletName }} wallet may not support {{ eraNetwork.name }} From be7a0847bd8762fdcbf3e57c0aed214d77e366d8 Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Tue, 16 Apr 2024 18:29:52 +0800 Subject: [PATCH 10/13] update binnace wallet display name --- package-lock.json | 183 ++++++++++++++++++++++------------------------ package.json | 2 +- store/onboard.ts | 4 + 3 files changed, 92 insertions(+), 97 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1123cad6..d66d794b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@vueuse/router": "^10.1.2", "@wagmi/connectors": "^4.1.19", "@wagmi/core": "^2.6.10", - "@web3modal/wagmi": "^4.1.2", + "@web3modal/wagmi": "^4.1.8", "chai": "^4.3.4", "crypto-js": "^4.1.1", "dotenv": "^16.0.3", @@ -8042,85 +8042,89 @@ } }, "node_modules/@web3modal/common": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/common/-/common-4.1.2.tgz", - "integrity": "sha512-qo/mpvCgREgwR8Fb3FuBKzh5GFQWHWDoX2cJfrDfFtO/iVVLxd8EdiOfofL6fef2hr+xOt/nk0w+1by1yuMdnA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/common/-/common-4.1.8.tgz", + "integrity": "sha512-3a1FewW9Y4dvW9rRa/FpmoSyUUk/AY5Ld6AAqeyoW0LK3lVF3wVdIunYn1V2R7uXzj8rV71V/FesinVbSWakig==", "dependencies": { + "bignumber.js": "9.1.2", "dayjs": "1.11.10" } }, "node_modules/@web3modal/core": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/core/-/core-4.1.2.tgz", - "integrity": "sha512-G/qDizkOQ1NDwfgsVjrjDgnSA5RCruJHzeQ1oEAEsz55+5g38I06tW59EWLIgdxhXr9jtgvM2miazGFJR+Lx+w==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/core/-/core-4.1.8.tgz", + "integrity": "sha512-/x5RnGlr8iEBxmMFvZy+Gk02ripRnGV4i4CnbdPJUhXRTJeJbIp9QeTl2kaSDXQox6j82yUFUagww9MDxw/6ug==", "dependencies": { - "@web3modal/common": "4.1.2", - "@web3modal/wallet": "4.1.2", + "@web3modal/common": "4.1.8", + "@web3modal/wallet": "4.1.8", "valtio": "1.11.2" } }, "node_modules/@web3modal/polyfills": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/polyfills/-/polyfills-4.1.2.tgz", - "integrity": "sha512-J+rRgwITAuu4r/xVrcHWuRReFEmBkWHMNLXqYJQUCxL/0mbjMJ+ZJnJVfWWfIV9p3h+zUWEX0H7UzhwJNDjcTg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/polyfills/-/polyfills-4.1.8.tgz", + "integrity": "sha512-hbxBCQORC/Iwb+mJIEmAATByuotJ5/Jj4MRxePMnlsPf/T7U/Ng96Ikv+6xf0acFJbRVHL29fpztNmAnOysldA==", "dependencies": { "buffer": "6.0.3" } }, "node_modules/@web3modal/scaffold": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/scaffold/-/scaffold-4.1.2.tgz", - "integrity": "sha512-P2TxuxRR74kMjJ1bek+0bpIzHVHhPq2IHQfJw8GM7Iux302s7xcJCReVhXH+CthXjQefsEqJoUMmTFPZLc5HWQ==", - "dependencies": { - "@web3modal/common": "4.1.2", - "@web3modal/core": "4.1.2", - "@web3modal/ui": "4.1.2", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/scaffold/-/scaffold-4.1.8.tgz", + "integrity": "sha512-OS5IhEWMZqBnhu4zwAIEtjS6U5VNB5j9qJh83ijgsctQ+lRrRFeP+27oplisxLcNZDHa3Ucjpa43bQ6Rn+w32Q==", + "dependencies": { + "@web3modal/common": "4.1.8", + "@web3modal/core": "4.1.8", + "@web3modal/siwe": "4.1.8", + "@web3modal/ui": "4.1.8", + "@web3modal/wallet": "4.1.8", "lit": "3.1.0" - }, - "optionalDependencies": { - "@web3modal/siwe": "4.1.2" - }, - "peerDependencies": { - "@web3modal/siwe": "4.1.2", - "@web3modal/wallet": "4.1.2" - }, - "peerDependenciesMeta": { - "@web3modal/siwe": { - "optional": true - } } }, "node_modules/@web3modal/scaffold-react": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/scaffold-react/-/scaffold-react-4.1.2.tgz", - "integrity": "sha512-BJT7DVFvGT7k6aFBFkl7drMOxhcNY9IyWswFTygobDb7Uyl2dyd04HSsD1lQAmi06G0CEsE/l08rDxJW/76QKg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/scaffold-react/-/scaffold-react-4.1.8.tgz", + "integrity": "sha512-racr0h3Y+JlE1CKgTrcNySAiK77/5CO7JTLyzeF6CEQmkALw3Zo/0yjVJFnN/q6InpIuOF3v/Il75YPEM6y9CQ==", "dependencies": { - "@web3modal/scaffold": "4.1.2" + "@web3modal/scaffold": "4.1.8" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, "node_modules/@web3modal/scaffold-utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/scaffold-utils/-/scaffold-utils-4.1.2.tgz", - "integrity": "sha512-BHJtakPIJLwCCcoPRdHAB1vZihseVpdvPSDxYHYLMBqIEF1w/aao0w5HxuLh2G5nGyHN5tgU0GnUxXIRSVGadA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/scaffold-utils/-/scaffold-utils-4.1.8.tgz", + "integrity": "sha512-J0Qz5sJd2TxhLLzEV7k+U5Vu1/B3PxFyg01dFe2hfAW6mvUPC/Bpfvhkds9jh68PAXpI7Dq4XPZ7CXx1519nBg==", "dependencies": { - "@web3modal/core": "4.1.2", - "@web3modal/polyfills": "4.1.2", + "@web3modal/core": "4.1.8", + "@web3modal/polyfills": "4.1.8", "valtio": "1.11.2" } }, "node_modules/@web3modal/scaffold-vue": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/scaffold-vue/-/scaffold-vue-4.1.2.tgz", - "integrity": "sha512-NBDSPzUsTy0RQDOv0cS0wjfBjz0g+IVYBwOsyxgGr9mDzAC70V9vIs9ZNY7ue1y6ZYl2dgdVbP4LiCeVaHBBxQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/scaffold-vue/-/scaffold-vue-4.1.8.tgz", + "integrity": "sha512-QeTDd0U0PnvmUf94brajqkDPgZanQLtkmvAf90Ma57mBMII8/5L6oLgVEFvZQit3V0SV+SeuKzfu/j4o/G1zkg==", "dependencies": { - "@web3modal/scaffold": "4.1.2" + "@web3modal/scaffold": "4.1.8" }, "peerDependencies": { "vue": ">=3" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } } }, "node_modules/@web3modal/scaffold/node_modules/@lit/reactive-element": { @@ -8142,9 +8146,9 @@ } }, "node_modules/@web3modal/scaffold/node_modules/lit-element": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", - "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", + "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", @@ -8152,21 +8156,20 @@ } }, "node_modules/@web3modal/scaffold/node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", + "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", "dependencies": { "@types/trusted-types": "^2.0.2" } }, "node_modules/@web3modal/siwe": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/siwe/-/siwe-4.1.2.tgz", - "integrity": "sha512-MHEy7EM5Gi/9IQ7FbipRO0F7I62uVmYjo+cEohAsz++Rz2ySy46FO0XetsgpO94R8Jmi5UMUCVq3LFhIeeacHA==", - "optional": true, + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/siwe/-/siwe-4.1.8.tgz", + "integrity": "sha512-XwZWRypc1l297n5CvjM7vggDxP+S9r1PKi4vKWAVHVjiJ28+K3dofsQ+EQ/0jfY+DrSWJhnKYZClKN8MbD93GA==", "dependencies": { - "@web3modal/core": "4.1.2", - "@web3modal/scaffold-utils": "4.1.2", + "@web3modal/core": "4.1.8", + "@web3modal/scaffold-utils": "4.1.8", "lit": "3.1.0", "valtio": "1.11.2" } @@ -8175,7 +8178,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", - "optional": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0" } @@ -8184,7 +8186,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", - "optional": true, "dependencies": { "@lit/reactive-element": "^2.0.0", "lit-element": "^4.0.0", @@ -8192,10 +8193,9 @@ } }, "node_modules/@web3modal/siwe/node_modules/lit-element": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", - "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", - "optional": true, + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", + "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", @@ -8203,18 +8203,17 @@ } }, "node_modules/@web3modal/siwe/node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", - "optional": true, + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", + "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", "dependencies": { "@types/trusted-types": "^2.0.2" } }, "node_modules/@web3modal/ui": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/ui/-/ui-4.1.2.tgz", - "integrity": "sha512-LxHGax0zhHLf4YBJe/UCpPGwJ+L8CTEaSaRapc7J1lz/QK3ObVj3vBkvaznjo1B0A2uo/p2T87YC2IgfywWF7w==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/ui/-/ui-4.1.8.tgz", + "integrity": "sha512-QM76fsQRMD2EQ6RPNC6bD+IHPt/blfLscDY/S0UC+xaUbM5jrl4Dtg+XZdrATiwrRPZVDJD7UlIoIXGQ2iQrnQ==", "dependencies": { "lit": "3.1.0", "qrcode": "1.5.3" @@ -8239,9 +8238,9 @@ } }, "node_modules/@web3modal/ui/node_modules/lit-element": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", - "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", + "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", @@ -8249,43 +8248,34 @@ } }, "node_modules/@web3modal/ui/node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", + "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", "dependencies": { "@types/trusted-types": "^2.0.2" } }, "node_modules/@web3modal/wagmi": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/wagmi/-/wagmi-4.1.2.tgz", - "integrity": "sha512-kG11puiZu+8CAvazQwsM9VJaaspQ34CtYcapeLE0cm6cX2t4O/aoiNNNCtQDXgbUnLXBX6meFf16bAghA9Od2A==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/wagmi/-/wagmi-4.1.8.tgz", + "integrity": "sha512-jpjl/qGjxY/nqkZhLgsh0R+x59cqX/RsceS+EReyWVWzlAeObGlIVPp5BMrx68QGhyjhsCVkfF7Iupcjjmvmzg==", "dependencies": { - "@web3modal/polyfills": "4.1.2", - "@web3modal/scaffold": "4.1.2", - "@web3modal/scaffold-react": "4.1.2", - "@web3modal/scaffold-utils": "4.1.2", - "@web3modal/scaffold-vue": "4.1.2" - }, - "optionalDependencies": { - "@web3modal/siwe": "4.1.2", - "react": ">=17", - "react-dom": ">=17", - "vue": ">=3" + "@web3modal/polyfills": "4.1.8", + "@web3modal/scaffold": "4.1.8", + "@web3modal/scaffold-react": "4.1.8", + "@web3modal/scaffold-utils": "4.1.8", + "@web3modal/scaffold-vue": "4.1.8", + "@web3modal/siwe": "4.1.8" }, "peerDependencies": { "@wagmi/connectors": ">=4.0.0", "@wagmi/core": ">=2.0.0", - "@web3modal/siwe": "4.1.2", "react": ">=17", "react-dom": ">=17", "viem": ">=2.0.0", "vue": ">=3" }, "peerDependenciesMeta": { - "@web3modal/siwe": { - "optional": true - }, "react": { "optional": true }, @@ -8298,10 +8288,11 @@ } }, "node_modules/@web3modal/wallet": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@web3modal/wallet/-/wallet-4.1.2.tgz", - "integrity": "sha512-T6/iPNkdlrFgpIniTdxcE89iYmjnxcHX3aF0WOFHqjYdgdRYqZtfoKbHIIX8KwEmXBoG6/WctDJbMAqSzln3zA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@web3modal/wallet/-/wallet-4.1.8.tgz", + "integrity": "sha512-C4u/HxxhpRKBcZKE8i9bFbbQHjvz+wsny1I+qdI+duNxaTLvyI/EB63roIgJoLq9okZJlLOoP56RMEJld+tRxw==", "dependencies": { + "@web3modal/polyfills": "4.1.8", "zod": "3.22.4" } }, diff --git a/package.json b/package.json index 9b4dbece..79d2da13 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@vueuse/router": "^10.1.2", "@wagmi/connectors": "^4.1.19", "@wagmi/core": "^2.6.10", - "@web3modal/wagmi": "^4.1.2", + "@web3modal/wagmi": "^4.1.8", "chai": "^4.3.4", "crypto-js": "^4.1.1", "dotenv": "^16.0.3", diff --git a/store/onboard.ts b/store/onboard.ts index 401eecb9..873a05b1 100644 --- a/store/onboard.ts +++ b/store/onboard.ts @@ -143,6 +143,10 @@ export const useOnboardStore = defineStore("onboard", () => { console.log("name--------------->", name); } + if (walletName.value.includes("Binance")) { + walletName.value = "Binance Web3 Wallet"; + } + if (walletName.value && connector) { const isWalletDisabled = !!disabledWallets.find( (wallet) => wallet.walletName === walletName.value && wallet.type === connector?.type From f3c69225dde11c717bc30845f221442e078d2e75 Mon Sep 17 00:00:00 2001 From: MickWang <1244134672@qq.com> Date: Wed, 17 Apr 2024 11:08:53 +0800 Subject: [PATCH 11/13] fix change network text issue --- components/transaction/TransactionFooter.vue | 6 +++--- store/onboard.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/transaction/TransactionFooter.vue b/components/transaction/TransactionFooter.vue index 1c0f61b9..4fa6180a 100644 --- a/components/transaction/TransactionFooter.vue +++ b/components/transaction/TransactionFooter.vue @@ -31,6 +31,9 @@ > Change wallet network to {{ eraNetwork.name }} + + Change network manually to {{ eraNetwork.name }} in your {{ walletName }} wallet + If you're using the Binance Web3 Wallet, please update it to the newest version. @@ -38,9 +41,6 @@ The current version of your {{ walletName }} wallet may not support {{ eraNetwork.name }} - - Change network manually to {{ eraNetwork.name }} in your {{ walletName }} wallet -
- You will be able to claim your withdrawal only after a {{WITHDRAWAL_DELAY_DAYS}}-day withdrawal delay. + You will be able to claim your withdrawal only after a {{ WITHDRAWAL_DELAY_DAYS }}-day withdrawal delay.
- You will receive funds only after a {{WITHDRAWAL_DELAY_DAYS}}-day withdrawal delay. + You will receive funds only after a {{ WITHDRAWAL_DELAY_DAYS }}-day withdrawal delay.
+ Note: All LRT points will continue to be calculated after you request a withdrawal. They will appear in the next few days in dashboard due to the data synchronization process. +
Note: All LRT points will continue to be calculated after you request a withdrawal. They will appear in the next few days in dashboard due to the data synchronization process.