From e276306dd6761049b66035aaed2230f19d7e7933 Mon Sep 17 00:00:00 2001 From: tunghp2002 Date: Fri, 19 Jun 2026 17:17:11 +0700 Subject: [PATCH 1/3] [Issue-#5002] feat: remove polygon zkevm logic --- package.json | 2 +- packages/extension-base/package.json | 2 +- .../src/core/substrate/xcm-parser.ts | 2 +- .../koni/api/contract-handler/utils/index.ts | 3 -- .../src/koni/background/handlers/Extension.ts | 14 ++++++- .../balance-service/transfer/xcm/index.ts | 2 +- .../transfer/xcm/polygonBridge.ts | 9 +---- .../src/services/fee-service/utils/index.ts | 6 +-- .../utils/polygon.ts | 6 ++- packages/extension-koni-ui/package.json | 2 +- .../Settings/Notifications/Notification.tsx | 40 +++++++++++-------- packages/extension-web-ui/package.json | 2 +- yarn.lock | 14 +++---- 13 files changed, 57 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index 35edc35f5ab..7e350eb641b 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "@polkadot/util": "^13.5.3", "@polkadot/util-crypto": "^13.5.3", "@polkadot/x-global": "^13.5.3", - "@subwallet/chain-list": "0.2.127", + "@subwallet/chain-list": "0.2.128-beta.0-pr-696-d0f5c200", "@subwallet/keyring": "0.1.14", "@subwallet/react-ui": "5.1.2-b79", "@subwallet/ui-keyring": "0.1.14", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 5c0af9ede28..e701425e824 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -57,7 +57,7 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet-monorepos/subwallet-services-sdk": "0.1.17-beta.2", - "@subwallet/chain-list": "0.2.127", + "@subwallet/chain-list": "0.2.128-beta.0-pr-696-d0f5c200", "@subwallet/extension-base": "^1.3.79-1", "@subwallet/extension-chains": "^1.3.79-1", "@subwallet/extension-dapp": "^1.3.79-1", diff --git a/packages/extension-base/src/core/substrate/xcm-parser.ts b/packages/extension-base/src/core/substrate/xcm-parser.ts index ad99f776bef..b361dbd19b1 100644 --- a/packages/extension-base/src/core/substrate/xcm-parser.ts +++ b/packages/extension-base/src/core/substrate/xcm-parser.ts @@ -43,7 +43,7 @@ function getAvailBridgeWarning (): string { } function getPolygonBridgeWarning (originChainInfo: _ChainInfo): string { - if (originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM || originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { + if (originChainInfo.slug === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { return 'Cross-chain transfer of this token may take up to 40 minutes. Do you still want to continue?'; } else { return 'Cross-chain transfer of this token may take up to 3 hours, and you’ll need to manually claim the funds on the destination network to complete the transfer. Do you still want to continue?'; diff --git a/packages/extension-base/src/koni/api/contract-handler/utils/index.ts b/packages/extension-base/src/koni/api/contract-handler/utils/index.ts index 85fdcbaf139..9f0d1918be0 100644 --- a/packages/extension-base/src/koni/api/contract-handler/utils/index.ts +++ b/packages/extension-base/src/koni/api/contract-handler/utils/index.ts @@ -64,14 +64,11 @@ export function isAvailBridgeGatewayContract (contractAddress: _Address) { return [AVAILBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS, AVAILBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS].includes(contractAddress); } -const POLYGONBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS = '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; const POLYGONBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS = '0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582'; export function getPolygonBridgeContract (chain: string): string { if (chain === 'polygonzkEvm_cardona' || chain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { return POLYGONBRIDGE_GATEWAY_SEPOLIA_CONTRACT_ADDRESS; - } else if (chain === 'polygonZkEvm' || chain === COMMON_CHAIN_SLUGS.ETHEREUM) { - return POLYGONBRIDGE_GATEWAY_ETHEREUM_CONTRACT_ADDRESS; } throw new Error('Invalid chain'); diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index 2997fd62038..b5e00e93488 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -3,6 +3,7 @@ import { Common } from '@ethereumjs/common'; import { LegacyTransaction } from '@ethereumjs/tx'; +import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list'; import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types'; import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError'; import { withErrorLog } from '@subwallet/extension-base/background/handlers/helpers'; @@ -5753,6 +5754,10 @@ export default class KoniExtension { } private async getIsClaimedPolygonBridge (data: RequestIsClaimedPolygonBridge) { + if (data.chainslug !== COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { + throw new Error('Polygon zkEVM Mainnet Beta has sunset. Please use Polygon official Ethereum claim flow.'); + } + const evmApi = this.#koniState.getEvmApi(data.chainslug); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const isClaimed: boolean = await isClaimedPolygonBridge(data.chainslug, data.counter, data.sourceNetwork, evmApi); @@ -5766,13 +5771,18 @@ export default class KoniExtension { let transaction: SubmittableExtrinsic<'promise'> | TransactionConfig | null = null; - const evmApi = this.#koniState.getEvmApi(chain); const metadata = notification.metadata as ClaimPolygonBridgeNotificationMetadata; + + if (metadata.bridgeType !== 'POS' && chain !== COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { + throw new Error('Polygon zkEVM Mainnet Beta has sunset. Please use Polygon official Ethereum claim flow.'); + } + + const evmApi = this.#koniState.getEvmApi(chain); const feeInfo = await this.#koniState.feeService.subscribeChainFee(getId(), chain, 'evm') as EvmFeeInfo; if (metadata.bridgeType === 'POS') { transaction = await getClaimPosBridge(chain, notification, evmApi, feeInfo); - } else { + } else if (chain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) { transaction = await getClaimPolygonBridge(chain, notification, evmApi, feeInfo); } diff --git a/packages/extension-base/src/services/balance-service/transfer/xcm/index.ts b/packages/extension-base/src/services/balance-service/transfer/xcm/index.ts index e012a4e509d..985ae1ab7b8 100644 --- a/packages/extension-base/src/services/balance-service/transfer/xcm/index.ts +++ b/packages/extension-base/src/services/balance-service/transfer/xcm/index.ts @@ -116,7 +116,7 @@ export const createPolygonBridgeExtrinsic = async ({ destinationChain, const sourceChain = originChain.slug; const createExtrinsic = isPolygonBridgeXcm - ? (sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm') + ? sourceChain === 'polygonzkEvm_cardona' ? _createPolygonBridgeL2toL1Extrinsic : _createPolygonBridgeL1toL2Extrinsic : (sourceChain === 'polygon_amoy' || sourceChain === 'polygon') diff --git a/packages/extension-base/src/services/balance-service/transfer/xcm/polygonBridge.ts b/packages/extension-base/src/services/balance-service/transfer/xcm/polygonBridge.ts index 8f650cb8c0b..d9cec67f672 100644 --- a/packages/extension-base/src/services/balance-service/transfer/xcm/polygonBridge.ts +++ b/packages/extension-base/src/services/balance-service/transfer/xcm/polygonBridge.ts @@ -31,12 +31,10 @@ interface ClaimNotification { } export const POLYGON_PROOF_INDEXER = { - MAINNET: 'https://api-gateway.polygon.technology/api/v3/proof/mainnet/merkle-proof', TESTNET: 'https://api-gateway.polygon.technology/api/v3/proof/testnet/merkle-proof' }; export const POLYGON_GAS_INDEXER = { - MAINNET: 'https://gasstation.polygon.technology/zkevm', TESTNET: 'https://gasstation.polygon.technology/zkevm/cardona' }; @@ -102,8 +100,7 @@ export async function getClaimPolygonBridge (chainSlug: string, notification: _N const polygonBridgeContract = getWeb3Contract(polygonBridgeContractAddress, evmApi, _POLYGON_BRIDGE_ABI); const metadata = notification.metadata as ClaimPolygonBridgeNotificationMetadata; - const isTestnet = chainSlug === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA; - const proofDomain = isTestnet ? POLYGON_PROOF_INDEXER.TESTNET : POLYGON_PROOF_INDEXER.MAINNET; + const proofDomain = POLYGON_PROOF_INDEXER.TESTNET; const proofResponse = await fetch(`${proofDomain}?networkId=${metadata.sourceNetwork ?? ''}&depositCount=${metadata.counter ?? ''}`) .then((res) => res.json()) as ClaimNotification; @@ -143,10 +140,6 @@ export function _isPolygonChainBridge (srcChain: string, destChain: string): boo return true; } else if (srcChain === COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA && destChain === 'polygonzkEvm_cardona') { return true; - } else if (srcChain === 'polygonZkEvm' && destChain === COMMON_CHAIN_SLUGS.ETHEREUM) { - return true; - } else if (srcChain === COMMON_CHAIN_SLUGS.ETHEREUM && destChain === 'polygonZkEvm') { - return true; } return false; diff --git a/packages/extension-base/src/services/fee-service/utils/index.ts b/packages/extension-base/src/services/fee-service/utils/index.ts index 840d72ba501..7399476e270 100644 --- a/packages/extension-base/src/services/fee-service/utils/index.ts +++ b/packages/extension-base/src/services/fee-service/utils/index.ts @@ -162,10 +162,8 @@ export const calculateGasFeeParams = async (web3: _EvmApi, networkKey: string, u } try { - if (networkKey === 'polygonzkEvm_cardona' || networkKey === 'polygonZkEvm') { - const isTestnet = networkKey === 'polygonzkEvm_cardona'; - const gasDomain = isTestnet ? POLYGON_GAS_INDEXER.TESTNET : POLYGON_GAS_INDEXER.MAINNET; - const gasResponse = await fetch(`${gasDomain}`).then((res) => res.json()) as gasStation; + if (networkKey === 'polygonzkEvm_cardona') { + const gasResponse = await fetch(`${POLYGON_GAS_INDEXER.TESTNET}`).then((res) => res.json()) as gasStation; const gasPriceInWei = gasResponse.standard * 1e9 + 200000; return { diff --git a/packages/extension-base/src/services/inapp-notification-service/utils/polygon.ts b/packages/extension-base/src/services/inapp-notification-service/utils/polygon.ts index d904789d65a..9b0985843eb 100644 --- a/packages/extension-base/src/services/inapp-notification-service/utils/polygon.ts +++ b/packages/extension-base/src/services/inapp-notification-service/utils/polygon.ts @@ -80,6 +80,10 @@ export function getPolygonBridgeClaimDescription (amount: string, symbol: string } /* Description */ +function getPolygonBridgeNetworkIds (isTestnet: boolean): number[] { + return isTestnet ? [0, 1, -1] : [0, -1]; +} + export async function fetchPolygonBridgeTransactions (userAddress: string, isTestnet: boolean, pageSize = 500, page = 0) { const params = new URLSearchParams({ userAddress, @@ -87,7 +91,7 @@ export async function fetchPolygonBridgeTransactions (userAddress: string, isTes page: page.toString() }); - const networkIds = [0, 1, -1]; + const networkIds = getPolygonBridgeNetworkIds(isTestnet); networkIds.forEach((networkId) => { params.append('destinationNetworkIds', networkId.toString()); diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 99f4c8187c6..ca5a1d82063 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -34,7 +34,7 @@ "@polkadot/util-crypto": "^13.5.3", "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", - "@subwallet/chain-list": "0.2.127", + "@subwallet/chain-list": "0.2.128-beta.0-pr-696-d0f5c200", "@subwallet/extension-base": "^1.3.79-1", "@subwallet/extension-chains": "^1.3.79-1", "@subwallet/extension-dapp": "^1.3.79-1", diff --git a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx index a526751344d..b9b479f3dc7 100644 --- a/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx +++ b/packages/extension-koni-ui/src/Popup/Settings/Notifications/Notification.tsx @@ -15,7 +15,7 @@ import Search from '@subwallet/extension-koni-ui/components/Search'; import { BN_ZERO, CLAIM_BRIDGE_TRANSACTION, CLAIM_REWARD_TRANSACTION, DEFAULT_CLAIM_AVAIL_BRIDGE_PARAMS, DEFAULT_CLAIM_REWARD_PARAMS, DEFAULT_UN_STAKE_PARAMS, DEFAULT_WITHDRAW_PARAMS, NOTI_MULTISIG_PENDINGTX_ID, NOTIFICATION_DETAIL_MODAL, WITHDRAW_TRANSACTION } from '@subwallet/extension-koni-ui/constants'; import { DataContext } from '@subwallet/extension-koni-ui/contexts/DataContext'; import { WalletModalContext } from '@subwallet/extension-koni-ui/contexts/WalletModalContextProvider'; -import { useAlert, useDefaultNavigate, useGetChainAndExcludedTokenByCurrentAccountProxy, useSelector } from '@subwallet/extension-koni-ui/hooks'; +import { useAlert, useDefaultNavigate, useGetChainAndExcludedTokenByCurrentAccountProxy, useNotification, useSelector } from '@subwallet/extension-koni-ui/hooks'; import { useLocalStorage } from '@subwallet/extension-koni-ui/hooks/common/useLocalStorage'; import { enableChain, saveNotificationSetup } from '@subwallet/extension-koni-ui/messaging'; import { fetchInappNotifications, getIsClaimNotificationStatus, markAllReadNotification, switchReadNotificationStatus } from '@subwallet/extension-koni-ui/messaging/transaction/notification'; @@ -79,6 +79,7 @@ function Component ({ className = '' }: Props): React.ReactElement { const { t } = useTranslation(); const navigate = useNavigate(); const { goHome } = useDefaultNavigate(); + const notify = useNotification(); const { token } = useTheme() as Theme; const { alertProps, closeAlert, openAlert, updateAlertProps } = useAlert(alertModalId); const { allowedChains, excludedTokens } = useGetChainAndExcludedTokenByCurrentAccountProxy(); @@ -406,13 +407,18 @@ function Component ({ className = '' }: Props): React.ReactElement { showWarningModal('claimed'); } } catch (error) { - console.error(error); + notify({ + message: (error as Error).message, + type: 'error', + duration: 8 + }); } }; handleClaimPolygonBridge().catch((err) => { console.error('Error:', err); }); + break; } @@ -469,7 +475,7 @@ function Component ({ className = '' }: Props): React.ReactElement { }); } }; - }, [accounts, allowedChains, chainStateMap, currentAccountProxy, currentTimestampMs, earningRewards, excludedTokens, isAllAccount, isTrigger, navigate, openTransactionProcessModal, poolInfoMap, setClaimAvailBridgeStorage, setClaimRewardStorage, setNotiMultisigPendingTxStorage, setWithdrawStorage, showActiveChainModal, showWarningModal, yieldPositions]); + }, [accounts, allowedChains, chainStateMap, currentAccountProxy, currentTimestampMs, earningRewards, excludedTokens, isAllAccount, isTrigger, navigate, notify, openTransactionProcessModal, poolInfoMap, setClaimAvailBridgeStorage, setClaimRewardStorage, setNotiMultisigPendingTxStorage, setWithdrawStorage, showActiveChainModal, showWarningModal, yieldPositions]); const renderItem = useCallback((item: NotificationInfoItem) => { return ( @@ -617,19 +623,21 @@ function Component ({ className = '' }: Props): React.ReactElement { onSelect={onSelectFilterTab} selectedItem={selectedFilterTab} /> - {(selectedFilterTab === NotificationTab.UNREAD || selectedFilterTab === NotificationTab.ALL || selectedFilterTab === NotificationTab.MULTISIG) &&